Морской бой. Функция авторасстановки кораблей - 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;
                    }
                }
            }
 
 
        }
 
 
    }
 
 
}
Впрочем рад был бы услышать критику и советы по улучшению кода. Спасибо за внимание!Добавлено через 7 минутСтоит дополнить: Функция SetShip устанавливает корабль и выставляет запретную зону вокруг него, чтобы рядом нельзя было поставить другие корабли. Функция freePlOnBF проверяет можно ли поставить корабль от заданной точки - влево, вправо, вверх, вниз, в зависимости от переданного аргумента типа char.Добавлено через 8 минутВ принципе могу кинуть и остальную часть кода, если будет необходимо...

Код к задаче: «Морской бой. Функция авторасстановки кораблей - C (СИ)»

textual
int OLD_RAND_VALUE = 0; - глобальное значение инициализируется 1 раз
 
srand(OLD_RAND_VALUE);
OLD_RAND_VALUE = rand();
 
и потом по новой:
 
srand(OLD_RAND_VALUE);
OLD_RAND_VALUE = rand();

10   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