inceon/sea-battle

Всеми любимая игра которая знакома с детства. В данной вариации игра происходит между двумя роботами.
- Базовая отрисовка на 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 палубных как в данный момент и также, когда бот попадает по моему кораблю, он стрелял на одну ячейку дальше в рандомном направлении, а не в случайную ячейку по всей карте его атаки, как сейчас. Также, не знаю как скрыть поле которое я атакую, чтобы показывались только подбитые мной корабли. Жду советов от знающих. Прошу не кидайте ссылки на чужие проекты, мне нужно объяснить на основе моего кода. Благодарю
![]()
Для того, чтобы вражеские корабли не отображались, пока их не подобьют в функции 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 , привязав его к тому же или другому файлу.