( Loop. hs, interpreted )
Ok, modules loaded: Loop, Game.
*Loop> play
Привет! Это игра пятнашки
+----+----+----+----+
|
1 |
2 |
3 |
4 |
+----+----+----+----+
|
5 |
6 |
7 |
8 |
+----+----+----+----+
|
9 | 10 | 11 | 12 |
+----+----+----+----+
| 13 | 14 | 15 |
|
+----+----+----+----+
Возможные ходы пустой клетки:
left
или l
-- налево
right
или r
-- направо
up
или u
-- вверх
down
или d
-- вниз
Другие действия:
new int
или n int -- начать новую игру, int - целое число,
указывающее на сложность
quit
или q
-- выход из игры
Начнём новую игру?
Укажите сложность (положительное целое число):
5
+----+----+----+----+
|
1 |
2 |
3 |
4 |
+----+----+----+----+
|
5 |
6 |
7 |
8 |
+----+----+----+----+
Пятнашки | 213
|
9 |
| 10 | 11 |
+----+----+----+----+
| 13 | 14 | 15 | 12 |
+----+----+----+----+
Ваш ход:
r
+----+----+----+----+
|
1 |
2 |
3 |
4 |
+----+----+----+----+
|
5 |
6 |
7 |
8 |
+----+----+----+----+
|
9 | 10 |
| 11 |
+----+----+----+----+
| 13 | 14 | 15 | 12 |
+----+----+----+----+
Ваш ход:
r
+----+----+----+----+
|
1 |
2 |
3 |
4 |
+----+----+----+----+
|
5 |
6 |
7 |
8 |
+----+----+----+----+
|
9 | 10 | 11 |
|
+----+----+----+----+
| 13 | 14 | 15 | 12 |
+----+----+----+----+
Ваш ход:
d
+----+----+----+----+
|
1 |
2 |
3 |
4 |
+----+----+----+----+
|
5 |
6 |
7 |
8 |
+----+----+----+----+
|
9 | 10 | 11 | 12 |
+----+----+----+----+
| 13 | 14 | 15 |
|
+----+----+----+----+
Игра окончена.
Ураа, получилось. Мы так долго писали программу, проверяя лишь типы, и в самом конце, когда мы
закончили определение, всё работает. Конечно не всё работает так гладко, я уже написал эту программу и
объясняю готовое решение, но когда общая схема программы утряслась, возможные ошибки определяются
на раз. Мы могли вызвать отображение позиции не в том порядке или забыть проверку конца игры, всё это
несколько строчек изменений.
Самые неприятные ошибки происходят, когда в середине выясняется, что мы ошиблись с типами. Типы,
которые мы выбрали не могут описать явление, возможно мы не можем делать какие-то операции, которые
нам, как неожиданно выяснилось, очень нужны. Это значит, что нужно менять каркас. Менять каркас, это
значит сносить весь дом и строить новый. Возможно разрушения окажутся локальными, мы строим не дом,
а город. И сносить придётся не всё, а несколько кварталов. Но это тоже большие перемены. Поэтому шаг
определения типов очень важен. Впрочем сносить кварталы в Haskell одно удовольствие, посольку стоит
нам изменить какой-нибудь тип, например убрать какой-нибудь тип или изменить имя, компилятор тут же
подскажет нам какие функции стали бессмысленными. Более коварные изменения связаны с добавлением
конструктора-альтернативы. Например нам вдруг не понравился тип Bool и мы решили сделать его более
человечным. Мы решили добавить ещё одно значение:
data Bool = True | False | IDonTKnow
Это может привести к неполному рассмотрению альтернатив в case-выражениях и сопоставлениях с об-
разцом в аргументах функции. Такие ошибки крайн неприятны, поскольку они происходят на этапе выпол-
нения программы, когда новое значение IDonTKnow дойдёт до case. В этом случае нам на выручку может
прийти функция свёртки, если мы вместе с типом изменим и функцию свёртки, это скажется на всех функ-
циях, которые были определены через неё. Чем больше таких функций, тем больше ошибок мы поймаем.
214 | Глава 13: Поиграем
13.3 Упражнения
• Измените диалог с пользователем. Сделайте так чтобы у игры было главное меню, в котором игрок
выбирает разные побочные функции, вроде выхода, начать новую игру, подсказка и игровое меню, в
котором игрок только передвигает фишки. Когда игрок собирает игру он попадает в главное меню.
• Добавьте в игру подсчёт статистики. Если игрок дошёл до победной позиции он узнаёт за сколько ходов
ему удалось решить задачу. Также ведётся история предыдущих попыток, по которой пользователь
может следить как изменяются его результаты.
• Подумайте можно ли выделить интерфейс игры в отдельный класс так, чтобы модуль Loop не зависел
от конкретной реализации игры. Чтобы можно было, опираясь на абстрактные методы, вроде show для
Game, или реакции на ход, вести диалог с пользователем. Попробуйте переписать игру пятнашки с
помощью такого класса.
• Попробуйте написать другую игру, например игру раскладывания пасьянса, крестики-нолики или