С++
Створіть гру «Морський Бій»..
Головні особливості реалізації гри:
● Режими гри:
o Людина - комп'ютер.
o Комп'ютер - комп'ютер.
● Розміщення кораблів:
o Гравець розставляє вручну.
o Комп'ютер розставляє замість гравця.
● Комп'ютер може грати у двох режимах:
o Випадковий постріл.
o Інтелектуальна гра. Комп'ютер будує стратегію гри, а не
стріляє випадково.
● Відображати поточний стан ігрового поля гравця та комп'ютера.
● Можливість зупинки, припинення, нового запуску гри
Ответы
Ответ:
Попробуй
Объяснение:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
const int BOARD_SIZE = 10;
const char SHIP_SYMBOL = 'S';
const char HIT_SYMBOL = 'X';
const char MISS_SYMBOL = 'O';
const char EMPTY_SYMBOL = '.';
// Функція для очищення екрану консолі
void clearScreen()
{
system("clear");
}
// Клас для представлення ігрового поля
class Board
{
public:
vector<vector<char>> grid;
Board()
{
grid.resize(BOARD_SIZE, vector<char>(BOARD_SIZE, EMPTY_SYMBOL));
}
// Функція для відображення ігрового поля
void display()
{
cout << " ";
for (int i = 0; i < BOARD_SIZE; ++i)
cout << i << " ";
cout << endl;
for (int i = 0; i < BOARD_SIZE; ++i)
{
cout << i << " ";
for (int j = 0; j < BOARD_SIZE; ++j)
cout << grid[i][j] << " ";
cout << endl;
}
}
// Функція для розміщення кораблів
void placeShips()
{
for (int i = 1; i <= 5; ++i)
{
int shipSize = 6 - i;
cout << "Розмістіть корабль розміром " << shipSize << endl;
for (int j = 0; j < i; ++j)
{
int x, y;
cout << "Введіть координати (x, y) для частини " << j + 1 << ": ";
cin >> x >> y;
while (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || grid[x][y] != EMPTY_SYMBOL)
{
cout << "Некоректні координати. Спробуйте ще раз: ";
cin >> x >> y;
}
grid[x][y] = SHIP_SYMBOL;
}
clearScreen();
display();
}
}
// Функція для перевірки чи виграв гравець
bool checkWin()
{
for (int i = 0; i < BOARD_SIZE; ++i)
{
for (int j = 0; j < BOARD_SIZE; ++j)
{
if (grid[i][j] == SHIP_SYMBOL)
return false;
}
}
return true;
}
};
// Функція для випадкового пострілу комп'ютера
void computerRandomShoot(Board &opponentBoard)
{
int x, y;
do
{
x = rand() % BOARD_SIZE;
y = rand() % BOARD_SIZE;
} while (opponentBoard.grid[x][y] == HIT_SYMBOL || opponentBoard.grid[x][y] == MISS_SYMBOL);
if (opponentBoard.grid[x][y] == SHIP_SYMBOL)
{
cout << "Комп'ютер влучив у ваш корабель!" << endl;
opponentBoard.grid[x][y] = HIT_SYMBOL;
}
else
{
cout << "Комп'ютер промахнувся." << endl;
opponentBoard.grid[x][y] = MISS_SYMBOL;
}
}
// Функція для інтелектуальної гри комп'ютера
void computerIntelligentShoot(Board &opponentBoard, vector<pair<int, int>> &possibleMoves)
{
int index = rand() % possibleMoves.size();
int x = possibleMoves[index].first;
int y = possibleMoves[index].second;
possibleMoves.erase(possibleMoves.begin() + index);
if (opponentBoard.grid[x][y] == SHIP_SYMBOL)
{
cout << "Комп'ютер влучив у ваш корабель!" << endl;
opponentBoard.grid[x][y] = HIT_SYMBOL;
}
else
{
cout << "Комп'ютер промахнувся." << endl;
opponentBoard.grid[x][y] = MISS_SYMBOL;
}
}
// Функція для гри між гравцем і комп'ютером
void playHumanVsComputer()
{
Board playerBoard, computerBoard;
vector<pair<int, int>> possibleMoves;
clearScreen();
cout << "Гравець, розташуйте свої кораблі." << endl;
playerBoard.display();
playerBoard.placeShips();
cout << "Комп'ютер розташовує свої кораблі..." << endl;
computerBoard.placeShips();
clearScreen();
cout << "Гра розпочалась!" << endl;
while (true)
{
cout << "Ваш хід:" << endl;
cout << "Ваше поле:" << endl;
playerBoard.display();
cout << "Поле комп'ютера:" << endl;
computerBoard.display();
int x, y;
cout << "Введіть координати (x, y) для пострілу: ";
cin >> x >> y;
while (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || computerBoard.grid[x][y] == HIT_SYMBOL || computerBoard.grid[x][y] == MISS_SYMBOL)
{
cout << "Некоректні координати. Спробуйте ще раз: ";
cin >> x >> y;
}
if (computerBoard.grid[x][y] == SHIP_SYMBOL)
{
cout << "Ви влучили у корабель комп'ютера!" << endl;
computerBoard.grid[x][y] = HIT_SYMBOL;
if (computerBoard.checkWin())
{
cout << "Ви перемогли!" << endl;
break;
}
}
else
{
cout << "Ви промахнулися." << endl;
computerBoard.grid[x][y] = MISS_SYMBOL;
}
cout << "Хід комп'ютера:" << endl;
computerRandomShoot(playerBoard);
if (playerBoard.checkWin())
{
cout << "Комп'ютер переміг!" << endl;
break;
}
}
}
// Функція для гри між двома комп'ютерами
void playComputerVsComputer()
{
Board board1, board2;
vector<pair<int, int>> possibleMoves;
cout << "Перший комп'ютер розташовує свої кораблі..." << endl;
board1.placeShips();
cout << "Другий комп'ютер розташовує свої кораблі..." << endl;
board2.placeShips();
clearScreen();
cout << "Гра розпочалась!" << endl;
while (true)
{
cout << "Хід першого комп'ютера:" << endl;
computerRandomShoot(board2);
if (board2.checkWin())
{
cout << "Перший комп'ютер переміг!" << endl;
break;
}
cout << "Хід другого комп'ютера:" << endl;
computerIntelligentShoot(board1, possibleMoves);
if (board1.checkWin())
{
cout << "Другий комп'ютер переміг!" << endl;
break;
}
}
}
int main()
{
srand(static_cast<unsigned>(time(0)));
int choice;
cout << "Виберіть режим гри:" << endl;
cout << "1. Людина проти комп'ютера" << endl;
cout << "2. Комп'ютер проти комп'ютера" << endl;
cout << "Ваш вибір: ";
cin >> choice;
if (choice == 1)
playHumanVsComputer();
else if (choice == 2)
playComputerVsComputer();
else
cout << "Некоректний вибір." << endl;
return 0;
}