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

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

inceon/sea-battle

GODOT

Всеми любимая игра которая знакома с детства. В данной вариации игра происходит между двумя роботами.

  • Базовая отрисовка на WinAPI
  • Генерация расстановки кораблей.
  • Алгоритм добивания корабля.
  • И старт новой игры, клавишей «0»

Эта программа была скомпилирована с помощью GCC 4.9.2. Совместимость с другими компиляторами не гарантируется

Everyone’s favourite game which is familiar from childhood. In this variation of the game is played between two robots.

  • Basic drawing on WinAPI
  • Generation ship formations.
  • Algorithm the goal of the ship.
  • And start a new game (key «0»)

This program was compiled with GCC 4.9.2. Compatibility with other compilers are not guaranteed

C++ Морской Бой — некоторые моменты

В моей наработке есть поле (двумерный массив) разделенное на 2 части (от 1 до 5 строки вражеская, от 6 и 10 строки моя часть) в котором показываются однопалубные корабли в виде «1» и пустые ячейки в виде «0». Я могу ввести координаты по строке и столбцу и «уничтожить» данные корабли (ввод для меня разрешен от 1 до 5 строк, а для бота от 6 до 10). При уничтожении, их значении меняется на «5» на одну итерацию, чтобы было видно, что по нему стреляли и позже на «0», когда она превратится в пустое место. При уничтожении всех кораблей игра оканчивается и объявляется победа

То с чем я не могу справиться и из-за чего пишу сюда. Требуется, чтобы у каждого (меня и бота) было по 5 штук — 1, 2, 3, 4, 5 — палубных кораблей расставленных по полю 10х10, а не 1 палубных как в данный момент и также, когда бот попадает по моему кораблю, он стрелял на одну ячейку дальше в рандомном направлении, а не в случайную ячейку по всей карте его атаки, как сейчас. Также, не знаю как скрыть поле которое я атакую, чтобы показывались только подбитые мной корабли. Жду советов от знающих. Прошу не кидайте ссылки на чужие проекты, мне нужно объяснить на основе моего кода. Благодарю

user avatar

Для того, чтобы вражеские корабли не отображались, пока их не подобьют в функции tableshow() измените код на:

Замените цифру убитых кораблей на -1 для некоторых функций и для вида. В функции main вам нужно добавить несколько переменных:

Далее заменить в ходе бота все x и y на BotX и BotY. После этого добавить следующий код:

Это определит сторону выстрела. Я заметил, что вы неправильно генерируете координаты и показываете их. Массивы начинаются с 0, а значит нам нужно генерировать

И показывать координаты вот так:

Чтобы ИИ не реагировал на убитые корабли добавляем вот такую часть кода в начале промаха:

Записывает промах в одну из сторон и проверяет стрелял ли по всем четырём сторонам бот, а также возвращает координаты на попадание в корабль:

Советую либо переместить в начало после проверки убитого корабля, либо убрать

Морской бой

Для того, чтобы в C++ работать с файлами необходимо подключить заголовочный файл fstream :

После этого можно объявлять объекты, привязанные к файлам: для чтения данных из файла используются объекты типа ifstream (аббревиатура от input file stream, для записи данных в файл используются объекты типа ofstream (output file stream). Например

Чтобы привязать тот или иной поток к файлу (открыть файл для чтения или для записи) используется метод open , которому необходимо передать параметр – текстовую строку, содержащую имя открываемого файла.

После открытия файлов и привязки их к файловым потокам, работать с файлами можно так же, как со стандартными потоками ввода-вывода cin и cout . Например, чтобы вывести значение переменной x в поток fout используются следующая операция

А чтобы считать значение переменной из потока fin

Для закрытия ранее открытого файла используется метод close() без аргументов:

Закрытый файловый поток можно переоткрыть заново при помощи метода open , привязав его к тому же или другому файлу.

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

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