Задать вопрос
L1senich
@L1senich

Почему игра уходит в бесконечный цикл и как это исправить?

Это игра морской бой. Раз в n-ное количество генераций игрового поля с расстановкой кораблей на нем игра уходит в бесконечный цикл. Предположительно это происходит в функции Field_Generation из за do whileов, но не понятно, как это исправить, чтобы не происходило бесконечного цикла.

// Sea Battle.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#include <iostream>
#include <windows.h>
#include <stdlib.h>

using namespace std;

int x, y;

struct ship
{
    short int size;
    bool angle; //false - горизонтальный, true - вертикальный
};

ship b; //battleship
ship c1; //cruiser 1
ship c2; //cruiser 2
ship d1; //destroyer 1
ship d2; //destroyer 2
ship d3; //destroyer 3
ship tp1; //topedo boat 1
ship tp2; //topedo boat 2
ship tp3; //topedo boat 3
ship tp4; //topedo boat 4

bool mcif(ship s, int x, int y) //Main Cell in Field?
{
    if (s.angle == 0)
    {
        if (x >= 0 && x <= 9 - s.size && y >= 0 && y <= 9)return true;
        else return false;
    }
    else
    {
        if (x >= 0 && x <= 9 && y >= 0 && y <= 9 - s.size)return true;
        else return false;
    }
}

bool sdc(char field[10][10], ship s, int x, int y) //Ships Don't Cross?
{
    int count = 0, i = 0;

    if (s.angle == 0)
    {
        for (i; i <= s.size; i++)
        {
            if (field[y][x + i] == '0')count++;
            else return false;;
        }
        if (count == i)return true;
        else return false;
    }

    if (s.angle == 1)
    {
        for (i; i <= s.size; i++)
        {
            if (field[y + i][x] == '0')count++;
            else return false;
        }
        if (count == i)return true;
        else return false;
    }
}

bool cdc(char field[10][10], int x, int y) //Cell Don't Cross?
{
    if (field[x][y] == '0')return true;
    else return false;
}

bool cif(int x, int y) //Cell in Field?
{
    if (x >= 0 && x <= 9 && y >= 0 && y <= 9)return true;
    else return false;
}

void Ships_Generation()
{
    //battleship
    b.size = 4;
    b.angle = rand() % (2 - 0) + 0;
    //cruiser 1
    c1.size = 3;
    c1.angle = rand() % (2 - 0) + 0;
    //cruiser 2
    c2.size = 3;
    c2.angle = rand() % (2 - 0) + 0;
    //destroyer 1
    d1.size = 2;
    d1.angle = rand() % (2 - 0) + 0;
    //destroyer 2
    d2.size = 2;
    d2.angle = rand() % (2 - 0) + 0;
    //destroyer 3
    d3.size = 2;
    d3.angle = rand() % (2 - 0) + 0;
    //torpedo boat 1
    tp1.size = 1;
    tp1.angle = rand() % (2 - 0) + 0;
    //torpedo boat 2
    tp2.size = 1;
    tp2.angle = rand() % (2 - 0) + 0;
    //torpedo boat 3
    tp3.size = 1;
    tp3.angle = rand() % (2 - 0) + 0;
    //torpedo boat 4
    tp4.size = 1;
    tp4.angle = rand() % (2 - 0) + 0;
}

void place(char field[10][10], ship s)
{
    if (s.angle == 0)
    {
        for (int i = 0; i < s.size + 2; i++)
        {
            int y1 = y - 1;
            int y2 = y;
            int y3 = y + 1;
            int x1 = x - 1 + i;
            if (cif(y1, x1) && cdc(field, y1, x1))field[y1][x1] = '-';
            if (cif(y2, x1) && cdc(field, y2, x1))field[y2][x1] = '-';
            if (cif(y3, x1) && cdc(field, y3, x1))field[y3][x1] = '-';
        }
        for (int i = 0; i < s.size; i++)
        {
            field[y][x + i] = 'X';
        }
    }

    if (s.angle == 1)
    {
        for (int i = 0; i < s.size + 2; i++)
        {
            int y1 = y - 1 + i;
            int x1 = x - 1;
            int x2 = x;
            int x3 = x + 1;
            if (cif(y1, x1) && cdc(field, y1, x1))field[y1][x1] = '-';
            if (cif(y1, x2) && cdc(field, y1, x2))field[y1][x2] = '-';
            if (cif(y1, x3) && cdc(field, y1, x3))field[y1][x3] = '-';
        }
        for (int i = 0; i < s.size; i++)
        {
            field[y + i][x] = 'X';
        }
    }
}

void coords(ship s)
{
    if (s.angle == 0)
    {
        x = rand() % (10 - s.size); //столбец
        y = rand() % 10; //столбец
    }
    if (s.angle == 1)
    {
        x = rand() % 10; //строка
        y = rand() % (10 - s.size); //столбец
    }
}

bool sf(char field[10][10], ship s, int x, int y)
{
    if (mcif(s, x, y) && sdc(field, s, x, y))return true;
    else return false;
}

void Field_Generation(char field[10][10])
{
    Ships_Generation();

    do
    {
        coords(b);
    } while (!sf(field, b, x, y));
    place(field, b);

    do
    {
        coords(c1);
    } while (!sf(field, c1, x, y));
    place(field, c1);

    do
    {
        coords(c2);
    } while (!sf(field, c2, x, y));
    place(field, c2);

    do
    {
        coords(d1);
    } while (!sf(field, d1, x, y));
    place(field, d1);
    
    do
    {
        coords(d2);
    } while (!sf(field, d2, x, y));
    place(field, d2);
    
    do
    {
        coords(d3);
    } while (!sf(field, d3, x, y));
    place(field, d3);

    do
    {
        coords(tp1);
    } while (!sf(field, tp1, x, y));
    place(field, tp1);

    do
    {
        coords(tp2);
    } while (!sf(field, tp2, x, y));
    place(field, tp2);

    do
    {
        coords(tp3);
    } while (!sf(field, tp3, x, y));
    place(field, tp3);

    do
    {
        coords(tp4);
    } while (!sf(field, tp4, x, y));
    place(field, tp4);
}

int main()
{
    system("chcp 1251 > NUL");
    srand((unsigned int)time(NULL));
    char Field[10][10]{};

    cout << "---Морской Бой---" << endl;
    cout << R"(
    Начать игру (P)
    Настройки (S)
    Выйти (E)
)";
    char ctrl = ' ';
    cin >> ctrl;
    if (ctrl == 'E' || ctrl == 'e')
    {
        cout << "Вы уверены, что хотите выйти из игры? (Y/N)" << endl; cin >> ctrl;
        if (ctrl == 'Y' || ctrl == 'y')
        {
            cout << "До скорых встреч!" << endl;
            Sleep(1500);
        }
        else exit(1);
    }
    else if (ctrl == 'P' || ctrl == 'p')
    {
        do
        {
            system("cls");


            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Field[i][j] = '0';
                }
            }
            Field_Generation(Field);
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    //cout << "|" << Field[i][j] << "| ";
                    cout << Field[i][j] << " ";
                }
                cout << endl;
                //cout << "|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|" << endl;
            }
            cout << "\nИграть заново? "; cin >> ctrl;
        } while (ctrl == 'R' || ctrl == 'r');
    }
}
  • Вопрос задан
  • 122 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Похоже у тебя внутри цикла ctrl не изменяется. Поэтому условие выхода тоже не меняется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы