Домашнее задание по курсу Haskell.
Необходимо написать игру Sokoban на Haskell. Правила просты - есть ящики, которые надо расставить по местам, мы их можем двигать на одну клетку, два ящика двигать мы не можем.
Базовые требования:
- Загрузка уровня из файла
- Отрисовка графики
- Отслеживание, завершилась ли игра
Модуль, в котором вершится магия. Функции:
- Main - загрузка всех файлов, запуск игры, вызов Graphics.Gloss.Interface.Pure.Game.play.
- Update - требуется Gloss'ом.
Модуль, в котором описаны использующиеся типы. Типы:
- GameState {Point, MoveDirection, Level, Float};
- CellType - Char;
- Cell - (Point, CellType);
- Level - [Cell];
- TileSize - Float;
- MoveDirection - Направление движения. UDLR и None.
Модуль, в котором происходит парсинг файла с картой. Функции:
- prepareData - подготовка данных для создания уровня.
- makeRow - создание одной строки.
Модуль, в котором происходит проверка коллизий. Функции:
- isHit - проверка коллизии между двумя точками.
- isCollision - проверка коллизии между двумя клетками.
Модуль, в котором обрабатывается движение и сдвиг ящиков. Функции:
- changeType - смена типа клетки на уровне на заданную в параметре.
- moveBox - обработка сдвига коробки.
- handleKeys - обработка ввода с клавиатуры.
- move - обработка движения в целом.
Модуль, в котором происходит отрисовка. Функции:
- window - создание окна с игрой.
- whatImg - разбор символа, возврат нужного тайла.
- drawTile - отрисовка тайла.
- render - отрисовка карты.
Из сторонних библиотек я использую только Gloss.
Управление: стрелочки.
Для запуска надо перейти в корень папки проекта и запустить его командой stack run
. Уровень задаётся в assets/level.
В файле с уровнем каждая клетка - один тайл. Пройдёмся по тайлам:
- /* - стенка.
- . - пол.
- s - место, куда надо поставить ящик.
- f - ящик, который поставили на место.
- b - ящик.
- @ - игрок.
После окончания игры (победы) выводится мотивирующая надпись, настраивающая на позитивную волну. Игру можно закрывать. Если во время игры попали в безвыходную ситуацию, единственный способ из неё выйти - закрыть и заново запустить игру. В спарте глупых детей с горы скидывали, так что я ещё милосерден.
Что ещё написать я не знаю, так что вот интересные факты про сокобан, которые я списал из википедии:
- Soko-Ban, яп. 倉庫番, сокобан — кладовщик.
- Игра Sokoban была создана в 1981 году Хироюки Имабаяси, и издана в 1982 году японской компанией Thinking Rabbit.
- В СССР игра была известна благодаря клонам KURTAN и «Мудрый крот». Известна также версия для приставки Денди — «Склад № 18» (Warehouse No. 18), выпущенная Александром Чудовым, программистом из Ульяновска, в 1997 году.
- Игра Sokoban представляет интерес с точки зрения вычислительной сложности. В 1995 году было доказано, что задача решения уровней Sokoban — NP-трудна, а в 1997 года было установлено, что игра Sokoban — PSPACE-полна.