Морской бой. Функция авторасстановки кораблей - 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.
- Этот процесс инициализации повторяется каждый раз при запуске программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д