Одна из первых версий игры 1984 года, в которую я играл на своем компьютере «Поиск»
Одна из первых версий игры 1984 года, в которую я играл на своем компьютере «Поиск»

Бизнес-идиллия с драматическим концом

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

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

История и немного философии

Сокобан (кстати, многие источники указывают на то, что правильнее писать soukoban — так ближе к языку оригинала) родом из Японии. Вполне понятно, почему подобная игра появилась именно в Японии — стране восходящего солнца, самураев и трудоголиков. В ней так и чувствуется влияние японского «осс» — «терпи».

ОСС

В современном каратэ-до «осс» означает «терпение, уважение и признательность». Чтобы развивать сильное тело и сильный дух, необходимы жёсткие тренировки, которые выдержать трудно. Каратисту приходится заставлять, «подталкивать» себя к тому, что он считает своим пределом. Ему хочется остановиться, но нужно бороться со своей слабостью и заставить себя победить. Чтобы сделать это, каратист должен проявить упорство, волю, а прежде всего — терпение. Это терпение и есть «осс».

Так пишется слово soko-ban по-японски
Так пишется слово soko-ban по-японски

Терпение — это как раз то, что понадобится кладовщику — главному герою игры — на пути к заветной цели. Кстати, слово «soko-ban» — японское и переводится именно как «кладовщик». Правила игры просты и изящны как всё гениальное. На складе сложной конфигурации (в большинстве описаний его называют «лабиринтом», и это истинная правда) находится кладовщик и ящики. Все ящики необходимо поставить на конечные позиции (обычно они обозначаются ромбиками). Ящики можно только толкать, но нельзя тянуть. Кроме того, нельзя толкать больше одного ящика. Запрёшь ящик в угол — уже никогда его оттуда не вытащишь — придётся начинать всё с начала. Придвинешь один ящик вплотную к другому — и сдвинуть его сможешь, только подойдя к нему сбоку. Если, конечно, не помешают стенки. Или другие ящики.

Изобретена игра была в далёком 1980 году и довольно быстро её портировали сначала на Nintendo, а потом и на все известные платформы.

Позже под руководством изобретателя этой игры было выпущено несколько официальных сиквелов, главными из которых считаются Sokoban Perfect (1989) и Sokoban Revenge (1991). Они содержат по 360 уровней. Официальная страница игры сокобан находится по адресу www.sokoban.jp. К сожалению, она имеет только японскую версию.

Обложка игры 1984 года
Обложка игры 1984 года

Клоны и современность

Сейчас клонов этой игры, быстро ставшей классической, великое множество. Сокобан повторил судьбу тетриса, разве что в более скромных масштабах. Есть реализации игры для карманных компьютеров, игровых приставок, мобильных телефонов и, конечно же, для PC. Правила игры остаются неизменными. Меняются графика, оформление, даже количество измерений (существуют 3D-версии сокобана), но идея прежняя — всё тот же несчастный кладовщик, запертый в лабиринте (в классическом варианте все лабиринты умещались в поле 19х18 клеток) с кучей ящиков.

Трехмерный вариант игры Sokoban 3D
Трехмерный вариант игры Sokoban 3D

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

С этими планами уровней произошла по-настоящему детективная история, которая рассказывается на различных сайтах фанатов игры. В начале 90-х годов некие программисты создали Unix-клон сокобана под названием XSokoban. В эту версию были перенесены классические уровни. Причём восемь из них перенесены с ошибками. Есть версия, что сами авторы XSokoban эти изменения ошибками не считали и сознательно упростили уровни. Так случилось, что об этих изменениях не было известно широкой общественности, и ошибки начали перекочевывать из одного клона сокобана в другой. В результате многие версии, позиционирующиеся как классические, на самом деле таковыми не являются.

Уровень в XSokoban
Уровень в XSokoban

Вообще, законных римейков с классическими уровнями не так уж много. Один из них называется Sokomind. Он был написан немцем по имени Геральд Холлер (Gerald Holler) в 1997 году, чья домашняя страничка сейчас закрыта по неизвестным причинам. Но раз уж хорошая игра появилась в Сети, она останется там навечно. Надо только уметь искать. В этой версии шестьдесят уровней. Пользователям предоставлена возможность создавать их самим. Есть даже некоторое усложнение и без того непростой задачи: ящики нужно не просто распихать по местам, а расставить в определённом порядке.

