Морской бой. Функция авторасстановки кораблей - C (СИ)
Формулировка задачи:
Всем привет. Пишу морской бой. Затупил на функции авторасстановки кораблей.
Ну во-первых какая-то громоздкая получилось она, при том что реализовано в ней только установка 4 палубника.
А проблема в том, что мне нужно, что бы генерировалось случайное число каждый цикл, а не каждую секунду, а то очень много времени занимает функция при выполнении. В общем вот ее код.
Впрочем рад был бы услышать критику и советы по улучшению кода. Спасибо за внимание!
void AutoArrangementShips(int Arr[][10])
{
int Str[4] = { 0, 0, 0, 0 }, Cln[4] = { 0, 0, 0, 0 }, Ships[4] = { 0, 0, 0, 0 };
int f;
register int i = 0;
/* Обработка */
while (i < FIELD) /* Обнуление поля боя */
{
register int j = 0;
while (j < FIELD)
{
Arr[i][j] = 0;
j++;
}
i++;
}
srand(f = time(NULL));
while (!Ships[3])
{
Str[0] = rand() % PERC_DELI + 1;
Cln[0] = rand() % PERC_DELI + 1;
if (Str[0] < 4) /* Продолжаем корабль "вниз" */
{
if (Cln[0] < 4) /* Продолжаем корабль "вправо" */
{
if (freePlOnBF(Str[0], Cln[0], S4, 'd', Arr)) /* Если можем продлить корабль вертикально вниз */
{
register int i;
for (i = 0; i < S4 - 1; i++) Str[i + 1] = Str[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
if (freePlOnBF(Str[0], Cln[0], S4, 'r', Arr)) /* Если можем продлить корабль вправо */
{
register int i;
for (i = 0; i < S4 - 1; i++) Cln[i + 1] = Cln[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
continue;
}
if (Cln[0] >= 4) /* Продолжаем корабль "влево" или "вправо" */
{
if (freePlOnBF(Str[0], Cln[0], S4, 'd', Arr)) /* Если можем продлить корабль вертикально вниз */
{
register int i;
for (i = 0; i < S4 - 1; i++) Str[i + 1] = Str[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
if (freePlOnBF(Str[0], Cln[0], S4, 'r', Arr) && Cln[0] <= 6) /* Если можем продлить корабль вправо */
{
register int i;
for (i = 0; i < S4 - 1; i++) Cln[i + 1] = Cln[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
if (freePlOnBF(Str[0], Cln[0], S4, 'l', Arr)) /* Если можем продлить корабль влево */
{
register int i;
for (i = 0; i < S4 - 1; i++) Cln[i + 1] = Cln[i] - 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
}
}
if (Str[0] >= 4) /* Продолжаем корабль "вниз" или "вверх" */
{
if (Cln[0] < 4) /* Продолжаем корабль "вправо" */
{
if (freePlOnBF(Str[0], Cln[0], S4, 'd', Arr) && Str[0] <= 6) /* Если можем продлить корабль вертикально вниз */
{
register int i;
for (i = 0; i < S4 - 1; i++) Str[i + 1] = Str[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
if (freePlOnBF(Str[0], Cln[0], S4, 'u', Arr)) /* Если можем продлить корабль вертикально вверх */
{
register int i;
for (i = 0; i < S4 - 1; i++) Str[i + 1] = Str[i] - 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
if (freePlOnBF(Str[0], Cln[0], S4, 'r', Arr)) /* Если можем продлить корабль вправо */
{
register int i;
for (i = 0; i < S4 - 1; i++) Cln[i + 1] = Cln[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
continue;
}
if (Cln[0] >= 4) /* Продолжаем корабль "влево" или "вправо" */
{
if (freePlOnBF(Str[0], Cln[0], S4, 'd', Arr) && Str[0] <= 6)
{
register int i;
for (i = 0; i < S4 - 1; i++) Str[i + 1] = Str[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
if (freePlOnBF(Str[0], Cln[0], S4, 'u', Arr)) /* Если можем продлить корабль вертикально вверх */
{
register int i;
for (i = 0; i < S4 - 1; i++) Str[i + 1] = Str[i] - 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
if (freePlOnBF(Str[0], Cln[0], S4, 'r', Arr) && Cln[0] <= 6)
{
register int i;
for (i = 0; i < S4 - 1; i++) Cln[i + 1] = Cln[i] + 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
else
if (freePlOnBF(Str[0], Cln[0], S4, 'l', Arr))
{
register int i;
for (i = 0; i < S4 - 1; i++) Cln[i + 1] = Cln[i] - 1;
if (SetShip(Str, Cln, Arr))
{
Ships[3] = 1;
break;
}
}
}
}
}
}
Стоит дополнить:
Функция SetShip устанавливает корабль и выставляет запретную зону вокруг него, чтобы рядом нельзя было поставить другие корабли.
Функция freePlOnBF проверяет можно ли поставить корабль от заданной точки - влево, вправо, вверх, вниз, в зависимости от переданного аргумента типа char.
В принципе могу кинуть и остальную часть кода, если будет необходимо...
Решение задачи: «Морской бой. Функция авторасстановки кораблей»
textual
Листинг программы
int OLD_RAND_VALUE = 0; - глобальное значение инициализируется 1 раз srand(OLD_RAND_VALUE); OLD_RAND_VALUE = rand(); и потом по новой: srand(OLD_RAND_VALUE); OLD_RAND_VALUE = rand();
Объяснение кода листинга программы
- В начале кода инициализируется глобальное значение OLD_RAND_VALUE равное 0. Это значение будет использоваться для генерации случайных чисел.
- Затем функция srand() вызывается с аргументом OLD_RAND_VALUE. Эта функция устанавливает начальное значение генератора случайных чисел на основе переданного ей значения.
- После этого вызывается функция rand(), которая возвращает случайное число.
- Полученное случайное число присваивается переменной OLD_RAND_VALUE.
- Этот процесс инициализации повторяется каждый раз при запуске программы.
- Значение OLD_RAND_VALUE используется для установки начального состояния генератора случайных чисел.
- Функция srand() вызывается снова с аргументом OLD_RAND_VALUE.
- И снова функция rand() вызывается для получения нового случайного числа.
- Это случайное число присваивается переменной OLD_RAND_VALUE.
- Этот процесс инициализации повторяется каждый раз при запуске программы.