Java — морской бой — ищу команду. )


Содержание

игра морской бой

Дискуссии /

Инкубатор

22 фев 2013 15:41

ради практики создал консольную игру морской бой. графический интерфейс ещё не изучал, изучаю пока основы.
и не представляю насколько грамотно я её слепил. с удовольствием выкину джарник и исходники. вот только исходники довольно длинны . жаль что на форуме нету спойлеров.
кодировка UTF-8. джарник.
постараюсь кинуть исходник так.
но на всякий случай залил архив с исходным тексом сюда.

а также хочу спросить:
1)насколько грамотно сделано?
2)почему при выполнении в консоли поле боя компьютера и поле боя игрока переплетаются между собой ?? :-(
3) куда кидать длинные исходники чтобы легко было просмотреть? :-)

Изменен:22 фев 2013 12:42
24 фев 2013 22:46

Сперва замечания по игровому процессу:

Во-первых, рэндомная расстановка для кораблей игрока человека, имхо, совсем никуда не годится. Попробуйте реализовать нерэндомную по желанию игрока.
Во вторых, поля вокруг убитого корабля («ореол») неплохо бы метить как «dead», чтобы туда нельзя было сходить. Да и запретить ходить в такие ячейки тоже стоит, имхо.
Ходы хотелось бы делать, как «A1» а не как два ввода A и 1.
Ходы компьютера, можно бы сделать более интеллектуальными. Хотя бы чтобы он добивал раненых. Еще лучше, если получится реализовать какую-нибудь стратегию игры.
Плюс наличествуют орфографические ошибки. По крайней мере заметил одну. Если, конечно, не допустили ее спецЙально.

В объявлении методов которые могут вызвать исключение нет директивы throws.
Вы, как мне кажется, слишком злоупотребляете генерацией исключений. В данном случае, о большой нагрузке речи быть не может, но попробуйте убрать их там, где без этого можно обойтись.
Зачем вы объявили классы PlayerBF и CompBF финальными?
В методе attack нет выхода после выигрыша и победить могут оба игрока: сначала оба делают ход, а затем идет проверка, что кто-то выиграл.
Наконец, в комментарии Battlefield обозвали интерфейсом, хотя интерфейсов у Вас не объявлено. Это так к слову.

В целом же код читабельный, разобрался что к чему довольно быстро. Грубых ошибок не нашел.
А про «переплетение» полей в консоли — не понял о чем речь. У меня все ок.

Разработка игры «Морской бой»

Описание алгоритма хода ЭВМ в режиме «пользователь-компьютер» в игре «Морской бой». Описание совокупности классов, их полей и методов. Разработка интерфейса и руководства пользователя по проведению игры. Листинг программы, написанной на языке Java.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.03.2014
Размер файла 645,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Как известно, человек наделен интеллектом, а компьютер? Сейчас много говорят о так называемом искусственном интеллекте. У компьютера это, прежде всего память. Его оперативная память, предназначенная для быстрого использования, позволяет записывать и получать информацию за микросекунды.

Компьютер обладает большими возможностями по логической обработке информации, и его весьма обширный логический инструментарий непрерывно совершенствуется. Так же в программы компьютера могут быть заложены эвристические приемы, выработанные людьми при различных видах деятельности. Например, при построении программ для игры в шахматы используется опыт лучших шахматистов мира.

Конечно, люди имеют неоспоримые интеллектуальные преимущества перед компьютерами, но ведь компьютеры — это порождение высокоразвитого человеческого интеллекта, следовательно, взаимодействуя с ними, человек сталкивается по существу с модифицированным человеческим интеллектом.

И все же самое слабое место компьютера — его интеллект. Сейчас происходит необычно быстрое расширение сфер применения машинного интеллекта, но движение вглубь, в направлении совершенствования его механизмов идет медленно.

Человек использует компьютер либо в качестве партнера в игре, либо в качестве посредника при играх с другими людьми. А можно ли компьютер рассматривать как партнера? Ведь он не обладает эмоциями, чувствами, у него нет души и сердца. Конечно, разница между человеком и компьютером громадная, но человек передал компьютеру часть своего интеллекта, опыта, знаний, навыков с соответствующей эмоциональной окраской. Недаром говорят о дружественном программном обеспечении.