Кладовщик на четвёртом уровне в версии 1984 года
Кладовщик на четвёртом уровне в версии 1984 года

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

Научная сторона вопроса

Сокобан — игра логическая, стоит в одном ряду с кубиком Рубика, шашками и даже шахматами. Простые, можно даже сказать, элегантные правила — вершина айсберга. В глубине — сложная математическая теория. Поэтому нет ничего удивительного, что игрой заинтересовались учёные. Наверное, несчастный кладовщик Вася очень бы удивился, если б узнал, что его действия можно изучать с точки зрения теории вычислительной сложности. Задача решения этой головоломки относится к так называемым NP-трудным задачам, как часть более общего класса задач планирования движения (в общем случае Вася будет иметь право не только толкать, но и тянуть, и не один, а сразу несколько ящиков). Сокобан представляет интерес и для исследователей искусственного интеллекта: хорошо бы построить такого робота, который выполнял бы задачу Васи и, перемещая ящики по лабиринту, ставил их на определённые места. При этом нужно, чтобы он выполнял свою задачу в оптимально короткие сроки за минимальное количество шагов.

Трехмерный вариант игры Sokoban Galaxies 3D
Трехмерный вариант игры Sokoban Galaxies 3D

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

Некоторые (заметьте, только некоторые) уровни игры могут быть решены «автоматически», с помощью определённых итерационных поисковых алгоритмов. С этой целью, например, была создана программа Rolling Stone, которая умеет самостоятельно проходить некоторые уровни сокобана. Она была разработана в недрах GAMES Group Университета Альберты (одной из провинций Канады). Сложные же уровни сокобана всё ещё не поддаются «автоматическому» прохождению.

JSoko — Java-приложение для решения и оптимизации уровней сокобана
JSoko — Java-приложение для решения и оптимизации уровней сокобана

Задачи и стратегия

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

  • нельзя допускать, чтобы два ящика оказались друг рядом с другом у стены (вы никогда их не вытащите оттуда: тянуть ящики нельзя, толкать два ящика — тоже);

  • нельзя задвигать ящик в угол;

  • нельзя сдвигать ящики в квадрат 2x2.

Кроме того, могут возникнуть такие ситуации, когда ящиками будет заблокирована определённая область лабиринта. И любая попытка разблокировать эту область, подвинув ящик, приведёт к одной из описанных выше ситуаций.

Редактор уровней Sokoban YASC
Редактор уровней Sokoban YASC

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

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

В мире шахмат существуют определённые правила записей ходов и позиций на доске. В мире сокобана тоже выработаны такие правила. План уровня и первоначальное положение объектов записывается в обычном текстовом файле с помощью следующих символов: «#» — стены, «.» — пустое место, куда надо поставить ящик (так называемая «цель»), «@» — кладовщик, «+» — кладовщик, который стоит на той клетке, где находится одна из целей, «$» — ящик на пустом месте, «*» — ящик на одной из целей. Такой формат записи получил название «XSB File Format». Файлы этого формата могут иметь расширения: xsb, sok, rdf, lp0, dat, pak и даже просто txt. Этот формат хранения уровней вы найдёте во многих клонах сокобана.

Настольный вариант игры сокобан
Настольный вариант игры сокобан

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

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

Есть ещё более простой формат, где план уровня записывается в строчку. Уровень в таком формате выглядит, например, так:

