Войти

Показать полную графическую версию : Морской бой - Оптимизация


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

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

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




© OSzone.net 2001-2012