Компьютерные игры появились вместе с первыми компьютерами. По мере совершенствования машин совершенствовались и игры. Они заняли важное место в программном обеспечении ЭВМ. В производственной сфере они используются для обучения, психологической разгрузки персонала.


Среди бесчисленного множества компьютерных игр существует, всем нам хорошо известный с детства, “Морской бой”. Эта игра была “придумана” в 1931 году Милтоном Брэдли. Идея пришла во время первой мировой войны, в которой было много морских сражений. Хотя есть данные, что игра существовала в “бумажном” варианте существенно раньше, еще до Первой мировой войны, и истинный автор неизвестен. Ну а теперь существует много компьютерных версий, различающихся в основном лишь по оформлению.

Цель: разработать программу, реализующую игру «Морской бой» в режиме пользователь — компьютер.

Задачей данной курсовой считаю: достичь реализации данной цели наиболее оптимальными методами с использованием основных свойств объектно-ориентированного программирования.

1. Описание алгоритма хода ЭВМ

При создании данного алгоритма я опиралась исключительно на собственный опыт в игре “Морской бой”.

Замечание: ЭВМ все равно “знает”, где расположены все корабли, так как они хранятся в памяти. К тому же для осуществления хода нужно видеть игровую ситуацию. ЭВМ в данной игре лишь “делает вид”, что не знает расположение кораблей.

Итак, сначала осуществляется проход по всем кораблям на поле. Если очередной корабль уже убит, осуществляется переход к следующему.

Для каждого “живого” корабля вычисляется диапазон его повреждений, то есть начальная и конечная клетки из подбитых. Если диапазон не найден, значит, корабль не подбит, следовательно, его не видно на поле и ЭВМ “делает вид”, что не знает, где этот корабль и переходит к следующему. Если же диапазон найден, то возможны два случая.

Первый случай — подбита лишь одна клетка. Сначала вычисляются координаты этой клетки. Затем перебираются возможные варианты выстрелов — левее, правее, выше и ниже этой клетки. Отбрасываются варианты выстрелов за пределы поля, а также выстрелы по клеткам, по которым уже был осуществлен выстрел. Осуществляется выстрел по последнему возможному варианту.

Второй случай — подбито больше одной клетки. Вычисляются координаты начальной и конечной клеток диапазона. Далее опять два варианта — корабль может быть горизонтальным или вертикальным. Разница лишь в направлении. Если корабль горизонтальный, то проверяется сначала клетка слева. Если выстрел возможен, то он осуществляется. Если нет — аналогичным образом проверяется клетка справа. В случае вертикального корабля проверяются клетки сверху и снизу.

Если в одном из случаев был осуществлен выстрел, то был возврат из метода и управление не доходит до следующей части алгоритма.

Если ни одного выстрела не было сделано, следовательно, на поле нет подбитых кораблей. Осуществляется выстрел по случайной клетке, по которой еще не было выстрела.

Во всех случаях метод возвращает результат выстрела, возвращаемый методом shot(int x, int y), который осуществляет выстрел по указанной клетке.

Описанный в данной работе алгоритм опробован и используется для удовлетворения игровых потребностей, что подтверждает его эффективность.

2. Описание классов

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

Public class GameFrame extends JFrame — класс, реализующий окно игры, в том числе меню. Это главный класс программы в нем содержится метод main — так называемая точка входа в программу. Именно с этого метода начинается выполнение программы. Класс, реализующий окно игры, в том числе меню.

Данный класс содержит поле private Seabattle game — одно из наиболее важных полей этого класса, является экземпляром класса Seabattle, то есть это и есть сама игра. Остальные поля данного класса отвечают в основном за интерфейс программы.

Public static void main(String[] args) — как говорилось выше, это главный метод класса.

Класс public class Seabattle extends JComponent реализует саму игру «Морской бой».

Поля данного класса:

— private boolean settingShips — поле логического типа, определяющее режим игры. Значение true означает режим расстановки кораблей, значение false — режим боя.

— private boolean gameOver — поле логического типа, определяющее, закончена ли игра (true) или нет (false).

— private Field ownField — экземпляр класса Field (игровое поле), являющийся в данном классе полем игрока.


