Как написать морской бой на c
Перейти к содержимому

Как написать морской бой на c

  • автор:

Саздание игры — «Морской бой» на 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 мин

КОММЕНТАРИИ И ОБСУЖДЕНИЯ

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 строк.

Saved searches

Use saved searches to filter your results more quickly

Cancel Create saved search

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Консольная игра в моркой бой. Windows 10. ( @WgHost-git )

License

WgHost-git/Cpp_SeaBattleConsoleGame

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Go to file

Folders and files

Last commit message
Last commit date

Latest commit

History

View all files

Repository files navigation

Консольная игра для Windows «Морской бой» написанная на языке C++ и рассчитанная на двоих игроков.

Необходимые компоненты:

Данная консольная игра корректно работает на Windows 10 в новой консоли. В старых консолях может работать не корректно.

Как играть (правила классической игры):

Играют двое игроков. Правила морского боя говорят, что должно быть:

  • 4 корабля по одной клеточке (однопалубный);
  • 3 корабля по 2 клеточки(двухпалубный);
  • 2 корабля по 3 клеточки(трехпалубный);
  • 1 корабль — четырёхпалубный.

Корабли располагаются на игровом поле таким образом, чтобы между ними всегда был зазор в одну клеточку. Корабли могут касаться краёв поля и занимать углы. Когда корабли расставлены, игроки по очереди производят выстрелы ��, выбирая область в поле. Если выстрел�� пришёлся в не занятую кораблём область противника, то право хода переходит к сопернику. Если выстрел�� пришёлся в область, где находится корабль, стрелявший игрок получает право на ещё один выстрел.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *