Морской бой java
Игра Морской бой на JavaScript. Рандомная расстановка кораблей.
Вступление.
Игру «Морской бой», думаю, представлять не надо. Вряд ли найдётся хоть один человек, который хотя бы раз не играл в неё. Давайте и мы создадим полноценный «Морской бой», используя HTML-вёрстку для отображения структуры игры на экране монитора, визуально оформим её с помощью таблицы стилей, а с помощью чистого JavaScript напишем «движок», определяющий поведение игры.
Начнём с того, что словами опишем, как будет выглядеть наша игра, сколько и каких будет в ней кораблей, как будут расставляться корабли, каким образом будет происходить управление выстрелом и искусственный интеллект компьютера по ведению морского боя в качестве нашего противника.
Как говорится — лучше один раз увидеть. На приведённом ниже скриншоте прекрасно видно, что представляет из себя игровое поле, сколько типов кораблей, в зависимости от количества палуб будет в эскадре, как выглядит промах, попадание и отметка, где корабля точно быть не может.
Надеюсь всё всем понятно. Ну а теперь составим техническое задание, чтобы ничего не забыть и не пропустить.
Техническое задание на создание игры «Морской бой»
Количество и типы кораблей, их расположение.
Как и в реальной игре, эскадра будет состоять из:
— одного четырёхпалубного;
— двух трёхпалубных;
— трёх двухпалубных;
— четырёх однопалубных кораблей.
Корабли могут располагаться вертикально и горизонтально, но при этом между кораблями должна быть хотя бы одна пустая клетка, в том числе и по диагонали. Корабли не могут иметь Г-образную форму.
Расстановка кораблей и редактирование их положения.
Корабли игрока могут расставляться по случайному закону или самим игроком, путём перетаскивания их на игровое поле. И в первом, и во втором случае можно редактировать направление положения палуб (вертикальное или горизонтальное), путём клика правой кнопкой мышки по первой палубе и расположение, путём перетаскивания. Первая палуба — при горизонтальном расположении корабля — самая левая, при вертикальном — самая верхняя.
При перетаскивании или повороте корабля скрипт постоянно отслеживает корректность координат корабля. Если корабль будет соприкасаться с соседним или выходить за пределы игрового поля, то рамка корабля окрасится в красный цвет, а корабль, после отпускания кнопки мышки, вернётся в исходное положение. В противном случае, рамка корабля будет зелёная.
Нет необходимости пытаться установить корабль точно по границам клеток — программа сама откорректирует его положение, установив в ближайшие валидные координаты.
В момент начала игры, редактирование положения кораблей отключается.
Ведение морского боя
Если сражение первое, рандомно определяем, кто стреляет первым. Далее, первым стреляет победитель.
Координаты выстрела передаются путём клика по выбранной клетке — ввода координат с клавиатуры не будет.
Попадание отмечается красным крестиком, промах — точкой, клетку, где корабля точно быть не может, отмечаем / снимаем отметку кликом правой кнопкой мышки.
Сообщений «ранил», «убил / потопил» не будет — самостоятельно определяем тип корабля.
Под игровыми полями выводятся сообщения о том, чей выстрел и результат выстрела.
Искусственный интеллект противника.
Для ведения морского боя, компьютер должен обладать хотя бы примитивным искусственным интеллектом. Он должен уметь:
— формировать координаты выстрела, согласно заложенного алгоритма ведения морского боя.
— при попадании в палубу корабля, продолжить его обстрел, пока корабль не будет потоплен.
— отмечать клетки, куда стрелять не имеет смысла и исключать координаты этих клеток из матрицы возможных выстрелов.
На этих требования к ИИ мы пока и остановимся, хотя можно рассмотреть варианты размещения кораблей компьютером, при которых сильно уменьшается вероятность попадания в однопалубные корабли.
Окончание морского боя.
Выводится сообщение о победителе. Если выиграл компьютер, то отображаются его не потопленные корабли.
HTML-вёрстка для игры «Морской бой».
При создании HTML страницы, наша главная задача — воспроизвести внешний вид игрового поля морского боя максимально похожий на тот, к которому вы привыкли, играя на тетрадочных листах. Разметка HTML не сложная и будет включать в себя следующие основные блоки:
- Основной родительский элемент, background которого похож на лист тетрадки в клетку.
- Два игровых поля — игрока, где мы будем расставлять свои корабли и контролировать выстрелы компьютера, и компьютера, где мы будут отмечаться наши попадания и промахи. Им задаётся background в виде рамки размером 10х10 клеток с буквенным обозначением строк и цифровым обозначением колонок.
- Контейнер с инструкцией по ручной расстановке кораблей и набором кораблей, которые необходимо перетащить на своё игровое поле.
- Два блока, верхний и нижний, для вывода информационных сообщений.
- Кнопка запуска игры.
Первоначально, при загрузке страницы, в контейнере инструкции отображаются только элементы для выбора способа размещения кораблей:
— рандомное размещение при помощи js-скрипта;
— самостоятельное размещение игроком.
Кнопка запуска игры изначально не видна. Она появится только после того, как игрок разместит свои корабли.
Пишем свой Морской Бой , на пути к успешной курсовой. (часть1)
Здравствуйте уважаемые читатели !
Сегодня хотелось бы посвятить свой пост разработке классической ,уже ставшей символом школьной поры ,игры.
Речь у нас пойдет об игре «Морской бой». Разработку мы будем вести на языке C++ в среде Visual Studio. Сам я люблю писать на C# ,но в ТЗ к моей курсовой были указаны языки C/C++.
Графику прикрутим ближе к концу , так же постараемся реализовать ИИ.
Пост не следует рассматривать как руководство для совсем новичков, я буду стараться разжевывать все что делаю достаточно тщательно ,приводить блок схемы алгоритмов и основные формулы(если будет не лень),но эта серия постов выйдет скорее как дневник разработчика ,который чуть было не завалил сессию 🙂
В постах часто будет рерайт некоторых статей с хабра и других тематических форумов
потому что они написаны достаточно грамотно и смысла их исправлять и коверкать я не вижу
1.Для начала разберемся с основными правилами игры и вообще построим у себя в голове образ будущего творения.
О самой игре говорить много наверно не стоит ,каждый кто учился в школе так или иначе знает правила,но если кратко то : У нас есть 1 корабль который занимает четыре клетки
2 корабля которые занимают три клетки , 3 корабля на две клетки , и 4 лодки размером с одну клетку. корабли должны быть расставлены так чтобы между ними обязательно была одна пустая клетка.
вообще для прототипа игры я сделаю консольную версию приложения ,протестирую на ней механику а потом если успею прикручу графику (это я уже указывал строк на 20 выше)
Чтобы не сильно засыпать вас текстом , прилагаю картинку игрового поля
2. Создаем проект приложения win32 на C++ в Visual Studio
С названием не заморачиваемся, да простят меня обладатели авторских прав, данный проект сугубо для личного использования.
В следующем окне поставим галочку напротив MFC ,на тот случай если все таки дойдем до графического интерфейса 🙂
3. Проект создан ,выглядит он вот так(можно кликнуть на картинку и разглядеть получше,сравнить со своим результатом).
Компилируем и молимся чтоб все работало ,по итогу после запуска приложения в таком виде
появится консоль и сразу же исчезнет , это нам скажет о том что все успешно собралось и вам не нужно переустанавливать это детище мелко-мягких(мне пришлось поставить студию дважды и только тогда все нормально скомпилировалось).
Теперь давайте создадим класс игрока , не будем сильно оригинальничать и назовем его Player, он будет описывать и игрока и компьютер и в нем будут методы расстановки кораблей и стрельбы ,но до стрельбы нужно дожить)
После этого у нас появились 2 новых файла в проекте ,они обведены красным
идем в главный класс и подключаем нужные нам библиотеки ,это будут clocale, conio.h, stdlib.h, iostream, ctime
пока не паримся для чего они нужны ,позже я обязательно это расскажу
Вообще это надо было сделать в начале ,но ваш покорный слуга не очень то и соображает без ударной дозы кофеина ,в следующем посте обязательно это исправим.
Далее идем в наш Заголовочный файл и вставляем туды строчку с определением
направления нашего корабля,чтобы мы могли дальше использовать эти данные при обозначении методов класса Player
теперь идем в наш Player и создаем там основные методы которые нам пригодятся
метод «set» -устанавливает корабль ,от значения переданной ему переменной ,можно догадаться о количестве палуб
метод «ships_init» — собственно инициализирует массив с кораблями
методы «turn» — в зависимости от ссылки отвечают за ход компьютера или игрока
метод «place _ship» — вызывается из метода set и описывает направление и координаты нашего кораблика
далее мы размещаем нужные нам для фунциклирования переменные :
ну вот и конец первой части ,можно компилировать наш обрубок и смотреть на наличие ошибок
Повторюсь ,пост не ставит целью вас научить ,я просто веду маленьких дневничок своей костыльной разработки
и почти использую материалы с открытых ресурсов
если получу хоть небольшой положительный отклик выложу следующую часть завтра
Принимаю тапочки на кривизну моего кода ,я знаю что могу ошибаться во многих местах и буду крайне благодарен если вы исправите мои недочеты )