C++ Морской Бой — некоторые моменты
Хочу написать консольную игру морской бой. Я тут немножко понаписал код, но не реализовал некоторые моменты. Не обращайте внимание на такое кол-во подключенных библиотек, мне так просто спокойнее) В моей наработке есть поле (двумерный массив) разделенное на 2 части (от 1 до 5 строки вражеская, от 6 и 10 строки моя часть) в котором показываются однопалубные корабли в виде «1» и пустые ячейки в виде «0». Я могу ввести координаты по строке и столбцу и «уничтожить» данные корабли (ввод для меня разрешен от 1 до 5 строк, а для бота от 6 до 10). При уничтожении, их значении меняется на «5» на одну итерацию, чтобы было видно, что по нему стреляли и позже на «0», когда она превратится в пустое место. При уничтожении всех кораблей игра оканчивается и объявляется победа То с чем я не могу справиться и из-за чего пишу сюда. Требуется, чтобы у каждого (меня и бота) было по 5 штук — 1, 2, 3, 4, 5 — палубных кораблей расставленных по полю 10х10, а не 1 палубных как в данный момент и также, когда бот попадает по моему кораблю, он стрелял на одну ячейку дальше в рандомном направлении, а не в случайную ячейку по всей карте его атаки, как сейчас. Также, не знаю как скрыть поле которое я атакую, чтобы показывались только подбитые мной корабли. Жду советов от знающих. Прошу не кидайте ссылки на чужие проекты, мне нужно объяснить на основе моего кода. Благодарю
#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include using namespace std; const int SIZEf = 10; int field[SIZEf][SIZEf] = <>; HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); char s1[256]; void GotoXY(int X, int Y) < COORD coord = < X, Y >; SetConsoleCursorPosition(hStdOut, coord); > void menu() < int f = 1, k, code; cout 13 / 2 - 1) < cout else < cout > cout // * GotoXY(27, 12); cout Новая игра if (code == 80) < f = f * (-1); if (f == 1) < GotoXY(27, 12); cout Новая игра else if (f == 2) < GotoXY(27, 12); cout else < GotoXY(27, 12); cout Выход > else if (code == 72) < f = f * (-1); if (f == 1) < GotoXY(27, 12); cout Новая игра else if (f == 2) < GotoXY(27, 12); cout else < GotoXY(27, 12); cout Выход > else if (code == 13) < k = 1; >cout << endl << endl << endl << endl while (k == 0); < if (f != 1) < exit(0); >> system("cls"); cout << endl void figure1() < system("cls"); for (int x = 0; x < 15; x++) // * Создали квадрат < for (int y = 0; y < 15; y++) < if (x == 0 || x == 15 - 1 || y == 0 || y == 15 - 1) < cout else < cout if (x == 6) // ** Опускаемся ниже, чтобы написать текст внутри квадрата < cout break; > // ** > cout Sleep(1500); // пауза // * cout void reminder1() < system("cls"); cout // ** cout void win() < system("cls"); for (int x = 0; x else < system("cls"); for (int x = 0; x < 15; x++) // * Создали квадрат < for (int y = 0; y < 15; y++) < if (x == 0 || x == 15 - 1 || y == 0 || y == 15 - 1) < cout else < cout if (x == 6) // ** Опускаемся ниже, чтобы написать текст внутри квадрата < cout break; > // ** > cout // * > > > void ad() // Небольшая реклама 1 < system("cls"); for (int x = 0; x < 15; x++) // * Создали квадрат < for (int y = 0; y < 15; y++) < if (x == 0 || x == 15 - 1 || y == 0 || y == 15 - 1) < cout else < cout if (x == 6) // ** Опускаемся ниже, чтобы написать текст внутри квадрата < cout break; > // ** > cout // Sleep(3300); system("cls"); > void tableShow() < system("cls"); cout cout = 0 && j == 0) < counter++; cout cout cout > int main() < setlocale(LC_ALL, "Rus"); srand(unsigned(time(0))); system("Color 75"); menu(); figure1(); reminder1(); int x, y; int enemyShipCounter = 0; // * Расположение и количество вражеских кораблей while (true) < x = rand() % SIZEf; if (x > > // * int myShipCounter = 0; // * Расположение и количество моих кораблей while (true) < x = rand() % SIZEf; if (x >= 5) < y = rand() % SIZEf; field[x][y] = 1; myShipCounter++; if (myShipCounter == 10) < break; >> > // * tableShow(); bool isMyRound = false; while (true) < cout > x; cin >> y; if (x >= 6 || x > while (x >= 6 || x if (field[x][y] == 1) < cout > if (ship_detect == true) < break; >> if (ship_detect == false) < cout isMyRound = true; > else < cout while (isMyRound == false) // * ход бота < cout > if (ship_detect == true) < break; >> if (ship_detect == false) < cout > else < cout > // * > cout
Отслеживать
задан 20 авг 2019 в 15:00
47 2 2 золотых знака 2 2 серебряных знака 12 12 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для того, чтобы вражеские корабли не отображались, пока их не подобьют в функции tableshow() измените код на:
void tableShow() < system("cls"); cout cout = 0 && j == 0) < counter++; cout if (field[i][j] == 5) < cout else if (i < 5)< cout else < cout > cout >
Замените цифру убитых кораблей на -1 для некоторых функций и для вида. В функции main вам нужно добавить несколько переменных:
int Direction = -1; bool BotHit = false; bool BotHitForSecondBotHit = false; bool SecondBotHit = false; bool BotMiss[4] = ; //Попадание бота по четырём сторонам
Далее заменить в ходе бота все x и y на BotX и BotY. После этого добавить следующий код:
cout 0) < BotY--; //Стреляет левее break; >else if (Direction == 2 && BotMiss[1] == false && BotX > 5) < BotX--; //Стреляет выше break; >else if (Direction == 3 && BotMiss[2] == false && BotY < 9)< BotY++; //Стреляет правее break; >else if (Direction == 4 && BotMiss[3] == false && BotX < 9)< BotX++; //Стреляет ниже break; >else < BotMiss[Direction - 1] = true; //Если никуда не получилось выстрелить >if (BotMiss[0] == true && BotMiss[1] == true && BotMiss[2] == true && BotMiss[3] == true) < break; //Если уже были попытки выстрелить по всем сторонам >> > else < //При втором попадании стреляет в направлении, в котором раньше стрелял if (Direction == 1 && BotY >0) < BotY--; >else if (Direction == 2 && BotX > 5) < BotX--; >else if (Direction == 3 && BotY < 9)< BotY++; >else if (Direction == 4 && BotX < 9)< BotX++; >else < SecondBotHit = false; >> > else
Это определит сторону выстрела. Я заметил, что вы неправильно генерируете координаты и показываете их. Массивы начинаются с 0, а значит нам нужно генерировать
BotX = rand() % 4 + 5; BotY = rand() % 10;
И показывать координаты вот так:
int CoutBotX = BotX + 1; int CoutBotY = BotY + 1; cout
Чтобы ИИ не реагировал на убитые корабли добавляем вот такую часть кода в начале промаха:
if (field[BotX][BotY] != -1)
Записывает промах в одну из сторон и проверяет стрелял ли по всем четырём сторонам бот, а также возвращает координаты на попадание в корабль:
BotHitForSecondBotHit = false; if (Direction != -1) < BotMiss[Direction - 1] = true; if ((BotMiss[0] == true && BotMiss[1] == true && BotMiss[2] == true && BotMiss[3] == true) || SecondBotHit == true)< BotHit = false; for (int x = 0; x != 4; x++)< BotMiss[x] = false; >> if (SecondBotHit == false && BotHit == true) < if (Direction == 1)< BotY++; //Направляет координату правее >else if (Direction == 2) < BotX++; //Направляет координату ниже >else if (Direction == 3) < BotY--; //Направляет координату левее >else if (Direction == 4) < BotX--; //Направляет координату выше >> > SecondBotHit = false;
Советую либо переместить в начало после проверки убитого корабля, либо убрать
field[i][j] = 0
Получается вот такой код:
while (isMyRound == false) // * ход бота < cout 0) < BotY--; //Стреляет левее break; >else if (Direction == 2 && BotMiss[1] == false && BotX > 5) < BotX--; //Стреляет выше break; >else if (Direction == 3 && BotMiss[2] == false && BotY < 9)< BotY++; //Стреляет правее break; >else if (Direction == 4 && BotMiss[3] == false && BotX < 9)< BotX++; //Стреляет ниже break; >else < BotMiss[Direction - 1] = true; //Если никуда не получилось выстрелить >if (BotMiss[0] == true && BotMiss[1] == true && BotMiss[2] == true && BotMiss[3] == true) < break; //Если уже были попытки выстрелить по всем сторонам >> > else < //При втором попадании стреляет в направлении, в котором раньше стрелял if (Direction == 1 && BotY >0) < BotY--; >else if (Direction == 2 && BotX > 5) < BotX--; >else if (Direction == 3 && BotY < 9)< BotY++; >else if (Direction == 4 && BotX < 9)< BotX++; >else < SecondBotHit = false; >> > else < BotX = rand() % 4 + 5; BotY = rand() % 10; >int CoutBotX = BotX + 1; int CoutBotY = BotY + 1; cout if (BotHitForSecondBotHit == true) < SecondBotHit = true; >BotHit = true; cout > if (ship_detect == true) < break; >> if (ship_detect == false) < cout > else < if (field[BotX][BotY] != -1)< cout BotHitForSecondBotHit = false; if (Direction != -1) < BotMiss[Direction - 1] = true; if ((BotMiss[0] == true && BotMiss[1] == true && BotMiss[2] == true && BotMiss[3] == true) || SecondBotHit == true)< BotHit = false; for (int x = 0; x != 4; x++)< BotMiss[x] = false; >> if (SecondBotHit == false && BotHit == true) < if (Direction == 1)< BotY++; //Направляет координату правее >else if (Direction == 2) < BotX++; //Направляет координату ниже >else if (Direction == 3) < BotY--; //Направляет координату левее >else if (Direction == 4) < BotX--; //Направляет координату выше >> > SecondBotHit = false; Sleep(5500); tableShow(); > > // *
Надеюсь я всё написал правильно и это поможет вам.
Напишите пожалуйста код на C++ для игры Морской бой
Создайте игру «Морской бой».
Главные особенности реализации игры: Режимы игры:
• Человек - компьютер; • Компьютер - компьютер. Расстановка кораблей:
• Игрок расставляет вручную; • Компьютер расставляет
за игрока. Компьютер может играть в двух режимах:
• Случайный выстрел;
• Интеллектуальная игра. Компьютер строит стратегию игры, а не стреляет случайно.
Отображать текущее состояние игрового поля игрока и компьютера. Возможность остановки, приостановки, нового запуска игры.
Написать пожалуйста код на C++ без ошибок, написать программу не более 1000 строк.
Саздание игры - "Морской бой" на C++ с Qt, часть 3.
Чек-лист успешной адаптации или как пройти испытательный срок в компании?
10 ключевых ошибок во время собеседования
Подготовка к собеседованию в IT
Активный поиск первой работы в IT – советы и частые ошибки
IТ в период войны: как найти первую работу
Использование и оптимизация UI системы при создании игр в Unity.
Третья часть - "Саздание игры - "Морской бой" на языке C++ с использованием графической библиотеки Qt". Практическая работа в ходе которой будет реализованна игра - "Морской бой". Пошаговая реализация и теоретическое объяснение в ходе работы над игрой. Еще больше интересных видео для пользователей ITVDN.
Покупай подписку с доступом ко всем курсам и сервисам
Библиотека современных IT знаний в удобном формате
Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.
- Все видеокурсы на 3 месяца
- Тестирование по 10 курсам
- Проверка 5 домашних заданий
- Консультация с тренером 30 мин
- Все видеокурсы на 6 месяцев
- Тестирование по 16 курсам
- Проверка 10 домашних заданий
- Консультация с тренером 60 мин
- Все видеокурсы на 1 год
- Тестирование по 24 курсам
- Проверка 20 домашних заданий
- Консультация с тренером 120 мин
Саздание игры - "Морской бой" на C++ с Qt, часть 1.
Чек-лист успешной адаптации или как пройти испытательный срок в компании?
10 ключевых ошибок во время собеседования
Подготовка к собеседованию в IT
Активный поиск первой работы в IT – советы и частые ошибки
IТ в период войны: как найти первую работу
Использование и оптимизация UI системы при создании игр в Unity.
Первая часть уроков - "Саздание игры - "Морской бой" на языке C++ с использованием графической библиотеки Qt". Практическая работа в ходе которой будет реализованна игра - "Морской бой". Пошаговая реализация и теоретическое объяснение в ходе работы над игрой. Смотрите еще больше полезных видео вместе с ITVDN.
Покупай подписку с доступом ко всем курсам и сервисам
Библиотека современных IT знаний в удобном формате
Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.
- Все видеокурсы на 3 месяца
- Тестирование по 10 курсам
- Проверка 5 домашних заданий
- Консультация с тренером 30 мин
- Все видеокурсы на 6 месяцев
- Тестирование по 16 курсам
- Проверка 10 домашних заданий
- Консультация с тренером 60 мин
- Все видеокурсы на 1 год
- Тестирование по 24 курсам
- Проверка 20 домашних заданий
- Консультация с тренером 120 мин