— private Field enemyField — экземпляр класса Field (игровое поле), являющийся в данном классе вражеским полем.

— private MouseAdapter mouseAdapter — слушатель событий мыши, отлавливающий щелчки мышью по полю и выполняющий нужные действия.

Public Seabattle(int fieldSize) — конструктор, создающий игровое поле определенного размера.

В данном классе описаны следующие методы:

— public boolean allShipsArePlaced()- метод, определяющий, все ли корабли на поле игрока расставлены.

— public void startGame()- метод, который инициирует начало боя.

— public boolean randomizeOwnField()- метод, расставляющий корабли на поле игрока на случайные позиции.

— public boolean randomizeEnemyField() — метод, расставляющий корабли на вражеском поле на случайные позиции.

— public void reset() — метод сброса игры. Очищает поля и устанавливает режим расстановки кораблей.

— public boolean gameIsOver() — метод, возвращающий значение поля gameOver, то есть определяющий, закончена ли игра.

— public void paint(Graphics g) — метод, отвечающий за то, как будет отрисовываться игра.

Класс, реализующий игровое поле — public class Field.

Данный класс имеет следующие поля:

— private int size — размер поля в клетках.

— private boolean[][] shots — массив выстрелов. Если значение shots[i][j] равно true, значит по клетке с координатами (i; j) в данной игре был сделан выстрел.

— private int lastShotX, lastShotY — координаты последнего выстрела по полю.

— private boolean isEnemyField — поле логического типа, определяющее, является ли поле вражеским.

— private final int maxShipSize — константа, определяющая максимально возможную длину корабля.

Public Field(int size, boolean isEnemyField) — конструктор, создающий поле указанного размера. В зависимости от второго параметра поле будет либо вражеским, либо полем игрока.

В данном классе описаны следующие методы:

— public boolean randomize() — метод, расставляющий корабли на поле случайным образом.

— public int addShip(Ship ship) — метод, добавляющий на поле корабль. Возвращает значение типа int: -2, если была попытка разместить корабль слишком близко к другому, -1, если была попытка разместить корабль за пределы поля, 0, если кораблей данного размера слишком много, 1, если размещение успешно.

— public void removeShip(Ship s) — метод, удаляющий указанный корабль с поля.

— public void clearField() — метод, очищающий поле от кораблей и выстрелов.


— public boolean hasShipAt(int x, int y) — метод, определяющий, есть ли корабль на поле по указанным координатам.

— public boolean isShipDead(Ship ship) — метод, определяющий, убит ли указанный корабль.

— public Ship getShipAt(int x, int y) — метод, возвращающий корабль, расположенный по указанным координатам. Если корабля там нет, то возвращает null.

— public void setSizeOfShip(Ship ship, int newSize) — метод установки размера для указанного корабля.

— public void rotateShip(Ship ship) — метод поворота указанного корабля.

— public int shot(int x, int y) — метод выстрела по полю по указанным координатам. Возвращает значение типа int: -1, если выстрел был за пределы поля или в уже подстреленную клетку, 0, если было попадание в пустую клетку, 1, если было попадание в корабль.

— public int smartShot() — метод, осуществляющий «умный» выстрел по полю, то есть выстрел, который пытается добить уже ранее подбитые корабли.

— public boolean hasShotAt(int x, int y) — метод, определяющий, был ли в данной игре осуществлен выстрел по указанной клетке.

— public int getLastShotX() — метод получения координаты x последнего выстрела по полю.

— public int getLastShotY() — метод получения координаты y последнего выстрела по полю.

— public boolean allShipsArePlaced() — метод, определяющий, все ли корабли на поле расставлены.

— public boolean isDefeated() — метод, определяющий, «побеждено» ли поле, то есть все корабли на нем убиты.

— public void paint(Graphics g, int x, int y) — метод, отвечающий за то, как будет отрисовываться поле.

— public boolean isValid(Ship changedShip) — метод, определяющий, является ли поле действительным, т.е. в нем нет пересечений кораблей и все корабли находятся в пределах поля.

И последний класс, реализующий корабль — public class Ship.

В данном классе имеются следующие поля:

— private int xPos — координата x корабля на поле.

— private int yPos — координата y корабля на поле.

— private int size — длина корабля.

