Для школьного задания я должен создать игру на линейном корабле, в которой на игровом поле 8х8 создается один случайный линейный корабль длиной 4 (горизонтальный или вертикальный). У игрока есть 15 торпед, чтобы попытаться потопить корабль. Я использовал 2D вектор и закончил большую часть кода:
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;
void generateship(vector<vector<int> >&field);
void fire(vector<vector<int> >&field);
void display(const vector<vector<int> >field);
int main()
{
srand(time(0));
vector<vector<int> >field(8);
for (int x = 0; x < field.size(); x++)
field[x].resize(8);
for (int x = 0; x < field.size(); x++)
for (int y = 0; y < field[y].size(); y++)
field[x][y] = 0;
generateship(field);
fire(field);system("pause");
return 0;
}
void generateship(vector<vector<int> >&field)
{
int row1 = rand() % 8;
int col1 = rand() % 8;
do
{
int row2 = rand() % 3 + (row1 - 1);
int col2 = rand() % 3 + (col1 - 1);
} while (row2 != row1 && col2)
int col3 = rand()
display(field);
}
void fire(vector<vector<int> >&field)
{
int row, col;
int torps = 15;
int hitcounter = 0;
while (hitcounter != 4 || torps != 0)
{
cout << torps << " torpedoes remain. Fire where? ";
cin >> row >> col;
switch (field[row][col])
{
case 0: cout << "Miss!" << endl << endl;
field[row][col] = 2;
break;
case 1: cout << "Hit!" << endl << endl;
field[row][col] = 3;
hitcounter = hitcounter + 1;
break;
case 2: cout << "Missed again!" << endl << endl;
break;
case 3: cout << "Hit again!" << endl << endl;
break;
}
torps = torps - 1;
display(field);
}
if (hitcounter == 4)
cout << "You win!";
else if (torps == 0)
cout << "You are out of torpedoes! Game over.";
}
void display(const vector<vector<int> >field)
{
for (int row = 0; row < 8; row++)
{
for (int col = 0; col < 8; col++)
{
switch (field[row][col])
{
case 0: cout << ". ";
break;
case 1: cout << ". ";
break;
case 2: cout << "X ";
break;
case 3: cout << "O ";
break;
}
}
cout << endl;
}
}
Как вы, наверное, видите, я борюсь с функцией «генерации». Моя цель — сгенерировать СЛУЧАЙНО один корабль 4х1 (горизонтальный или вертикальный), который полностью соответствует моему 8х8 2D-вектору. Любые советы / помощь / комментарии приветствуются!
Есть 2 случайных выбора: направление и положение.
Направление определяет, какие позиции являются действительными, поэтому, вероятно, лучше сначала выбрать случайным образом направление (горизонтальное или вертикальное).
Затем случайным образом выберите верхнюю позицию корабля.
Если направление горизонтальное, положение x должно быть между 0 и 7-3, y между 0 и 7. Если направление вертикальное, положение y должно быть между 0 и 7-3, x между 0 и 7.
Кстати, постарайтесь не кодировать ни один из этих номеров. Лучше использовать константы, чтобы потом можно было легко менять размер доски и корабля.
Других решений пока нет …