wherepost id =showLabel $board !id
showLabel n
=cell $show $ casen of
15 ->0
n
->n +1
cell ”0”
=”
”
cell [x]
=’ ’ :’ ’ :x :’ ’ :[]
cell [a,b] =’ ’ :a :b :’ ’ :[]
line =”+----+----+----+----+\n”
nums =((space ++”|”) ++) .foldr (\a b ->a ++”|” ++b) ”\n” .
map post
column i =nums $map (\x ->(i, x)) [0 ..3]
space =”\t”
Теперь мы можем загрузить модуль Loopв интерпретатор и набрать play. Немного отвлечёмся и поигра-
ем.
Prelude> :l Loop
[1 of2] Compiling Game
( Game.hs, interpreted )
[2 of2] Compiling Loop
( 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 |
|
+----+----+----+----+
Игра окончена.
Ураа, получилось. Мы так долго писали программу, проверяя лишь типы, и в самом конце, когда мы
закончили определение, всё работает. Конечно не всё работает так гладко, я уже написал эту программу и
объясняю готовое решение, но когда общая схема программы утряслась, возможные ошибки определяются
на раз. Мы могли вызвать отображение позиции не в том порядке или забыть проверку конца игры, всё это
несколько строчек изменений.
Самые неприятные ошибки происходят, когда в середине выясняется, что мы ошиблись с типами. Типы,
которые мы выбрали не могут описать явление, возможно мы не можем делать какие-то операции, которые
нам, как неожиданно выяснилось, очень нужны. Это значит, что нужно менять каркас. Менять каркас, это
значит сносить весь дом и строить новый. Возможно разрушения окажутся локальными, мы строим не дом,
а город. И сносить придётся не всё, а несколько кварталов. Но это тоже большие перемены. Поэтому шаг
Читать дальше