Pull to refresh

Comments 91

Да, теперь все отлично, спасибо.
И логика игры достаточно интересна, тоже благодарствую :)
у меня тоже самое (Молдова)
москва, аналогично.

из питера говорят, что работает, причем грешат на некоторых (видимо, не всех) московских провайдеров. как выяснилось, зря.
Когда я в первый раз столкнулся с такой тактикой, я был жутко разочарован, вся прелесть игры пропала :(
Да, согласен.
Я в статье и написал «После того как все в классе знали эту стратегию, мы перешли к игре «Морской бой» (на поле 5х5 выставляется 4 однотрубника). После этого игра стала носить больше психологический характер (кто как повторяется или не повторяется при расстановке), чем математический.»
Мне вот интересно, после расстрела всего поля по методу поиска четырехпалубника перейти к расстрелу всего поля по методу поиска трехпалубника?
После
img2.pict.com/02/d7/e6/2658433/0/7.png
устанавливать положение трехпалубного не очень то удобно.

И да, такое расставление кораблей я также придумал самостоятельно)
если оставшееся поле пустое то оно простреливается как
img2.pict.com/4d/f8/a5/2658437/0/9.png

если нет, то в зависимости от ситуации, так чтобы было не поставить 3-х трубник.
Тогда гораздо рациональнее использовать диагональные прострелы в случайных местах. Например(цифровым кодом): 1-1, 7-7, 9-9, потом диагональ 4-1, 5-2, 7-4 и т.п. Стрелять в случайные места этих диагоналей, чтобы избежать угадываемого перечисления.
К тому же при поиске двухпалубников, трехпалубники вылезут все до единого.
прострелы «определенным образом» хороши только для пустых квадратов,
когда же в них есть простреленные участки или потопленный корабль,
надо смотреть по ситуации.
Надо исходить из принципа — Меньшим количеством выстрелов не дать поставить
в оставшуюся не простреленную площадь 4х,3х или 2х трубник.

Пишите конкретный пример, и я попробую ответить.
UFO just landed and posted this here
А я наивно полагал, что ее придумал я :D
Когда пишешь «При написании данной статьи не один корабль ВМФ не пострадал =)».

То это значит, что их пострадало много. Нужно писать «ни один».
Простите, что не в почту, почему-то я не нашел такой кнопки в вашем профиле.
33 клетки для расстановки 4 однотрубных кораблей, это почти в 2 раза больше,
т.е. вероятность моего выигрыша была почти в 2! раза выше (не учитывая оптимальность стрельбы).


наверное в два раза меньше, по сравнению с вариантами, когда остаётся 60 клеток…
Между логином и кармой есть стрелка, а там уже Написать письмо. К. О.
Вообще-то в такой формулировке это значит, что пострадал ровно один. Если бы было «При написании данной статьи не один корабль ВМФ пострадал =)», тогда было бы много (и в стиле магистра Йоды :) ).
Почему ровно один? Ясно же написано «не один».
Так, пора заканчивать это обсуждение.
Поотому что двойное отрицание.
Двойное отрицание — это «не не X». Конструкция «не X не Y» двойным отрицанием не является, как, впрочем, и конструкцией математической логики.

Не умничайте. Всегда найдется Хабр, который статистически умнее вас.
а тут не «не X не Y», тут по другому:

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

так что сами вы не умничайте! (интересно, сможет ли меня кто-нибудь переумничать?)
это значит, что некоторое количество кораблей не пострадало :)
не один пострадал — пострадало много
не один не пострадал — не пострадало много
> Когда пишешь «При написании данной статьи не один корабль ВМФ не пострадал =)».
> То это значит, что их пострадало много.
Нет, это значит, что больше одного корабля остались целыми (замените: «не один корабль ВМФ уцелел»).

А еще в самом первом предложении вопиюще неправильно употреблен деепричастный оборот. Хотел написать на почту, а тут как раз специальная ветка для этого.
Всё в порядке, статья читала хабр, не придирайтесь =)
Да, вы правы. Вечер, пятница… голова ни к черту. Хоть суть замечания была верной.
Если по этой методе играть с человеком, то все эти расстановки «по краям» или «по периметру» приведут к тому, что все многопалубные корабли будут вынесены сразу. Помню еще по играм в школе — просчитывается это на раз-два. А потом можно спокойно добивать однопалубников.
Ну так а толку-то, что кораблики, которые больше однопалубных, сразу отстреляешь? Они и так довольно быстро отстреливаются. Если оставлять больше места для однопалубных то среднее количество выстрелов до уничтожения всех кораблей будет выше.
«Ну так а толку-то, что кораблики, которые больше однопалубных, сразу отстреляешь? Они и так довольно быстро отстреливаются»

Толк как раз в разнице между «сразу» и «довольно быстро». Это те самые несколько ходов, которых не хватает, чтобы найти последний кораблик противника =)
О_о
Как бы, странно…

Смотрите:
1. Противник расставил корабли вперемешку. Из-за чего, у него под мелкие кораблики осталось порядка 30 клеток. Вы методично стреляете, в результате чего у вас к моменту, когда все большие корабли потоплены уже прострелена часть оставшегося места от тех и так немногих 30 с чем-то клеток.

2. Вы «сразу» расстреливаете большие корабли, потратив на это некоторое небольшое количество ходов (совсем сразу не получится, так как все-таки, вариантов их распределения достаточно), а затем у вас 60 клеток и 4 мелких кораблика хрен знает где закопанных.

Как всегда, истина где-то посередине.

3. Вы расставляете корабли так, что для мелких кораблей остаётся 50 клеток, но и большие корабли расставлены менее предсказуемо
Тут еще есть большая разница по какой тактике стреляет противник. Если он стреляет по системе, которая оговаривается в этой статье, то в третьем варианте будет все-таки хуже, хоть и ненамного, так как эта система исходит из вообще рандомной расстановки кораблей противника.
Разумеется. Любая стратегия игры может быть хороша против конкретной другой и плоха против третьей. Именно поэтому хотелось бы увидеть программу, позволяющую двум алгоритмам играть друг против друга. Было бы интересно, есть ли такой, который выигрывает у всех остальных.
Так, чтобы выигрывать сразу — вряд ли. А вот такой алгоритм, который бы адаптировался к стратегии противника со временем — возможно.
Кстати, ваш алгоритм можно ещё улучшить, если три однопалубника тоже припереть к стенке. В оставшихся ~50 ячейках искать однопалубник _очень_ неприятно.

И да, это придумано очень давно. Любой человек, которого в универе мучали теорвером во времена СССР, это знает.
UFO just landed and posted this here
А если случайно все корабли подряд потопить — так и вообще ))

Понятное дело, что стратегия рассматривается как оптимальная на примере многих партий.
UFO just landed and posted this here
из практики выходит что 4 из 60 лучше,
чем 1 из 50.
Хотя математически выходит наоборот.

Мне программа несколько раз выносила этот однотрубник на тестах
(именно «шальной» пулей).
4 из 60 гораздо лучше чем 1 из 50.
Допустим все равновероятно, поля вокруг кораблей не учитываются. Каждый корабль находится где-то в 15-ти клетках.
Вероятность подбить его за 7-8 выстрелов =50%. Далее ты не начинаешь выбивать следующие 15 клеток, пытаясь найти второй корабль, а продолжаешь добивать первую четверть пространства.
Правда каждое такое попадание уменьшает поле на 4-9 клеток.
>>корабль находится где-то в 15-ти клетках.

не правильная расстановка!!!

они расставляются абсолютно рандомно.
Верно. Но против расстановки №2 можно найти более эффективную схему расстрела кораблей, чем описано в статье. В частности, более результативной будет стрельба сначала по углам.
Против заранее известной схемы (даже в каких-то весьма значительных вариациях) практически всегда можно придумать контр-тактику, в общем-то.
Фишка в том, чтобы найти «среднюю» тактику, играющую в среднем хорошо.
автор как бы намекает, что вся суть стратегии как раз в уменьшении шансов попасть в однопалубник — ибо для стрельбы ровно 66 клеток. И пока соперник будет ловить однопалубники в этой туче пустых клеток — вы со спокойной душой отстреляете всё методом отсечения — потому, что если соперник расположил свои корабли отличным от этого способа — отстреливаются они чуть более чем быстрее, чем ваши 4 однопалубника.
60 клеток на 4 однотрубных корабля.
Попробуйте сыграть сами с собой.
За первого игрока сыграйте по своей тактике,
за второго по вышеописанной.
Ну всё, теперь хабрасообщество непобедимо!)
Спасибо за статью, всё логично, мог бы и сам до всего догадаться.
А ещё порадовали инициалы и фамилия автора книги)
«Любая формула, включенная в книгу, уменьшает число ее покупателей вдвое» Стивен Хокинг.

Позанудствую чутка:

это его издатель сказал, когда первая версия книги «Краткая история времени от Большого взрыва до черных дыр» вышла с формулами, потом он убрал от туда их все, кроме E=mc^2.
«Занимательные математические игры»

В онлайне почитать возможно вообще? :) Гугление пока не дало результатов.
У меня где-то есть бумажный вариант. При наличии достаточного количества времени смог бы отсканить.
Если не найдете нигде — пишите, что-нибудь придумаем.
Если кому еще нужно:

ifolder.ru/16716133
Я сначала хотел в цвете и с распознанным текстом сделать, но посмотрев сколько времени мой сканер сканирует в цвете, решил остановиться на ч/б варианте. Потом, прогнав файнридером увидел, что половину страниц надо пересканировать, чтобы получить что-то вменяемое =)

В итоге, пересканировал только те страницы, которые получились совсем плохо.
Запихал это в pdf нераспознанным. Должно все более-менее читаться. =)
ifolder говорит, что файл удалён. он, случаем, не сохранился, чтобы ещё раз выложить? например на Я.Диск.

пардон за некропост.
Спасибо, вроде всё просто, но врятли когда-нибудь сам задумался о такой стратегии, а теперь когда я её знаю придётся завтра устроить соревнования на работе по морскому бою :)
«У нас в классе была девочка, так вот она не выставляла до последнего один однотрубный корабль»

Чтобы этого избежать мы брали 2 ручки, например, у одного красная, у второго синяя. Рисовали корабли и потом менялись ручками. Т.е. уже не дорисуешь кораблик…
А вот и я — автор обсуждаемой игры :-)

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

Пусть у нас есть две программы. Одна — моя — назовем её «наивная» — она играет, не делая никаких предположений, где враг поставил корабли (знаем только, что они расставлены по правилам). И программа, которая думает, что противник хитёр и расставил корабли «правильно», назовем её «умная». Пусть эти программы сразятся, как вы думаете, какая выиграет? ,-)

Оказывается, что выигрывает наивная!

Если понаблюдать за тем, как они играют, или просто подумать головой (лично я шёл по первому пути :-)), то можно обнаружить, что это совершенно очевидный факт! «Умная» программа оказывается более предсказуемой.

Итак, поверьте (если не хотите смоделировать или подумать), — с «умной» программой сложно играть только первый раз :-) Дальше её хитрый план становится очевиден, а играть становится вообще не интересно. Но я не сдаюсь и планирую некоторые доработки, которые могут сделать игру интересней.

Предлагаю их обсудить.

подстраивание под противника

С человеком интересно играть потому, что он пытается тебя разгадать, а ты пытаешь разгадать его. Это битва не отдельных выстрелов, битва стратегий. Можно попробовать заставить мою программу собирать статистику и обучаться игре с конкретным соперником. Скажем, она может заподозрить, что в A1 соперник всегда ставит однотрубный :-) Со временем, программа будет набирать силу (это "+"), но достаточно будет сменить тактику (или за комп сядет другой человек) и программа станет беззащитна как ребёнок (это минус).

корабли могут плавать :-)

то есть корабли можно переставлять во время игры. Это должно уравнять шансы тех, кто расставляет по-умному и по-глупому.

МБ на шаре

Это исключит влияние границ. Но тут не понятно, как разбить шар на квадратики :-) (вариант, конечно, с полюсами не проходит)

Я рад любым предложениям. А так же, можете использовать мои идеи как вам угодно :-)

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

Соединяете левую/правую и верхюю/нижнюю границы. Желательно ещё сделать возможность прокрутить поле, полезно изредка поменять свой взгляд на положение вещей.
Идея с тором хорошая, но я имел ввиду именно шар по двум причинам: 1) человеку проще представить шар, 2) при навигации по шару его достаточно крутить всего вокруг двух осей, причём по одной из осей достаточно 180 градусов, при таких умеренных поворотах, человек может достаточно легко сохранять привязку к фигуре (на торе заблудиться проще). Одним словом, мне кажется, что играть на торе было бы очень головоломно и сам процесс будет связан с таким количеством вращений, что у многих может начаться лёгкая тошнота :-) Ведь человеку надо показывать не только его ходы, но и ходы противника. Однако, если вы напишете игру на торе, что, — вы правы, — менее проблематично, чем на шаре, — проанонсите её на хабре, — думаю, что не я один с удовольствием испытаю свой вестибулярный аппарат :-)

В идее же с шаром, надо либо отказаться от квадратности ячеек (пусть на полюсах буду многоугольники; или всё замостить пятиугольниками и шестиугольниками...), либо перейти к «кирпичному мощению», либо действительно добавить «ручку», превратив всё это дело в топологический эквивалент тора. Но последний вариант мне кажется… слегка через чур :-)

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