— private boolean horizontal — поле логического типа, определяющее ориентацию корабля, то есть, является корабль горизонтальным или нет.

Public Ship(int xPos, int yPos, int size, boolean horizontal) — конструктор, создающий корабль с указанными координатами, размером и ориентацией.

Опишем методы класса:

— public boolean contains(int x, int y) — метод, определяющий, стоит ли корабль на указанной клетке.

— public boolean overlaps(Ship s) — метод, определяющий, правильно ли корабли стоят относительно друг друга, то есть не пересекаются и не соприкасаются.


— public int getXPos() — метод, возвращающий координату x корабля.

— public int getYPos() — метод, возвращающий координату y корабля.

— public int getEndXPos() — метод, возвращающий координату x конечной клетки корабля.

— public int getEndYPos() — метод, возвращающий координату y конечной клетки корабля.

— public void setSize(int newSize) — метод установки размера корабля.

— public void rotate() — метод поворота корабля.

— public boolean isHorizontal() — метод, определяющий ориентацию корабля, то есть, является корабля горизонтальным или нет.

3. Руководство пользователя

Программа “Морской бой” обладает доступным, интуитивно понятным интерфейсом, который позволит пользоваться данным приложением неопытным пользователям.

На игровой площадке размером 10 на 10 клеток Игрок расставляет один корабль размером четыре клетки, два корабля размером три клетки, три корабля размером две клетки и четыре корабля размером в одну клетку (для облегчения корабли расставляются автоматически). При этом корабль представляет собой последовательность соседних клеток, стоящих на одной вертикали или на одной горизонтали. Соседние корабли не должны иметь общих точек. Противником Игрока является Компьютер, который автоматически расставляет корабли на своем поле по указанным выше правилам.

После расстановки начинается бой. Он представляет собой поочередные выстрелы Игрока и Компьютера. При попадании в корабль противника участник боя получает возможность проведения внеочередного выстрела. Игра заканчивается при уничтожении одним из участников всех кораблей противника.

Чтобы начать игру заново, необходимо нажать кнопку «Новая», расположенную в меню, в верхнем левом углу окна. Здесь же кнопка “Выход”.

алгоритм игра java пользователь

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

Используя среду программирования NetBeans IDE 7.3, мною было создано Java-приложение, реализующее игру “Морской бой”, с помощью данной программы пользователь может насладиться игрой в режиме пользователь — компьютер.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Дейтел, Х.М. Как программировать на Java [учеб. пособие] / Х.М. Дейтел, П.Дж. Дейтел ; пер. с англ. под ред. В.В. Тимофеева. -М. : Бином-Пресс, 2006. — 663 с.

2.Семочкин, А.Н. Язык программирования Java : учеб.пособие для вузов / А.Н. Семочкин ; М-во образования и науки РФ, Федеральное агентство по образованию [и др.]. — 2-е изд., перераб. И доп. — Благовещенск : Изд-во БГПУ, 2009. — 89 с.

3.Монахов, В.В. Язык программирования Java и среда NetBeans : [учеб. пособие] / В.В. Монахов. — 3-еизд., перераб. и доп. — СПб. : БХВ-Петербург, 2011. — 703 с.

Метод, осуществляющий «умный» выстрел по полю, то есть выстрел, который пытается добить уже ранее подбитые корабли:

public int smartShot() <

for (Ship ship : ships) <

int shipHitStartOffset = -1,

int x = ship.getXPos(),


for (int i = x; i -1 && shipHitEndOffset == -1) <

shipHitEndOffset = posOnShip — 1;

if (shipHitStartOffset == -1 && shipHitEndOffset == -1) <

if (shipHitStartOffset > -1 && shipHitEndOffset == -1) <

shipHitEndOffset = ship.isHorizontal() ? ship.getEndXPos() : ship.getEndYPos();

if (shipHitStartOffset == shipHitEndOffset) <

int shotX = (ship.isHorizontal() ? x + shipHitStartOffset : x);

int shotY = (ship.isHorizontal() ? y : y + shipHitStartOffset);

int optionX = 0, optionY = 0;

boolean optionalShotIsPossible = true;

