It all started with the fact that I wrote the condition of non-contact of ships along the diagonals / verticals / horizontals (in part, I still do, but the problem is different).
It is precisely in the part where the placement of torpedo boats (single-celled ships) occurs that a loop occurs and the same torpedo boat is put in spite of the fact that the counter (at which this cycle actually works, the same amount_of_checked_cells ) counts the number of ship cells and By condition, when placing four single-celled ships, a two-celled ship should be placed, then, when installing six such cells, a three-celled ship and so on ...
(PS: all this rigma happens in the Set_ships function, line 143)
#include<iostream> #include<ctime> #include<iomanip> #include<string> #include<Windows.h> #include<windows.h> using namespace std; HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); #define _CRT_NO_SECURITY_WARNINGS const int FIELD_SIZE = 10; char Player1[100]; char Player2[100]; int amount_of_ship_cells_left_to_drown_P1; int amount_of_ship_cells_left_to_drown_P2; // [x][y], где x - вертикаль, y - горизонталь char WaterP1 = '~'; char WaterP2 = '~'; char TorpedeP1 = 'Т'; char TorpedeP2 = 'Т'; char DestroyerP1 = 'К'; char DestroyerP2 = 'К'; char CruiserP1 = 'Э'; char CruiserP2 = 'Э'; char BattleshipP1 = 'Л'; char BattleshipP2 = 'Л'; char ShipHitP1 = 'Х'; char ShipHitP2 = 'X'; char HitMissP1 = '*'; char HitMissP2 = '*'; void ifP1Win(char* p1) { system("cls"); cout << "Игрок " << p1 << " ПОБЕДИЛ!!! Поздравляем!" << endl; system("pause"); } void ifP2Win(char* p2) { system("cls"); cout << "Игрок " << p2 << " ПОБЕДИЛ!!! Поздравляем!" << endl; system("pause"); } bool Cell_checker(int PlayerNumber, int asked_cell) { char T; char D; char C; char BS; switch (PlayerNumber) { case 1: { T = TorpedeP1; D = DestroyerP1; C = CruiserP1; BS = BattleshipP1; } break; case 2: { T = TorpedeP2; D = DestroyerP2; C = CruiserP2; BS = BattleshipP2; } break; } if (asked_cell == T || asked_cell == D || asked_cell == C || asked_cell == BS) return true; else return false; } void Print_table(char arr[][FIELD_SIZE]) { for (int i = 0; i < FIELD_SIZE; i++) { for (int j = 0; j < FIELD_SIZE; j++) { cout << arr[i][j] << " "; } cout << endl; } } void Print_hidden_table(char arr[][FIELD_SIZE]) { for (int i = 0; i < FIELD_SIZE; i++) { for (int j = 0; j < FIELD_SIZE; j++) { cout << '~' << " "; } cout << endl; } } void Players_names(char* Player1, char* Player2) { cout << "Введите имя "; SetConsoleTextAttribute(h, 3); cout << "первого"; SetConsoleTextAttribute(h, 7); cout << " игрока() : "; cin >> Player1; cout << "Введите имя "; SetConsoleTextAttribute(h, 4); cout << "второго"; SetConsoleTextAttribute(h, 7); cout << " игрока() : "; cin >> Player2; } void Create_table(char arr[][FIELD_SIZE], char c) { for (int i = 0; i < FIELD_SIZE; i++) { for (int j = 0; j < FIELD_SIZE; j++) { arr[i][j] = c; } } } void Pass2AnotherPlayer() { system("cls"); cout << "Переход к другому игроку. И не подглядывайте ;)" << endl; Sleep(5000); system("cls"); } void Set_ships(char arr[][FIELD_SIZE], int PlayerNumber) { char PNEnd[5]; char Torp; char Destr; char Crui; char BShip; if (PlayerNumber == 1) { Torp = TorpedeP1; Destr = DestroyerP1; Crui = CruiserP1; BShip = BattleshipP1; strcpy_s(PNEnd, "-ый"); } else { Torp = TorpedeP2; Destr = DestroyerP2; Crui = CruiserP2; BShip = BattleshipP2; strcpy_s(PNEnd, "-ой"); } int nmb_of_cells_for_current_ship = 1; char type_of_ship[100]; int plant_choise_x, plant_choise_y; int amount_of_checked_cells = 0; while (amount_of_checked_cells < 21) { system("cls"); Print_table(arr); if (nmb_of_cells_for_current_ship == 4) strcpy_s(type_of_ship, "линкор (4 клетки для размещения)"); if (nmb_of_cells_for_current_ship == 3) strcpy_s(type_of_ship, "крейсер (3 клетки для размещения)"); if (nmb_of_cells_for_current_ship == 2) strcpy_s(type_of_ship, "эсминец (2 клетки для размещения)"); if (nmb_of_cells_for_current_ship == 1) strcpy_s(type_of_ship, "торпедный катер (1 клетка для размещения)"); cout << "Введите порядковый номер клетки, на которую " << PlayerNumber << PNEnd << " игрок хочет поместить кораблик (x,y)."; cout << endl << "Помещается " << type_of_ship << "." << endl; cout << " Ваши координаты: "; cin >> plant_choise_x >> plant_choise_y; if (Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y] /* само место, куда ставится клетка*/) == false && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1] /* верхняя правая клетка */) == false && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1] /* нижняя левая клетка */) == false && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1] /* верхняя левая клетка */) == false && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1] /* нижняя правая клетка */) == false ) { if ( Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false /* нижняя */ && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false /* верхняя */ && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 1]) == false /* левая */ && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 1]) == false /* правая */ ) { arr[plant_choise_x][plant_choise_y] = Torp; amount_of_checked_cells++; } else if (amount_of_checked_cells > 4 && amount_of_checked_cells < 12) { if (nmb_of_cells_for_current_ship == 1) nmb_of_cells_for_current_ship++; if (arr[plant_choise_x + 1][plant_choise_y] == Destr && (Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 1]) == false /// choise_cords (1) && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 1]) == false && Cell_checker(PlayerNumber, arr[plant_choise_x + 2][plant_choise_y - 1]) == false // [1] && Cell_checker(PlayerNumber, arr[plant_choise_x + 2][plant_choise_y + 1]) == false // [2] && Cell_checker(PlayerNumber, arr[plant_choise_x + 2][plant_choise_y]) == false /// choise_cords (2) && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false ) || (arr[plant_choise_x - 1][plant_choise_y] == Destr // [2] && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y]) == false // [1] && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false /// choise_cords (1) // низ && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // нижнелевая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // нижнеправая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 1]) == false // лево && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 1]) == false // право && Cell_checker(PlayerNumber, arr[plant_choise_x - 2][plant_choise_y]) == false /// choise_cords (2) // верх && Cell_checker(PlayerNumber, arr[plant_choise_x - 2][plant_choise_y - 1]) == false // верхнелевая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x - 2][plant_choise_y + 1]) == false // верхнеправая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // правая ) || ( arr[plant_choise_x][plant_choise_y + 1] == Destr // ----> && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y]) == false // [1][2] && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false /// choise_cords (1) // низ && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false // верх && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // нижнелевая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // верхнелевая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 1]) == false // лево && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false /// choise_cords (2) // верх && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // низ && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 2]) == false // верхнеправая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 2]) == false // правая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 2]) == false // нижнеправая ) || ( arr[plant_choise_x][plant_choise_y - 1] == Destr // [1] // [2][1] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false // верх (1) && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false // низ && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 1]) == false // правая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхнеправая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // нижнеправая кллетка // [2] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 2]) == false // верхнелевая клетка && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 2]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 2]) == false // верхнелевая ) || ( Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y]) == false // сама клетка && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 1]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 1]) == false // правая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // верхнелевая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхнеправая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // нижнелевая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // нижнеправая ) ) { arr[plant_choise_x][plant_choise_y] = Destr; amount_of_checked_cells++; } if (amount_of_checked_cells >= 12) { if (nmb_of_cells_for_current_ship == 2) nmb_of_cells_for_current_ship++; /// [1][2][3] //[1] if ((arr[plant_choise_x][plant_choise_y + 1] == Crui && arr[plant_choise_x][plant_choise_y + 2] == Crui && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y]) == false && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 1]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // верхнелевая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // нижелевая //[2] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // нижнняя //[3] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 2]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 2]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 3]) == false // правая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 3]) == false // верхнеправая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 3]) == false // нижнеправая ) || /// [3][2][1] ( Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y]) == false && arr[plant_choise_x][plant_choise_y - 1] == Crui && arr[plant_choise_x][plant_choise_y - 2] == Crui // [1] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 1]) == false // правая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхнеправая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // нижнеправая // [2] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // нижняя // [3] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 2]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 2]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 3]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 3]) == false // верхнелевая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 3]) == false // нижнелевая ) || ( Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y]) == false && arr[plant_choise_x][plant_choise_y - 1] == Crui && arr[plant_choise_x][plant_choise_y + 1] == Crui /// [2][1][3] // [1] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y]) == false // нижняя // [2] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 2]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 2]) == false // верхнелевая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 2]) == false // нижнелевая // [3] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // нижняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 2]) == false // правая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 2]) == false // верхнеправая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 2]) == false // нижеправая ) || ( /* [1] [2] [3] */ Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y]) == false && arr[plant_choise_x + 1][plant_choise_y] == Crui && arr[plant_choise_x + 2][plant_choise_y] == Crui // [1] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y - 1]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x][plant_choise_y + 1]) == false // правая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y - 1]) == false // верхнелевая && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхнеправая // [2] && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y - 1]) == false // левая && Cell_checker(PlayerNumber, arr[plant_choise_x + 1][plant_choise_y + 1]) == false // правая // [3] && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхняя && Cell_checker(PlayerNumber, arr[plant_choise_x - 1][plant_choise_y + 1]) == false // верхняя ) ) { arr[plant_choise_x][plant_choise_y] = Crui; amount_of_checked_cells++; } if (amount_of_checked_cells == 17) { if (nmb_of_cells_for_current_ship == 3) nmb_of_cells_for_current_ship++; arr[plant_choise_x][plant_choise_y] = BShip; break; } } } } else { system("cls"); cout << "Введите правильную ячейку! " << endl; Sleep(1250); } } } void Player_move(char arr1[][FIELD_SIZE], char arr2[][FIELD_SIZE], int PlayerNumber, char* p1, char* p2) { int choise_x; int choise_y; while (true) { system("cls"); choise_x = 0; choise_y = 0; if (PlayerNumber == 1) { Print_table(arr1); cout << "\n Введите координаты клетки, в которую вы хотите стрельнуть, " << p1 << ": "; cout << "\n Вам осталось потопить клеток кораблей: " << amount_of_ship_cells_left_to_drown_P2; cin >> arr2[choise_x][choise_y]; if ((arr2[choise_x][choise_y] == TorpedeP2 || arr2[choise_x][choise_y] == DestroyerP2 || arr2[choise_x][choise_y] == CruiserP2 || arr2[choise_x][choise_y] == BattleshipP2) && arr2[choise_x][choise_y] != ShipHitP2 && arr2[choise_x][choise_y] != HitMissP2) { arr2[choise_x][choise_y] = ShipHitP2; --amount_of_ship_cells_left_to_drown_P2; system("cls"); cout << "Попадание!" << endl; system("pause"); continue; } else if (arr2[choise_x][choise_y] == ShipHitP2 || arr2[choise_x][choise_y] == HitMissP2) { system("cls"); cout << "Вы по этой клетке уже попадали!" << endl; system("pause"); continue; } else { arr2[choise_x][choise_y] = HitMissP2; system("cls"); Pass2AnotherPlayer(); break; } } else { Print_table(arr2); cout << "\n Введите координаты клетки, в которую вы хотите стрельнуть, " << p2 << ": "; cout << "\n Вам осталось потопить клеток кораблей: " << amount_of_ship_cells_left_to_drown_P1; cin >> arr1[choise_x][choise_y]; if ((arr1[choise_x][choise_y] == TorpedeP1 || arr1[choise_x][choise_y] == DestroyerP1 || arr1[choise_x][choise_y] == CruiserP1 || arr1[choise_x][choise_y] == BattleshipP1) && arr1[choise_x][choise_y] != ShipHitP1 && arr1[choise_x][choise_y] != HitMissP1) { arr1[choise_x][choise_y] = ShipHitP1; --amount_of_ship_cells_left_to_drown_P1; system("cls"); cout << "Попадание!" << endl; system("pause"); continue; } else if (arr1[choise_x][choise_y] == ShipHitP1 || arr1[choise_x][choise_y] == HitMissP1) { system("cls"); cout << "Вы по этой клетке уже попадали!" << endl; system("pause"); continue; } else { arr1[choise_x][choise_y] = HitMissP1; system("cls"); Pass2AnotherPlayer(); break; } } } } bool Win(int ship_cells) { if (ship_cells == 0) return true; return false; } int main() { srand((unsigned)time(0)); setlocale(LC_ALL, "Russian"); char arr1[FIELD_SIZE][FIELD_SIZE]; char arr2[FIELD_SIZE][FIELD_SIZE]; Players_names(Player1, Player2); system("cls"); cout << "Имя первого игрока: " << Player1 << endl; cout << "Имя второго игрока: " << Player2 << endl << endl; system("pause"); Create_table(arr1, WaterP1); Set_ships(arr1, 1); Pass2AnotherPlayer(); Create_table(arr2, WaterP2); Set_ships(arr2, 2); system("pause"); system("cls"); cout << "\t BETA TEST" << endl << endl; cout << "Поле игрока с именем (или никнеймом) " << Player1 << endl; Print_table(arr1); cout << endl; cout << "Поле игрока с именем (или никнеймом) " << Player2 << endl; Print_table(arr2); while (true) { Player_move(arr1, arr2, 1, Player1, Player2); Player_move(arr1, arr2, 2, Player1, Player2); Win(amount_of_ship_cells_left_to_drown_P1); Win(amount_of_ship_cells_left_to_drown_P2); if (Win(amount_of_ship_cells_left_to_drown_P2) == true) { ifP1Win(Player1); } else if (Win(amount_of_ship_cells_left_to_drown_P1) == true) { ifP2Win(Player2); } cout << "Поле игрока с именем (никнеймом) " << Player1 << endl << endl; Print_table(arr1); cout << endl; cout << "Поле игрока с именем (никнеймом) " << Player2 << endl << endl; Print_table(arr2); system("pause"); } system("pause"); return 0; }