двигаешься по полю, хоп-хоп-хоп, добрался до верха, еще хоп и ты уже внизу (ловкость рук и никакого мошенничества)
Вы никогда не крутили развёртку тора.
Давно была такая игра «Тор», так вот у нее поле было такое…
стороны замкнуты левый край с правым, верхний край с нижним,
а так же замкнуты ВСЕ углы.
(мне все-таки кажется, что это шар получается а не тор)



Основное поле голубое, дополнительные поля нужны только для удобства восприятия.
Поля кораблей(как и выстрелы по ним) стоящие на «1» слева, должны дублироваться так же и справа.
Для примера, показано, как бы выглядел 4х и 2х трубник на таком поле(на стороне и в углу).

Угловые поля 5,6,7,8 дублируются 4х кратно.
При подсчете, дополнительные поля не учитываются.
удивительное радом. я не говорю про развёртку, а изначально и про тор речи не было :-) похоже, некоторые просто не читают реплики, а пишут сразу ответы на то, что им самим подумалось :-)
>>корабли могут плавать :-)

с 4х палубника как с авианосца может подниматься палубная авиация,
а однотрубники как подводные лодки могут погружаться.

и Ред Алерт почти готов =)

теперь серьезно.

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

Вот там и можно будет посмотреть, чей алгоритм лучше.
На счет интересных дополнений- есть одна вариация «Морского боя» для мобильников, там для кораблей доступный различные «навыки»- бомбардировка (игрок может выстрелить по любым трем точкам за один ход), торпедная атака (точки одной вертикали помечаются как простреленные, до попадания в корабль), мины, напалм (уже точно не помню смысла их действия). На картах могут быть острова, которые видны противнику, и за одну клетку от них тоже нельзя ставить корабль (типа отмель), навыки появляются только после определенного количества выигранных боев, чтобы их использовать необходимо три раза попасть во вражеский корабль, есть система рангов и медалей («попал первым выстрелом» и т.п.). С такими дополнениями игра становится действительно интересной.
UFO just landed and posted this here
для таких случаев тоже есть своя тактика математически вполне оправданная, называется рандом
Если мы попадаем в какой-то корабль, то надо его добивать до конца.


Спорное утверждение. Типов кораблей не так много и их количество заранее известно. На основе этих данных не сложно прикинуть в голове после 1-2 успешных попаданий, где именно заканчивается тот или иной корабль и не тратить время на прострел очевидностей ради выявления «мертвых зон» возле корабля.
Это тоже не аксиома конечно. Многое зависит от каждого конкретного случая.

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


Игрок делает 1 выстрел, если промахивается, то ход переходит сопернику, если попадает, делает еще выстрелы до первого промаха.


Никакой траты времени здесь нет.
А насколько интереснее была бы игра, если иметь возможность поставить два корабля в упор друг к другу, но только один раз. Очевидно пустые клетки превратились бы в «скорее всего пустые».
UFO just landed and posted this here
стилистику исправил, спасибо.
Это для игры с компом. А если с человеком играть — как только партнер просекает тактику сразу становится неинтересно.

Потому у меня несколько сценариев:
«максимальной вырожденности» — когда поля вокруг разных кораблей сильно совпадают. Тогда число «пустых» клеток максимизируется но противнику становится проще вычислить следующий корабль найдя один

«разбросать всё по бокам, оставить внутри дыру»

«то как я играла в первом классе школы» — равномерное распределение всего и вся
Хм а если допустить перегибы в кораблях т.е Г-образные и Т-образные и тд, но без соединений по диагонали… тогда использование данной стратегии принесет меньше пользы… и больше вариантов расстановки кораблей
Да, нужно будет тактику изменять.
Но учтите, что и надстройка у изогнутых кораблей больше
(по крайней мере у тех, что стоят не с краю).
Особенно интересен вариант изгиба 4х трубника как в тетрисе
Т-образный, S и Z — образный.
визуальный эффект оказался обманчивым. =(
проверил, оказалось, что во многих случаях и по надстройкам совпадают.
а я то думаю чего я всегда выигрывал :)))
Корабли не могут соприкасаться.
Уточните, что имеется в виду касание в 8-связном смысле. Потому что некоторых местностях встречается разновидность «морского боя» на 4-связном поле.
Первый раз вижу такое наименование как "*трубные". Всегда юзали "*палубные" :)
Почините пожалуйста картинки :)
Интересная теория.

Попробую соотнести с играми на сайте «Морской бой» (http://battleship-game.org/), когда статистика накопится.
Sign up to leave a comment.

Articles