[2-5#|3#3-#|#2-*#-2#|#-#2-*-#|#-*2-#-#|2#-#+2-#|-#3-$2#|-3#2-#|3-4#]

Цифрами обозначается количество повторений символа, который идёт за этой цифрой. Символом «|» даётся команда на начало новой строки.

Есть также отдельный формат для записей перемещений кладовщика по лабиринту. В нём все перемещения записываются буквами r, l, u и d (соответствующие четырём направлениям перемещений). Если при перемещении двигается ящик, то буквы записываются в верхнем регистре.

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

Статья была впервые опубликована в журнале «Компьютерра» 24 июля 2007.

Комментарии (29)


  1. Taritsyn
    02.01.2022 11:23
    +2

    Удивлен, что в статье не упоминается наиболее известный в нашей стране клон сокобана для NES/Famicom – «Склад №18» Александра Чудова.


    1. dfgwer
      02.01.2022 12:28
      +1

      Да ну на
      Как решается задачка с картинки?

      Или в этой версии есть дополнительные возможности?
      Или тут уже проигранный вариант на скриншоте?


      1. DocJester
        02.01.2022 13:01
        +4

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


        1. AntonSazonov
          02.01.2022 14:08
          +3

          Это проигрышная ситуация.

          Изначальное расположение ящиков.
          Изначальное расположение ящиков.


          1. lamerok
            02.01.2022 16:48
            +4

            Почему?

            1. Сдвигаем ящик на кирпичах влево

            2. Ящик над ним вверх

            3. Ящик перед ним вниз

            4. Дальше нижний ящик ставим на место...

            5. .. Ну там дальше просто уже.


            1. danfe
              02.01.2022 18:13
              +5

              Почему [это проигрышная ситуация]?
              Потому что вы описываете обычное решение первого уровня, а на триптихе выше (речь изначально шла про правый скриншот) ящик из крестовины задвинут внутрь (человечек под ним), что и делает позицию неразрешимой.


            1. Mavolio-Bent
              02.01.2022 18:24
              +2

              На позиции из начала ветки
              1. Сдвигаем ящик на кирпичах влево
              2. Ящик над ним вверх
              3. Ящик перед ним вниз
              и получаем конфигурацию

              .@$
              #$#
              #$#

              которая уже неразрешима (я привел только часть карты тут)


    1. grigr
      02.01.2022 18:24
      +2

      Много лет интересовался Сокобаном, но этот клон никогда не видел...


  1. cepera_ang
    02.01.2022 12:21
    +17

    Статья была впервые опубликована в журнале «Компьютерра» 24 июля 2007.

    И для хабра 2022 вполне сойдет :)


  1. kraidiky
    02.01.2022 12:28
    +1

    Как раз подумывал не попробовать ли придумать ИИ для всеми забытой игры. А тут такое... :)


    1. Wolf4D
      03.01.2022 12:41
      +1

      Попробуйте использовать марковские цепи или дерево принятия решений. Должно сработать.



  1. danfe
    02.01.2022 12:34
    +2

    Одна из любимейших игр детства, наряду с Арканоидом, Диггером, «Викингами», TIM и LHX.

    Сейчас клонов этой игры, быстро ставшей классической, великое множество.
    При этом ни один не сумел воспроизвести шарм и ламповость оригинального холобайтовского (к счастью, он замечательно работает в досбоксе); тот же XSokoban выглядит как топорная студенческая поделка.
    В [XSokoban] были перенесены классические уровни. Причём восемь из них перенесены с ошибками.
    Здесь на Хабре кто-то в свое время выдирал уровни из досовского XT'шного клона; интересно, там оригинальные или уже упрощенные?
    В нём все перемещения записываются буквами r, l, u и d (соответствующие четырём направлениям перемещений).
    Квакеры смотрят на эти буквы с неодобрением, поглаживая пальцами WASD. :-)


  1. belch84
    02.01.2022 15:20
    +3

    Давным-давно играл в какой-то вариант Сокобана (для MS DOS), написанный программистом с грузинской фамилией, помню, там была специальная кнопка «Начальник идет» (кажется, F7), при нажатии на нее возникал экран PC Tools, демонстрирующий что пользователь якобы работает со списком файлов. Конечно же, это была просто картинка, исчезавшая при нажатии на любую клавишу


    1. stalker_by
      02.01.2022 16:18

      Вот меня тоже смутило что не упоминается "Мудрый крот" :)


      1. tyomitch
        02.01.2022 16:30

        «Грузинская фамилия» — это Роботландия? По аналогии с Берия и Данелия?


    1. pehat
      02.01.2022 16:28
      +5

      KURTAN написал Реваз Месаркишвили, как такое можно забыть? https://youtu.be/DGlMsbuKGqM


  1. iklin
    02.01.2022 16:18
    +2

    Можно было освежить статью примерами современного развития идей сокобана. Я, вот сейчас время от времени прикладываюсь к довольно оригинальной игрушке, в которой совмещены идеи данжн-кроулера и сокобана — Dungeon and Puzzles. Интересная штуковина получилась. Любителям головоломок рекомендую к ознакомлению.


  1. grigr
    02.01.2022 19:08
    +5

    Я раньше занимался разработкой уровней для Сокобана. Скажем так это не тривиальная задача. Знаком с авторами упомянутых SokoMind и SokoYasc (одни из лучших программ), немного помогал их улучшать.

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

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

    Кстати версия для ZX80 от Холобайт имела упрощённые уровни, некоторые оригинальные уровни были сделаны под больший размер экрана. А на спектруме их просто уменьшили и упростили.

    Сам автор оригинального Сокобана к сожалению никогда не общался с сообществом, он избегал даже японских фанатов. Собственно игра развивалась сама по себе. Кстати его оригинальная компания недавно выпустила порт под Андроид, можно приобрести, но есть множество бесплатных и более удобных программ.

    Было несколько удачных вариаций : с цветными ящиками, пронумероваными. Или с измененными правилами - например можно только тащить на себя ящики, а не толкать, или с дополнительными видами препятствий. Но до гениальной простоты оригинала им далеко!

    В настоящее время игра хоть и не очень распространена, но живёт своей жизнью. Есть европейское и китайское сообщества. Много авторов создают интересные уровни, есть ежемесячные соревнования для профи. Удачи ;)


    1. LynXzp
      03.01.2022 01:14
      +1

      Сейчас есть интересные Солверы (весьма хороший встроен в SokoYasc), но до человека им ещё ой как далеко. Поддаются пока только маленькие уровни, которые подходят для полного перебора. Может когда нибудь с большими сможет справляться ИИ на основе машинного обучения. Может когда нибудь с большими сможет справляться ИИ на основе машинного обучения.
      Есть несколько научных работ по решению по решению сокобана. Там и без ИИ алгоритмы куда более сложные чем простой перебор. (Не могу найти ту магистерскую работу которую хотел привести в пример где есть обзор наверное двух десятков алгоритмов-оптимизаций. Но некоторые работы можно увидеть просто на первой странице поиска гугла по словосочетанию sokoban solving) Правда в основном это студенческие работы ради самой работы, и готовых реализаций просто так не найти.


      1. grigr
        03.01.2022 01:24
        +1

        Теоретические выкладки мало интересны.

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


  1. Exchan-ge
    02.01.2022 22:08
    +1

    Сейчас клонов этой игры, быстро ставшей классической, великое множество


    Интересно, можно ли считать Digger и Supaplex клонами Сокобана?


    1. checkpoint
      02.01.2022 22:39
      +3

      Supaplex это клон Boulder Dash с Atari / C64. Очень клёвая игра, наверное одна из первых видеоигр увиданная мной в игровых салонах, которые в конце 80-х были на каждом вокзале. До сих пор играю в Boulder Dash эпизодически на Atari XE, сам или с детьми - в офисе стоит аутентичный Atari 130XE. Там же на Atari есть конструктор лабиринтов Boulder Dash Construction Yard, его можно рассматривать как отдельный вариант игры: один игрок создает лабиринт, а другие пытаются его пройти. Создание качественного лабиринта - весьма не простая логическая задача. Очень затягивает.

      Digger это клон Mr. Do! и тоже с Atari, причем весьма упрощенный вариант.


      1. Exchan-ge
        02.01.2022 23:04
        +1

        Supaplex это клон Boulder Dash


        Я имею в виду сам принцип игры — с определением правильного порядка перемещения предметов-препятствий.

        А в Supaplex (с GOG) я и сам иногда с удовольствием поигрываю, из ностальгии по начальному периоду своей компьютеризации.

        Digger это клон Mr. Do!


        Скорее, они оба клоны Dig Dug


        1. grigr
          03.01.2022 01:27
          +1

          Это точно не клоны. Что-то общее есть, но не больше. И это 100% аркады! Хотя думаю надо очень много. Супаплекс одна из любимых игр


  1. checkpoint
    02.01.2022 22:24
    +1

    А есть ли в природе версия Sokoban-а под X11 с анимацией, спец эффектами (GL) и музыкой ? Хочу детям показать.


    1. danfe
      04.01.2022 12:53
      +1

      Если нет аллергии на Джаву, можете попробовать Sokobano. Оно, конечно, немного топорное (и сглаживание не особо помогает), но в принципе под ваши требования подходит.


  1. diafour
    03.01.2022 23:30
    +1

    На Корвете был клон — «Докер».