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

Ответить
Аватара пользователя
SAU-trade

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

Сообщение SAU-trade »

Здравствуйте! У меня такой вопрос.. Как можно упростить данную часть? Данный блок проверяет смежные клетки на присутствие кораблей. Если корабли отсутствуют - новый корабль устанавливается.



Код:

Код: Выделить всё

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(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
Аватара пользователя
lxa85

Re: C/C++ - Морской бой - Оптимизация

Сообщение lxa85 »

Выдели блок "корабль+1 клетка по периметру", да проверь циклом на отсутствие в нем кораблей/мин.

В С++ массивы начинаются с нуля. Сделай поле от 0 до 11, рабочее от 1 до 10.

Чуть больше затрат, зато единая функция проверки кораблей, стоящих на линии игрового поля.
Ответить

Вернуться в «Программирование и базы данных»