Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Морской бой - Оптимизация

Ответить
Настройки темы
C/C++ - Морской бой - Оптимизация

Новый участник


Сообщения: 17
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте! У меня такой вопрос.. Как можно упростить данную часть? Данный блок проверяет смежные клетки на присутствие кораблей. Если корабли отсутствуют - новый корабль устанавливается.
Код: Выделить весь код
void set (player *human, int deck)
{
	int isset = 0;
	int e = 0; 
	int dir, x, y;

//Направлении
    enum direction
        {
            h = 0,
            v = 1
        };
//	srand(time(NULL));
    while (isset == 0)
    {
        dir = static_cast<direction>(rand()%2);
        x = rand()%10;
        y = rand()%10;

     	e = 0;     
  	switch (dir)
	{
		
		case 0:
	if (human->ships[x][y+deck-1] == 1)
	{
		if (human->ships[x-1][y-1] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|X      
			3| 2222    
			4|      
			*/
		}
		if (human->ships[x-1][y+deck] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|     X 
			3| 2222    
			4|      
			*/
		}
		if (human->ships[x+1][y-1] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|      
			3| 2222    
			4|X     
			*/
		}
		if (human->ships[x+1][y+deck] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|      
			3| 2222    
			4|     X 
			*/
		}

		if (human->ships[x][y-1] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|      
			3|X2222    
			4|      
			*/
		}
		if (human->ships[x][y+deck] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|      
			3| 2222X    
			4|      
			*/
		}
		for (int i = 0; i < deck; i++)
		{
			if (human->ships[x-1][y+i] == 2)
			{
				e = 1;
				/*
				  345678
				 #-------
				2| XXXX     
				3| 2222    
				4|      
				*/
			}
			if (human->ships[x+1][y+i] == 2)
			{
				e = 1;
				/*
				  345678
				 #-------
				2|      
				3| 2222    
				4| XXXX     
				*/
			}
		}

	if (e == 0)
			{
				for (int i = 0; i < deck; i++)
				{
					human->ships[x][y+i] = 2; // размещаем корабль в массиве ships
				}
				isset = 1;
			}
		}
			break;
	case 1:

	if (human->ships[x+deck-1][y] == 1)
	{
		if (human->ships[x-1][y-1] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|X      
			3| 2    
			4| 2   
			5| 2     
			6| 2    
			7|     
			*/
		}
		if (human->ships[x-1][y+1] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|  X    
			3| 2    
			4| 2   
			5| 2     
			6| 2    
			7| X    
			*/
		}
		if (human->ships[x+deck][y-1] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|      
			3| 2    
			4| 2   
			5| 2     
			6| 2    
			7|X     
			*/
		}
		if (human->ships[x+deck][y+1] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|      
			3| 2    
			4| 2   
			5| 2     
			6| 2    
			7|  X   
			*/
		}

		if (human->ships[x-1][y] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2| X     
			3| 2    
			4| 2   
			5| 2     
			6| 2    
			7|     
			*/
		}
		if (human->ships[x+deck][y] == 2)
		{
			e = 1;
			/*
			  345678
			 #-------
			2|      
			3| 2    
			4| 2   
			5| 2     
			6| 2    
			7| X    
			*/
		}
		for (int i = 0; i < deck; i++)
		{
			if (human->ships[x+i][y-1] == 2)
			{
				e = 1;
				/*
				  345678
				 #-------
				2|      
				3|X2    
				4|X2   
				5|X2     
				6|X2    
				7|     
				*/
			}
			if (human->ships[x+i][y+1] == 2)
			{
				e = 1;
				/*
				  345678
				 #-------
				2|      
				3| 2X    
				4| 2X   
				5| 2X     
				6| 2X    
				7|     
				*/
			}
		}
		if (e == 0)
		{
			for (int i = 0; i < deck; i++)
			{
				human->ships[x+i][y] = 2;
			}
			isset = 1;
		}
	}
	break;
	}//switch
    }// while
}//set

Отправлено: 14:08, 14-11-2012

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Выдели блок "корабль+1 клетка по периметру", да проверь циклом на отсутствие в нем кораблей/мин.
В С++ массивы начинаются с нуля. Сделай поле от 0 до 11, рабочее от 1 до 10.
Чуть больше затрат, зато единая функция проверки кораблей, стоящих на линии игрового поля.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:25, 14-11-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Морской бой - Оптимизация

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Сетевой морской бой для Windows 7/8 Morpheus Игры 3 15-07-2012 12:34
Дата-центр Google будет охлаждаться морской водой OSZone News Новости информационных технологий 2 27-05-2011 10:12
Установка - оптимизация alik777 Microsoft Windows 2000/XP 1 24-07-2010 22:58
Службы - Оптимизация Malfatto Microsoft Windows Vista 2 06-09-2008 15:08
Оптимизация pashka-88 Хочу все знать 2 30-10-2005 20:49




 
Переход