for (int i = 0; i = size || optionY >= size

return shot(optionX, optionY);

int startShotX = (ship.isHorizontal() ? x + shipHitStartOffset : x);

int startShotY = (ship.isHorizontal() ? y : y + shipHitStartOffset);

int endShotX = (ship.isHorizontal() ? x + shipHitEndOffset : x);

int endShotY = (ship.isHorizontal() ? y : y + shipHitEndOffset);

if (startShotX > 0 && !shots[startShotX — 1][startShotY]) <

return shot(startShotX — 1, startShotY);

if (endShotX 0 && !shots[startShotX][startShotY — 1]) <

Java — «морской бой» — ищу команду. :)

Создал тут проект игры «Морской бой» на Java. Проект скомпилирован в Netbeans под Java 8, но может быть открыт (или быстро адаптирован при необходимости) и в Eclipse или IntelliJ IDEA. Готовая программа (jar файл) тестировалась под Windows 7 и Ubuntu 16.

Игра может вестись на поле от 6 до бесконечности (теоретически). Можно поставить клеток кораблей пропорционально стороне поля. То есть 6 – 6, 7 – 7 и т.д. Общие клетки не могут быть соединены по диагонали или быть буквой «Г». Можно играть вдвоем (по очереди на одном поле) или с компьютером (2 уровня сложности). Первый уровень – случайная стрельба; второй – вокруг «подбитой» клетки, но не по диагонали.

Игра включает в себя две сетки (карта своих карта атаки), расположенные в JFrame.


Используемые шаблоны проектирования: MVC

GUI Framework: Swing

  • Setting.java – первоначальный экран с настройками.
  • BattleShipPro.java – основной файл проекта. Вызывает настройки и хранит их в полях.
  • Model.java — предоставляет данные и реагирует на команды контроллера, изменяя своё состояние.
  • Viev.java — отвечает за отображение данных модели пользователю, реагируя на изменения модели.
  • Controller.java — интерпретирует действия пользователя, оповещая модель о необходимости изменений.

Статистика

Статистика игроков хранится в файле stat.csv – обычный текстовый файл в UTF-8, разделитель точка с запятой. Записываются победы и поражения.

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

Java — «морской бой» — ищу команду. :)

Базовая реализация игры Морской бой.

  • Настроить config/web.php и config/console.php
  • Сделать директорию web доступной через web-сервер.
  • Запустить сервер используя команду php yii server/start
  • © 2020 GitHub , Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help

You can’t perform that action at this time.

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.

Морской бой на javascript


Вот полный код игры морской бой на javascript. Упор делался на максимальную простоту, поэтому расстановка кораблей и интеллект компьютера предельно примитивны.

А вот как работает этот javascript код игры морской бой:

Читайте также:

5 Коммент.

sea battle script не отображается

Скрипт обновлен – можете проверить и поиграть в морской бой прямо на этой странице.

Не получается доработать ваш код, необходимо сделать очки за попадания:
1е попадание по кораблю 5 очков,
2е попадание -4, последующие по 3очка.
Если корабль уничтожен – 10 очков.
Если умирает одиночный, то и 5 очков и 10 дается.
Благодарю за помощь!

Не пойму как играть в эту игру. Спасибо за простоту кода хотя не такой уж он и простой.

Не такая уж она и простая. Может кто-то напишет программу с одинарными кораблями и одним полем? Спасибо.

«Морской бой» на Java

Добрый вечер,
Пожалуйста, помогите с написанием программы «Морской бой» в виде Java Desktop Application. Исходные коды, найденные в Сети, написаны либо на С/C++, либо Delphi и др.

P.S. С языком Java знакома только поверхностно :(

6 ответов

Так-то да, но работу нужно сдавать уже завтра %) Случай, конечно, провальный, но, пока я методом тыка ковыряюсь в NetBeans, может найдется уже готовый исходник? ^^^’

P.S. Java не Си, чтобы выучить его за одну ночь >.

Все нюансы Си я, конечно, в ту ночь не разобрала, но основы синтаксиса стали вполне понятны. Керниган и Ритчи *_*

Возвращаясь к морскому бою, сейчас застряла на прорисовывании поля для игры. Мозг перестал соображать и усиленно не хочет понимать, каким образом реализовать клеточки, их закрашивание и размещение на jPanel. Подскажите, пожалуйста.

хрен с ним, что сама написать не можешь / не хочешь, но можно было заранее найти готовое или того кто согласится написать?

