Морской бой. Функция авторасстановки кораблей - 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();

Объяснение кода листинга программы

  1. В начале кода инициализируется глобальное значение OLD_RAND_VALUE равное 0. Это значение будет использоваться для генерации случайных чисел.
  2. Затем функция srand() вызывается с аргументом OLD_RAND_VALUE. Эта функция устанавливает начальное значение генератора случайных чисел на основе переданного ей значения.
  3. После этого вызывается функция rand(), которая возвращает случайное число.
  4. Полученное случайное число присваивается переменной OLD_RAND_VALUE.
  5. Этот процесс инициализации повторяется каждый раз при запуске программы.
  6. Значение OLD_RAND_VALUE используется для установки начального состояния генератора случайных чисел.
  7. Функция srand() вызывается снова с аргументом OLD_RAND_VALUE.
  8. И снова функция rand() вызывается для получения нового случайного числа.
  9. Это случайное число присваивается переменной OLD_RAND_VALUE.
  10. Этот процесс инициализации повторяется каждый раз при запуске программы.

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы