Как правильно играть в морской бой — настольную игру на двоих и на листочках
Время на чтение: 30 минут
АА
Среди всех настольных игр «Морской бой» занимает особое место. В нем есть азарт, стратегия, тактические маневры. Но самое главное, он тренирует память, внимательность и позволяет двум, даже незнакомым друг и другом людям, хорошо провести свободное время.
Правила игры «Морской бой» может освоить и ребенок. У этой забавы нет возрастного ценза. Если человек знает буквы алфавита и цифры, то можно смело брать в руки листки бумаги, карандаши и приступать к размещению собственного флота.
Содержание
- «Морской бой» – общее описание настольной игры
- Виды настольной игры «Морской бой»
- Как на самом деле правильно играть в «Морской бой»
- Правила морского боя на бумажных листах
- Как создать поле
- Сколько должно быть кораблей и как их разместить
- Условия и очередь ходов
- Существует ли стратегия и тактика в игре морской бой
- Ограничения в игре морской бой
- Видео-советы, как играть в морской бой
«Морской бой» – общее описание настольной игры
Прежде всего, стоит сказать, как выглядит игра морской бой на самом деле. Он рассчитан на двух участников. Третьему просто будет нечего делать, и он будет скучать. Подсказывать нечестно, подглядывать в листок соперника тоже. Поэтому между обоими противниками выставляется настольный барьер. Им может служить книжка на держателе или другой предмет.
Как играть в морской бойКак играть в морской бойКак играть в морской бойЦель игры – потопить флот соперника прежде, чем потерять свой. Известно, что такие настольные баталии были популярным времяпрепровождением в дореволюционной России. Тогда для забавы изготавливались специальные фишки в виде кораблей. Сегодня их просто рисуют. Во-первых, это удобно. Во-вторых, можно играть в любом месте. Прекрасным образцом игры в домашних условиях являются красочные издания, где события разворачиваются на живописных океанических просторах.
В продаже имеются складной и портативный варианты игры. Они представляют собой небольшие боксы с готовыми полями и фишками, которые можно брать с собой в дорогу.
Виды настольной игры «Морской бой»
Кроме классической версии, существует несколько видов «Морского боя»:
- «Залп». Усложненный вариант. Вместо трех выстрелов, которые обычно даются за один ход в «классике», здесь выполняется семь. Однопалубные корабли отсутствуют. На их место встают два эсминца (занимают по 2 клетки) – дает 3 выстрела, за попадание в крейсер (3 клетки) – два, за линкор (5 клеток) по одному залпу. Сложность заключается в том, что соперник не конкретизирует, где точно подорвались его корабли. Только уточняет, какие из них были подбиты. Если объект был потоплен, то игрок теряет в следующем ходе столько единиц, сколько имел «убитый» корабль. Например, уничтожение линкора сократит количество выстрелов с семи до четырех.
- Вариант игры от компании «Милтон Брэдли». В баталиях участвуют пятипалубный, четырехпалубный, 2 трехпалубных и один двухпалубный военные корабли.
- Морской бой от Пелермана предполагает классический набор кораблей. Изюминкой является добавление мины. Она может располагаться на любой клетке. Вписывается в виде кружка. Она не должна соприкасаться с кораблями. Если соперник попадает на данную клетку, то он наносит урон своему флоту, а владелец мины получает право на дополнительный ход.
Еще одной баталией является расширение поля боя. Обычный размер составляет 10х10 клеток. Его можно расширить до 16х16, тем самым раскидав свои корабли на отдалении друг от друга.
С момента появления компьютерных игр разработчики «Морского боя» не обошли стороной его онлайн-версию. Можно сражаться на расстоянии по сети или испытать себя в баталии против искусственного интеллекта. Одна из версий разработана по заказу Министерства обороны РФ.
Как на самом деле правильно играть в «Морской бой»
Рассмотрим классический вариант, как играть в морской бой. За основу берется поле размером 10 на 10 клеток. Его можно нарисовать на обычном листе бумаги.
Затем нужно разместить корабли таким образом, чтобы они не соприкасались бортами. Выстрелы производятся по очереди. Попадание дает право повторного хода. Промах фиксируется в клетке точкой, попадание крестиком.
Всегда рисуется два поля. На одном отмечаются выстрелы противника по своим кораблям, на другом мониторят собственные залпы по дислокации вражеского флота.
Для того, чтобы произвести выстрел, нужно сказать букву и цифру, соответствующие выбранной клетке. Это координаты расстановки судов. Если будет попадание, то соперник должен сказать, ранен корабль или потоплен. Обычно употребляются термины «Попал» и «Убил». Из получаемой картинки можно стратегически предугадать, как расположен вражеский флот, придумать собственную тактику игры в морской бой.
Правила морского боя на бумажных листах
В игровых комплектах, произведенных на фабриках, обязательно присутствует инструкция. Задача статьи рассказать, как правильно играть в морской бой на самодельных полях. Правила игры в морской бой, как настольной игры на двоих, настолько просты, что их легко освоить самостоятельно и научить тех, кто еще не сталкивался с этой увлекательной забавой.
Как создать поле
За основу берется бумажный листок в клетку. Можно разлиновать и обычный А4. Размер – 10 на 10 клеток.
Как рисовать игру морской бой:
- обозначения координат выполняются следующим образом – буквы прописываются по горизонтали (верхняя часть квадрата), цифры – по вертикали с левой стороны. Для удобства берутся первые буквы алфавита, включая «Ё», и первые числа с 1 до 10.
- изначально размечают 2 одинаковых поля, на одном расставляют свои корабли, второе остается пустым;
Мнение эксперта
Степаненко Дмитрий Юрьевич
Продавец в магазине настольных игр
Вместо скучного алфавита часто используют слово «РЕСПУБЛИКА». В нем буквы не повторяются, а бой приобретает суровую военную романтику, ведь сражение ведется за свободу своей страны.
Сколько должно быть кораблей и как их разместить
В классической раскладке участвуют:
- 1 четырехпалубный линкор,
- 2 трехпалубных крейсера,
- 3 двухпалубных эсминца,
- 4 однопалубных торпедных катера.
Одна палуба занимает одну клетку. Все корабли должны быть прямыми, не допускается Г-образные или П-образные конструкции.
Зазор между ними должен составлять как минимум одну клеточку. Расставлять флот можно так, как хочется, при этом занимать края поля не запрещается.
Условия и очередь ходов
Теперь немного о том, как играть в Морской бой. После разлиновки и расстановки флота игроки бросают жребий и определяют, кто будет ходить первым. Затем производятся выстрелы. Если игрок попал в корабль противника, тот должен сказать – попал или потопил. На своем листке он помечает пробитый отсек судна крестиком.
То же самое делает его соперник на своем поле. Попавший имеет право на еще один выстрел. Если торпеда пролетела мимо, то ход переходит противнику.Корабли могут быть потоплены или подорваны, оставаясь на плаву. С одного выстрела уничтожаются только однопалубные суда, занимающие одну клетку.
Победителем считается тот, кто быстрее уничтожит флот соперника, состоящий из 10 боевых кораблей.
Существует ли стратегия и тактика в игре морской бой
Стратегия игры в морской бой разрабатывается с самого начала, т.е. с момента расстановки кораблей. Пелерман предлагает свои стратегические правила, как играть в морской бой.
По его расчетам, сложнее уничтожить флот, если размещать объекты следующим образом:
- Вокруг каждого судна создавать ореол. Он может достигать шириной от одной до нескольких клеток, помещая боевую единицу в «квадрат».
- Многоклеточные корабли располагать в одном из углов поля.
- Однопалубные объекты раскидывать по всему оставшемуся периметру.
В результате неисследованная площадь уменьшается намного медленнее, чем в случае равномерного распределения судов по всему полю.
Тактика того, как играть в морской бой, также проста. Зная, что многопалубные корабли прямые и занимают несколько клеток, при «ранении» одного из них необходимо следующим выстрелом прощупать соседнее пространство.
Отмеченные на втором поле холостые выстрелы и точные попадания вырисовывают картину боевых действий, по которой можно вычислить расположение кораблей противника.
Ограничения в игре морской бой
Правила настольной игры «Морской бой» имеют несколько ограничений:
- Если игрок производит изменения на своем поле во время игры, то он действует нечестно. По этой причине для разлиновки листа бумаги и расстановки кораблей применяется ручка или химический карандаш. Это необходимо для того, чтобы участник не смог стереть изначальную позицию и нарисовать новую или добавить лишний корабль.
- Недостаточное количество кораблей. Если соперник нарисовал не все боевые суда, то он нарушил правила игры «Морской бой» на листочках. В начале это невозможно проверить, так как дислокация флота держится в секрете. Но в конце партии правда в любом случае всплывет наружу.
- Неверные размеры поля. Существует традиция, как играть в морской бой на листке бумаги. Чтобы не ошибиться в размерах, применяется точная система координат – 10 букв и 10 цифр. В готовых комплектах, которые продаются в магазинах, разметка уже нанесена.
- Нарушением считается такое расположение кораблей, когда они касаются друг друга бортами. Между ними обязательно должно быть пространство минимум в одну клетку.
- Нельзя подглядывать в листок противника.
Мнение эксперта
Степаненко Дмитрий Юрьевич
Продавец в магазине настольных игр
Игрок, нарушивший правила, как играть в морской бой, признается побежденным. К тому же он может потерять репутацию честного соперника, и с ним никто больше не сядет вместе за игровой стол.
«Морской бой» рекомендуется участникам любых возрастов. По мнению психологов, игра учит детей тактике и тренирует память. Через игровой процесс они могут выучить начальные буквы алфавита и первый цифровой ряд. Для взрослых это развлечение остается любимым на протяжении всей жизни. Нет ничего проще, чем найти два листка бумаги, ручки, разлиновать поля и устроить баталию двух непобедимых армад.
Видео-советы, как играть в морской бой
youtube.com/embed/RMkranodiQ4?feature=oembed» frameborder=»0″ allow=»accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture» allowfullscreen=»»/>Написано статей
Adblock
detector
Python. Напишем морской бой с достойным соперником-ИИ — Офтоп на DTF
Всем привет! В предыдущей статье мы написали игру в спички с ИИ. Как оказалось некоторые из вас даже открывали эту сатью, а некоторые из тех кто открывал даже поставили лайк. Спасибо! Сегодня будем писать морской бой в таком же «терминальном» стиле. На этот раз игра будет больше, а алгоритм стоящий за ходом противника — сложнее.
22 049 просмотров
Ознакомиться с полным кодом приложения и запустить прямо в браузере можно как всегда в конце статьи по ссылке.
Вот предыдущая статья про спички если кому-то интересно:
Прошлое приложение заняло 130 строк кода и я таки умудрился расписать его целиком в рамках поста, а вот морской бой уже получился на все 470+ строк.
Морской бой
Сама игра не такая уж и сложная, но в ней хватает нюансов и если писать всё более-менее аккуратно, то получается много кода. В основном это связано с различными проверками при расстановке кораблей, доступности хода, проверками целости кораблей и прочее.
Начнём пожалуй с описания основных классов, которые нам понадобятся для реализации:
Game — сама игра. Этот класс будет группировать и манипулировать остальными классами.
Player — игрок. Будет иметь своё поле, будет совершать ходы.
Field — поле. Будет состоять из двух частей: основная карта и радар. Поле будет проверять возможность расположения кораблей, расставлять корабли, уничтожать их.
Ship — корабль. Можно было обойтись без него на самом деле, но с ним проще.
В основном корабль будет хранить координаты и свои HP.Кроме основных классов так же были написаны вспомогательные FieldPart — чтобы было проще обращаться к конкретной части поля (карта/радар). Color — чтобы было проще и нагляднее задавать цвет элементам. Cell — чтобы описать все возможные состояния клетки поля в одном месте (пустая, сыграная, корабль, уничтоженый корабль, поврежденный корабль).
Class Game(object)
class Game(object): letters = («A», «B», «C», «D», «E», «F», «G», «H», «I», «J») ships_rules = [1, 1, 1, 1, 2, 2, 2, 3, 3, 4] field_size = len(letters) def __init__(self): self.players = [] self.current_player = None self.next_player = None self.status = ‘prepare’ # просто названия функций входящих в Game # сами функции с детальным описанием можно найти в полном коде def start_game(self) def status_check(self) def add_player(self, player) def ships_setup(self, player) def draw(self) def switch_players(self) def clear_screen()
В классе Game мы опишем буквы используемые для отображения координат. Понятное дело внутри самой игры всё задаётся исключительно цифровыми координатами [0][4], [5][1] … но игрок должен во-первых видеть буквы на поле, а во-вторых делать свои ходы используя буквенные обозначения. Поэтому без букв никак. ships_rules — в эту переменную поместим «правила» по кораблям, какие корабли игрок должен выставить до начала боя (здесь можно немного поэкспериментировать при желании: ). field_size — величина поля. Сделаем зависимость от величины списка letters. Поле ведь квадратное, а значит сколько букв — такие и габариты.
Игра будет хранить игроков в cписке players. Но зачем мучиться с коэффициентами при обращении к игрокам, если можно завести две переменные current_player и next_player,которые ссылаются на элементы списка players. Так мы всегда понимает как обратиться к текущему и следующему игроку. А в конце хода мы просто меняем значения этих переменных местами. Ну и я решил добавить такое понятие как status. У игры не то чтобы много статусов, но таким образом можно организовать более наглядный переход из одного состояния в другое в самом игровом цикле. Статусы будут примерно такие: prepare, in_game, game_over.
Функции у игры следующие:
start_game — просто объявляем текущего игрока и следующего.
status_check — игра каждый ход проверяет статусы и меняет их при достижении условий.
add_player — функция используется когда у игры статус prepare для добавления игроков и назначени им полей.
ship_setup — так же используется на старте игры. Передаём в функцию ссылку на игрока и игра просит его расставить корабли или расставляет автоматически. draw — рисует каждый ход поле и доп.инфу. switch_players — просто переключает текущего игрока и следующего, юзается в конце хода. clear_screen — чистит экран.
Class Player(object)
class Player(object): def __init__(self, name, is_ai, skill): self.name = name self.is_ai = is_ai self.auto_ship_setup = True self.skill = skill self.message = [] self.ships = [] self. enemy_ships = [] self.field = None # просто названия функций входящих в Player # сами функции с детальным описанием можно найти в полном коде def get_input(self, input_type) def make_shot(self, target_player) def receive_shot(self, shot)
Кратенько по игроку. name — просто имя. is_ai — является игрок ИИ или нет, в зависимости от этого меняет некоторая логика хода. auto_ship_setup — автоматически расставлять корабли для игрока или вручную. Опция для нетерпеливых. skill — относится к ИИ пока пропустим описание. ships наполняется имеющимися у игрока кораблями. enemy_ships — здесь будем считать какие корабли остались у противника — человек конечно и сам может посчитать, но для ИИ очень полезно. field — поле игрока (поле будет описано ниже)
Функции у игрока: get_input — запросить ввод. здесь мы передаем тип инпута либо ‘ship_setup’ либо ‘shot’. Всё зависит от статуса игры. Много логики внутри, тут лучше почитать код с комментами. make_shot — делаем выстрел по указанному игроку. В этой функции как раз и вызывается get_input с параметром ‘shot’.
Class Field(object)
class Field(object): def __init__(self, size): self.size = size self.map = [[Cell.empty_cell for _ in range(size)] for _ in range(size)] self.radar = [[Cell.empty_cell for _ in range(size)] for _ in range(size)] self.weight = [[1 for _ in range(size)] for _ in range(size)] # просто названия функций входящих в Field # сами функции с детальным описанием можно найти в полном коде def draw_field(self, element) def check_ship_fits(self, ship, element) def mark_destroyed_ship(self, ship, element) def add_ship_to_field(self, ship, element) def get_max_weight_cells(self) def recalculate_weight_map(self, available_ships)
С полем всё просто: size — размер поля. map — основная карта поля по факту просто список списков изначально заполняемый пустыми клетками (Cell.empty_cell). radar — так же. weight уже по интереснее. Это относится к ИИ, поэтому обсудим чуть ниже.
Функции. draw_field — отрисовка поля. Здесь и далее параемтр element это часть поля с которой необходимо работать. либо Map либо Radar либо Weight. Check_ship_fits — прверяем что корабль помещается на ту или иную позицию. Используется при расстановке кораблей а так же для некоторых манипуляций с ИИ. mark_destroyed_ship — помечаем что корабль уничтожен. Ставим на нем кресты, вокруг — точки.
Class Ship(object)
class Ship: def __init__(self, size, x, y, rotation): self.size = size self.hp = size self.x = x self.y = y self. rotation = rotation
Тут вообще всё до безобразия просто: x, y — координаты начала корабля. size — размер. rotation — в какую сторону повёрнут (от 0 до 4). hp — текущее хп корабля. Конкретные поврежденные клетки не отслеживаются т.к. по факту за контроль отрисовки поля отвечает класс Field.
Последнее что мы рассмотрим перед написанием ИИ это основной цикл игры:
if __name__ == ‘__main__’: players = [] players.append(Player(name=’Username’, is_ai=False, auto_ship=True, skill=1)) players.append(Player(name=’IQ180′, is_ai=True, auto_ship=True, skill=1)) game = Game() while True: game.status_check() if game.status == ‘prepare’: game.add_player(players.pop(0)) if game.status == ‘in game’: Game.clear_screen() game.current_player.message.append(«Ждём приказа: «) game.draw() game.current_player.message.clear() shot_result = game.current_player.
make_shot(game.next_player) if shot_result == ‘miss’: game.next_player.message.append(‘На этот раз {}, промахнулся! ‘.format(game.current_player.name)) game.next_player.message.append(‘Ваш ход {}!’.format(game.next_player.name)) game.switch_players() continue elif shot_result == ‘retry’: game.current_player.message.append(‘Попробуйте еще раз!’) continue elif shot_result == ‘get’: game.current_player.message.append(‘Отличный выстрел, продолжайте!’) game.next_player.message.append(‘Наш корабль попал под обстрел!’) continue elif shot_result == ‘kill’: game.current_player.message.append(‘Корабль противника уничтожен!’) game.next_player.message.append(‘Плохие новости, наш корабль был уничтожен :(‘) continue if game.status == ‘game over’: Game.Все достаточно просто. В цикле бесконечно проверяется статус игры и в зависимости от этого выполняются те либо иные действия. В статусе ‘in game’ происходят основные события игры. Получение данных о выстреле игрока, добавление подходящего сообщения для обоих игроков, передача хода другому игроку при промахе и прочее.
Если наступает статус ‘game over’ — выводим основные поля обоих игроков. Пишем кто выиграл, кто проиграл.
Алгоритм поведения ИИ
Как всегда я сел и стал прикидывать какой логикой оперирует человек при игре в морской бой.
- Первый ход случайный.
- Если попал и убил — обрисовал точками вокруг
- Если попал и не убил — стреляем в клетки сверху/снизу/слева/справа
- По диагоналям от клетки «попал» не может быть кораблей
- Прикидываем если остались только большие корабли — затираем мелкие скопления пустых клеток
Более глубокой логики поведения человека я придумать не смог. Дальше начал думать как перенести всё это на какие-то условия. Надо бы держать в уме предыдущий ход, а еще лучше предыдущий удачный ход. И если ты «попал», то следующий выстрел по сторонам. Если второй выстрел не попал, то вернуться к предыдущему ходу и выстрел в другую сторону рядом. Но дальше начинаютя сложности. Так как нужно понимать, что корабль прямой. Значит надо, чтобы ИИ понимал направление корабля и ходил после повторного попадания уже не по четырём направлениям, а в общем-то по одному. И опять-таки приходим к тому, что нужно помнить откуда начался этот корабль. Но это всё просто по сравнению с последним пунктом. Дойдя до него я понял: прежде чем стрелять по клетке — проверь, а помещается ли какой-нибудь корабль хоть как-то в нее.
И тут рассуждения увели меня чуть в сторону и стала вырисовываться идея коэффициентов: назначаем клеткам коэффициенты и стреляем по наиболее весомой. Если корабль помещается в какие-то клетки — прибавляем им коэффициенты. Если нет — коэффициент останется нулевым. Функция check_ship_fits уже была готова т.к. использовалась для расстановки кораблей до начала игры. Отлично.
Я начал развивать идею с коэффициентами. Решил так: изначально каждую клетку поля проверяем на возможность начала с нее корабля. Причем в любую из четырёх сторон. Итого клетка за каждый корабль может получить 4 балла. Естественно речь про поле-радар, единственно доступная информация о кораблях противника расположена на нем. Со временем поле будет заполнятья убитыми кораблями и промахами а коэффициенты этих клеток будут автоматически иметь 0.
Далее в систему коэффициентов нужно как-то вписать все пункты алгоритма:
«Первый ход случайный» — с введением коэффициентов это понятие немного изменится. Теперь каждый ход будет набираться список клеток с самым высоким коэффицентом, а уже из него будет случайным образом выбираться точка обстрела. Зачастую будет получатья так, что список будет состоять из одной единственной клетки которая методом подсчета получила максимальный коэффициент. Так что в целом становитя не важно первый это ход или нет.
«Если попал и убил» — тоже просто. В таких случаях клетке сразу ставится коэффициент 0 как и всем клеткам вокруг нее.
здесь и далее приведен небольшой кусочек поля
«Если попал и не убил» — мы усиливаем вес клеток по всем четырём направлениям т.к. корабль может иметь продолжение только в 4 стороны. По диагоналям от попадения — нули. Тут есть хитрость. Мы не просто выставляем коэффицинет всем вокруг мы умножаем имеющийся, а значит защищаем себя от возможности случайно увеличить нулевой кэффициент
первое попадание. увеличиваем коэффициенты
второе попадание
Ну и последний пункт — если остались только большие корабли — затираем мелкие скопления пустых клеток. Это будет выполняться на основе начального вычисления коэффициентов. Для каждой клетки будут браться оставшиеся корабли и будет совершаться попытка их вписать. Пример:
остался только трехпалубный корабль и как бы мы ни старались он не может проходить через клетку с «?» значит эта клетка не получит увеличения коэффицинета. И как результат коэффициент там будет 0. То же справедливо и для двух незанятых клеток чуть ниже.
Теперь осталось всего лишь написать это:
# пересчет веса клеток def recalculate_weight_map(self, available_ships): # Для начала мы выставляем всем клеткам 1. # нам не обязательно знать какой вес был у клетки в предыдущий раз: # эффект веса не накапливается от хода к ходу. self.weight = [[1 for _ in range(self.size)] for _ in range(self.size)] # Пробегаем по всем полю. # Если находим раненый корабль — ставим клеткам выше ниже и по бокам # коэффициенты умноженые на 50 т.к. логично что корабль имеет продолжение в одну из сторон. # По диагоналям от раненой клетки ничего не может быть — туда вписываем нули for x in range(self.size): for y in range(self.size): if self. radar[x][y] == Cell.damaged_ship: self.weight[x][y] = 0 if x — 1 >= 0: if y — 1 >= 0: self.weight[x — 1][y — 1] = 0 self.weight[x — 1][y] *= 50 if y + 1 < self.size: self.weight[x — 1][y + 1] = 0 if y — 1 >= 0: self.weight[x][y — 1] *= 50 if y + 1 < self.size: self.weight[x][y + 1] *= 50 if x + 1 < self.size: if y — 1 >= 0: self.weight[x + 1][y — 1] = 0 self.weight[x + 1][y] *= 50 if y + 1 < self.size: self.weight[x + 1][y + 1] = 0 # Перебираем все корабли оставшиеся у противника. # Это открытая инафа исходя из правил игры. Проходим по каждой клетке поля. # Если там уничтоженый корабль, задамаженый или клетка с промахом — # ставим туда коэффициент 0. Больше делать нечего — переходим следующей клетке. # Иначе прикидываем может ли этот корабль с этой клетки начинаться в какую-либо сторону # и если он помещается прбавляем клетке коэф 1. for ship_size in available_ships: ship = Ship(ship_size, 1, 1, 0) # вот тут бегаем по всем клеткам поля for x in range(self.size): for y in range(self.size): if self.radar[x][y] in (Cell.destroyed_ship, Cell.damaged_ship, Cell.miss_cell) \ or self.weight[x][y] == 0: self.weight[x][y] = 0 continue # вот здесь ворочаем корабль и проверяем помещается ли он for rotation in range(0, 4): ship.set_position(x, y, rotation) if self.check_ship_fits(ship, FieldPart.radar): self.weight[x][y] += 1
У нас есть поле с выставленными коэффициентами. Надо бы дописать функцию get_max_weight_cells которая будет возвращать список координат с максимальным коэффициентом.
def get_max_weight_cells(self): weights = {} max_weight = 0 for x in range(self.size): for y in range(self.size): if self.weight[x][y] > max_weight: max_weight = self.weight[x][y] weights.setdefault(self.weight[x][y], []).append((x, y)) return weights[max_weight]
Занесем координаты всех клеток в словарь weights. Ключом будет вес клеток. Значением — список содержащий пары координат.
Пробегаем по всем клеткам и заносим их в словарь. Заодно запоминаем максимальное значение веса. Далее просто берём из словаря список координат с ключом максимальным заначением веса: weights[max_weight]
Всё что осталось сделать ИИ, для совершения адекватного хода, это из полученного списка координат выбрать случайную:
x, y = choice(self.field.get_max_weight_cells())
Вот вроде бы и всё. Здесь не описал многие детали реализации, но, как я писал выше, комментарии есть еще в коде.
Строку 335 можно раскомментировать, чтобы получить доступ к отладочному полю с коэффициентами и видеть их распределение.
Вы можете опробовать морской бой прямо здесь, а так же прочитать дополнительные комментарии
Если хотите еще статью похожей тематики — ставьте лайк и предлагайте идеи.
В следующих раз можем попробовать написать например телеграмм-бот тамагочи: )
Как выиграть в Морской бой: 15 советов, приемов и стратегий (увеличьте свой процент побед)
Морской бой — одна из самых популярных в мире стратегических игр, которая существует со времен Первой мировой войны. С тех пор как первая игра «Морской бой» была напечатана в 1931 году, она стала фаворитом среди любителей настольных игр. Но хотя большинство людей знают, как играть в Battleship, немногие знают о его выигрышных стратегиях.
В оставшейся части этой статьи я поделюсь несколькими эффективными стратегиями и тем, как вы можете использовать их для увеличения своего винрейта.
Вот несколько советов и стратегий, которые помогут вам победить в Battleship:
1. Не концентрируйте все свои корабли в одном сегментеЦель Battleship — снизить вероятность поражения ваших кораблей. Лучший способ сделать это — рассредоточить свои корабли.
Сосредоточение всех ваших кораблей в одном сегменте иногда может быть эффективным — противник, стреляющий случайным образом, будет иметь меньше шансов поразить ваши корабли.
Тем не менее, эта стратегия очень рискованна, и противники могут легко ее поймать. Как только корабль будет поражен, противник начнет нацеливаться на тот же сегмент, чтобы потопить корабль. Если другие корабли будут сосредоточены в том же сегменте, это повысит их вероятность поражения.
Хотя вы можете использовать эту технику, чтобы оживить ситуацию, не делайте ее своей основной стратегией.
2. Избегайте размещения кораблей по одним и тем же шаблонамЕще одна эффективная стратегия защиты в Battleship — избегать использования одних и тех же шаблонов для размещения кораблей. Это особенно полезно, если вы играете с одними и теми же противниками, но может работать и со случайными противниками. Суть этой стратегии в том, что она позволяет свести к минимуму вероятность того, что противник угадает, где стоят ваши корабли.
Например, если вы разместите все свои корабли по диагонали, противник может уловить расположение ваших кораблей, как только они поразят несколько целей. То же самое касается размещения всех ваших кораблей вертикально.
Другая проблема с этой стратегией заключается в том, что она увеличивает вероятность попадания, если ваш противник стреляет случайным образом (что делает большинство людей!).
3. Используйте стратегию паритета, чтобы повысить вероятность попаданияВместо того, чтобы стрелять во все диагональные и вертикальные квадраты, пока вы не сделаете выстрел, используйте подход паритета, чтобы максимизировать шансы поразить корабль противника на ранней стадии.
Эта стратегия основана на математической вероятности и предположении, что противник не будет размещать все свои корабли точно по вертикальным линиям, на которые вы не нацелились.
Например, если самый маленький корабль покрывает две клетки, стрельба по каждой второй клетке увеличит ваши шансы на попадание в начале игры.
4. Не позволяйте двум кораблям соприкасаться друг с другомВсегда полезно держать свои корабли на расстоянии друг от друга, даже если это расстояние в одну клетку. Причина этого связана с тем, как большинство людей будут охотиться на корабли. Когда противник поражает корабль в Battleship, он обычно нацеливается на область рядом с местом удара.
Если вы поставите несколько кораблей рядом друг с другом, у вашего противника будет больше шансов получить больше последовательных попаданий. Даже если вы используете концентрированную стратегию, всегда держите по крайней мере расстояние или два между вашими кораблями.
5. Рассредоточьтесь заранееЭто самая распространенная стратегия Battleship, но также и одна из самых эффективных. Используйте подход, похожий на радар, при нацеливании на корабли противника в начале игры. Так как ваш противник редко будет концентрировать все свои корабли на одной части доски, эта стратегия обычно окупается.
Как только вы наткнулись на корабль, вы можете начать использовать вычисления, чтобы потопить его и рассчитать относительное положение других кораблей.
6. Топите по одному кораблюКак только вы попали в корабль противника, самое время воспользоваться своей удачей. Всегда сосредотачивайтесь на том, чтобы потопить один корабль, прежде чем двигаться к другим кораблям. Если вы попали в корабль, сосредоточьтесь на области вокруг корабля, пока вам не удастся полностью его потопить.
Как только вы потопите корабль, вы можете начать использовать ту же стратегию для поиска других кораблей. Хотя может показаться заманчивым сначала найти все корабли, а затем потопить их один за другим, это обычно приводит к путанице в том, попали ли вы в новый корабль или в один и тот же корабль дважды.
7. Не стреляйте в сегмент, если вы промахнулись дваждыЕсли вы дважды выстрелили в один сегмент, не получив попадания, переключитесь на другой сегмент. Дело не в том, что этот сегмент проклят, а в том, что это эффективная стратегия охоты на корабли на более поздних этапах игры!
Хотя вы можете очищать доску по одному сегменту за раз, эта стратегия не эффективна и только увеличит количество ваших выстрелов, прежде чем потопить все корабли противника.
8. Пожар в центре доски РаноМорской бой предназначен для получения максимального количества попаданий без лишних выстрелов. Большинство противников размещают свои корабли в центре доски. Некоторые люди предпочитают размещать большие корабли в центре, так как там больше места, а другие прячут самые маленькие.
В любом случае, ранний выстрел в центр увеличивает вероятность попадания.
9. Используйте метод шахматной доскиЭтот метод очень похож на метод четности, но гораздо проще в использовании. Представьте доску в виде шахматной доски с двумя разными цветовыми комбинациями. Даже если противник поставит свой самый маленький корабль вертикально, большинство кораблей будет иметь как минимум два цвета. Вместо того, чтобы нацеливаться на оба цвета, сосредоточьтесь на одном ряду, пропустите следующий ряд и выстрелите в следующий ряд.
10. Изменение начального поля для каждого выстрелаЕсли вы хотите максимизировать количество попаданий, меняйте начальное поле для каждого выстрела. Например, если в предыдущей игре вы начали со стрельбы по B3, начните следующую игру с C4 и так далее. Противники каждый раз будут действовать по-разному, так что это повысит ваши шансы на попадание.
11. Не размещайте большие корабли в центреВ то время как центр является отличным местом для укрытия небольших кораблей, размещение большого корабля в центре поля почти гарантирует, что противник ударит его на ранней стадии.
Большинство людей начинают с цели в центр доски. Разместив там свои самые большие корабли, вы даете противнику преимущество на раннем этапе.
12. Изучите стратегии вашего противникаЕсли вы регулярно играете с одними и теми же противниками, вы будете постепенно изучать их стратегии. Затем вы можете противостоять этим стратегиям в своей игре. Например, если ваша первоначальная стратегия состоит в том, чтобы рассредоточить свои удары, но ваш противник склонен концентрировать большую часть своих кораблей в одном сегменте, тогда измените свою стратегию, чтобы она лучше соответствовала вашему противнику.
13. Огненные выстрелы с расчетливым подходомХотя Морской бой основан в основном на удаче, есть способы получить преимущество с помощью расчетов. Например, вы можете рассчитать вероятность того, что большой корабль находится в определенной области, рассчитав количество оставшихся кораблей и их местонахождение.
Кроме того, как только вы получите удар, попытайтесь определить шаблоны, вокруг которых противник может строить свои построения.
14. Часто меняйте свою стратегиюНепредсказуемость имеет решающее значение для увеличения вашего винрейта в любой игре, особенно если вы регулярно играете с одними и теми же противниками. Если вы используете определенную стратегию, которую начинает улавливать противник, вы можете менять свою стратегию в любой другой игре, чтобы сбить его с толку.
15. Играйте чащеЕсть известная поговорка: «Чем больше я тренируюсь, тем больше мне везет». Эта поговорка применима не только к играм, основанным на чистом мастерстве, но и может помочь вам победить в Battleship. Более регулярная игра поможет вам распознавать шаблоны и стратегии, обычно используемые другими игроками, и вам будет легче противостоять им.
Ключевые выводыХотя для победы в Battleship требуется удача, он также основан на стратегии. Вот несколько важных советов, которые помогут вам чаще побеждать:
- Расставьте свои корабли более надежно.
- Нацеливайте свои выстрелы, используя радарную диаграмму.
- Будьте непредсказуемы, чтобы сбивать с толку обычных противников.
- Играйте чаще.
Игра Professor Puzzle Sea Battle Game
Сумка для покупок
Кнопка для закрытия панели приложенийКнопка для закрытия панели приложенийРезультаты фильтрации
Кнопка для закрытия панели приложенийВойти
Адрес электронной почты
Пароль
Запомните меня
Забыли пароль?
Регистр
Имя
Фамилия
Адрес электронной почты для входа
Пароль
Согласен с условиями и положениями Liberty
Рекламная рассылка
Присылайте мне по электронной почте последние новости от Liberty, в том числе о выпуске продуктов, специальных предложениях и информацию о баллах лояльности, накопленных за ваши покупки. Вы можете отписаться в любое время.
Регистрируясь, вы соглашаетесь с Условиями использования и Политикой конфиденциальности Liberty.
Wish List
Кнопка для закрытия панели приложенийОтзывы
Кнопка для закрытия панели приложенийГоловоломка «Профессор»
$ 22,00
Кол-во 1 Кол-во 2 Кол-во 3 Кол-во 4 Кол-во 5 Кол-во 6 Кол-во 7 Кол-во 8 Кол-во 9Кол-во 10
Наличие: Нет в наличии
ОписаниеОтзывыДоставка
Поделиться
Примечания редактора
Игра Sea Battle от Professor Puzzle, которая обязательно должна быть в любом семейном шкафу для игр, наполнит ваше Рождество весельем и смехом.