P.S. Это я как преподаватель информатики спрашиваю :D

Можно было. Признаю, что поздновато спохватилась. И бьюсь головой об клавиатуру :(

Как выиграть в игре Морской Бой

Вы играете в морской бой, но не всегда выигрываете? Тогда вам наверняка интересно узнать, как существенно повысить свои шансы на выигрыш, как правильно расставить корабли, как быстро уничтожить корабли противника и, конечно же, как выиграть в игре Морской бой !

Содержание [убрать]

Правила игры «Морской Бой»


Существует множество вариантов морского боя, но мы с вами рассмотрим наиболее распространённый вариант со следующим набором кораблей:

Все перечисленные корабли должны быть размещены на квадратном поле 10 на 10 клеток, при этом корабли не могут соприкасаться ни углами, ни сторонами. Самое игровое поле нумеруется сверху вниз, а вертикали помечаются русскими буквами от «А» до «К» (при этом буквы «Ё» и «Й» пропускают).

Рядом рисуется вражеское поле аналогичного размера. При удачном выстреле по кораблю противника на соответствующей клетке вражеского поля ставится крестик и производится повторный выстрел, при неудачном выстреле в соответствующей клетке ставится точка, и ход переходит к противнику. Оптимальная стратегия

Как выиграть в игре Морской Бой

В игре морской бой всегда есть элемент случайности, но его можно свести к минимуму. Прежде чем переходить непосредственно к поиску оптимальной стратегии, необходимо озвучить одну очевидную вещь: вероятность попасть по кораблю противника тем выше, чем меньше непроверенных клеток осталось на его поле, аналогично вероятность попадания по вашим кораблям тем ниже, чем больше непроверенных клеток осталось на вашем поле. Таким образом, для эффективной игры нужно научиться сразу двум вещам: оптимальной стрельбе по противнику и оптимальному своих размещению кораблей.

В дальнейшем объяснении будут использоваться следующие обозначения:

Как стрелять по кораблям противника

Первым и самым очевидным правилом оптимальной стрельбы является следующее правило: не стрелять по клеткам непосредственно окружающим уничтоженный корабль противника.

В соответствии с принятыми выше обозначениями, на рисунке жёлтым отмечены те клетки, по которым уже были произведены безуспешные выстрелы, красным отмечены клетки, выстрелы по которым закончились попаданием, а зелёным отмечены клетки, стрельба по которым не производилась, но можно гарантировано утверждать, что кораблей в них нет (кораблей там быть не может, т.к. по правилам игры корабли не могут соприкасаться).

Из первого правила сразу вытекает второе: если вам удалось подбить вражеский корабль, необходимо сразу же его добить, чтобы как можно раньше получить список гарантировано свободных клеток.

Третье правило вытекает из первых двух: необходимо в первую очередь пытаться подбить самые крупные корабли противника. Возможно, для вас это правило не очевидно, но если немного подумать, то можно легко заметить, что уничтожив вражеский линкор, мы в лучшем случае получим информацию сразу о 14 гарантировано свободных клетках, а уничтожив крейсер, всего о 12.

Оптимальная стратегия стрельбы

Т.о. оптимальную стратегию стрельбы можно свести к целенаправленному поиску и уничтожению самых крупных кораблей противника. К сожалению, сформулировать стратегию мало, необходимо предложить способ её реализации.

Для начала давайте рассмотрим участок игрового поля размером 4 на 4 клетки. Если в рассматриваемом участке есть вражеский линкор, то его гарантировано можно подбить не более чем за 4 выстрела. Для этого надо стрелять так, чтобы на каждой горизонтали и вертикали было ровно по одной проверенной клетке. ниже представлены все варианты такой стрельбы (без учёта отражений и поворотов).

Среди всех этих вариантов, оптимальными на поле 10 на 10 клеток являются только первые два варианта, гарантирующие попадание в линкор максимум за 24 выстрела.

После того, как уничтожен вражеский линкор, необходимо начинать поиск крейсеров, а затем и эсминцев. При этом, как вы уже догадались, можно воспользоваться аналогичной методикой. Только теперь необходимо разбивать поле на квадраты со стороной в 3 и 2 клетки соответственно.

Если при поиске линкора вы использовали вторую стратегию, то для поиска крейсеров и эсминцев вам необходимо стрелять по следующим полям (зелёным отмечены поля, по которым вы уже стреляли при поиске линкора):

Для поиска катеров оптимальной стратегии не существует, поэтому в конце игры приходится опираться в основном на удачу.

Последовательность лучших ходов для начала игры

Если обратиться к математической теории, то можно построить карту вероятности размещения кораблей:

Исходя из этой карты, последовательность «лучших ходов» при постоянных промахах выглядит так (см. рисунок):

C1, J8, A8, H1, A4, J4, D10, G10, E1, D2, B3, A2, C9, B10, H9, I10, I7, J6, I5, H6, J2, I3, H4, G5, G2, F3, E4, B7, A6, B5, C6, C3, D4, D5, F6.

Как расставить корабли

Оптимальная стратегия размещения кораблей в некотором смысле обратна оптимальной стратегии стрельбы. При стрельбе, мы пытались найти самые крупные корабли, чтобы сократить количество клеток, которые нужно проверять, за счёт гарантировано свободных клеток. Значит, при размещении корабли надо ставить таким образом, чтобы в случае их потери минимизировать количество гарантировано свободных клеток. Как вы помните, линкор в центре поля открывает для противника сразу 14 полей, но линкор, стоящий в углу, открывает для противника всего 6 полей:


Аналогично, крейсер, стоящий в углу, вместо 12 полей открывает всего 6. Т.о., разместив крупные корабли вдоль границы поля, вы оставляете больший простор для катеров. Т.к. стратегии для поиска катеров нет, противнику придётся стрелять наугад, и чем больше свободных полей у вас останется к моменту ловли катеров, тем тяжелее будет выиграть противнику.

Ниже представлено три способа размещения крупных кораблей, которые оставляют большой простор для катеров (отмечено синим):

Каждая из приведённых расстановок оставляет для катеров ровно 60 свободных клеток, а это значит, что вероятность случайно попасть в катер составляет 0,066. Для сравнения стоит привести случайную расстановку кораблей:

При такой расстановке для катеров остаётся всего 21 клетка, а это значит, что вероятность попадания по катеру составляет уже 0,19, т.е. почти в 3 раза выше.

В заключение хочу сказать, что не стоит проводить уж слишком много времени, играя в морской бой. Особенно хочу предостеречь вас от игры на лекциях. Когда я сидел в Ваби-Саби и играл в морской бой со своей девушкой, мимо прошла официантка и сказала, что она весьма неплохо играет, т.к. много практиковалась на парах. Кто знает, кем бы она работала, если бы в своё время слушала лекции?

Морской бой, размещение корабля метод Java

Я пытаюсь сделать игру Battleship для проекта универа.

Описание проекта говорится, что в одном из классов (абстрактный класс Ship) Я должен создать метод, называемый placeShip, который помещает корабль на борту. Он должен преобразовать тип ячейки платы (так что тип корабля) и указывает на то, что мы поставили корабль в этом положении. Он также должен содержать идентификаторы, которые определяют StartingCell, ориентацию корабля и какой из 2-х досок будут корабли будут размещены в (пользователя или ПК).

Способ также может содержать логический параметр Verbose, что указанный или не печатаются или не диагностические сообщения.

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

Java — «морской бой» — ищу команду. :)

Двадцать лет спустя Третьей мировой войны последние выжившие люди прячутся на станциях и в туннелях московского метро, самого большого на Земле противоатомного бомбоубежища. Поверхность планеты заражена и непригодна для обитания, и станции метро становятся последним пристанищем для человека. Они превращаются в независимые города-государства, которые соперничают и воюют друг с другом. Они не готовы примириться даже перед лицом новой страшной опасности, которая угрожает всем людям окончательным истреблением. Артем, двадцатилетний парень со станции ВДНХ, должен пройти через все метро, чтобы спасти свой единственный дом – и все человечество.

«Метро 2033» – культовый роман-антиутопия, один из главных российских бестселлеров нулевых. Переведен на 37 иностранных языков, заинтересовал Голливуд, превращен в атмосферные компьютерные блокбастеры, породил целую книжную вселенную и настоящую молодежную субкультуру во всем мире.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих