clrscr ;вдруг кликнули 2 раза
'ent' var '
' 'ent' mov ;nl нифига не работает у меня
'количествоходов' var ;любые пятнашки решаются за 0-80 ходов.
'массивполя' var arr 'массивполя' mov
'номерстроки' var
'номерстолбца' var
'пятнашка' var 1 'пятнашка' mov
'команда' var 0 'команда' mov
'победитель' var 0 'победитель' mov
'пустышкаX' var ;понадобятся дальше. Для временного хранения.
'пустышкаY' var
'пятнашкаX' var
'пятнашкаY' var
;массив со случайными пятнашками.
'пятнашки' var arr 'пятнашки' mov
;заполняем по порядку
:ЦФпятнашек
пятнашка str пятнашка str пятнашки set
пятнашка inc 'пятнашка' mov
пятнашка 16 < 'ЦФпятнашек' jt
;теперь всё это тусуем, 50 пробежек, 2 шашки меняем местами. Использую переменную 'пятнашка'.
1 'пятнашка' mov
:ЦТпятнашек
1 15 rand dup пятнашки get
1 15 rand dup пятнашки get ;в буфере теперь 'ячейка/пятнашка/ячейка/пятнашка', в обратном порядке
'команда' mov
пятнашки set
команда swap
пятнашки set
пятнашка inc 'пятнашка' mov
пятнашка 51 < 'ЦТпятнашек' jt
;Init()
;заполняем поле пятнашками
1 'номерстроки' mov
1 'пятнашка' mov
:ЦЗстроки
1 'номерстолбца' mov
:ЦЗстолбца
пятнашка пятнашки get номерстроки str номерстолбца str add массивполя set
пятнашка inc 'пятнашка' mov
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ЦЗстолбца' jt
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ЦЗстроки' jt
' ' '44' массивполя set ;16 ячейка пуста
:циклигры;*********************************************************************
clrscr
;рисуем игровое поле:
1 'номерстроки' mov
:ЦОстроки
1 'номерстолбца' mov
'╔═══╗╔═══╗╔═══╗╔═══╗' ent add write
:ЦОстолбца
'║ ' номерстроки str номерстолбца str add массивполя get 'добавитьпробел' call '║' add write ;рисует клетку. Если число меньше 10 то добавляет справа отступ.
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ЦОстолбца' jt
ent '╚═══╝╚═══╝╚═══╝╚═══╝' add ent add write
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ЦОстроки' jt
;нарисовали поле
;получить действие пользователя
read num round 'команда' mov ;округляем туда-сюда
'возможностьхода' call
'циклигры' jmp;*********************************************************************
;functions
;function StepPossible(Number)
:возможностьхода
;во первых проверим правильно ли ввели число
команда num 1 < 'циклигры' jt
команда num 15 > 'циклигры' jt
;теперь проверяем, возможен ли вообще такой ход?
;для этого получаем координаты пустышки и нужного нам числа
1 'номерстроки' mov
:ЦПстроки
1 'номерстолбца' mov
:ЦПстолбца
команда num номерстроки str номерстолбца str add массивполя get num = 'запомнитьпятнашку' callt
' ' номерстроки str номерстолбца str add массивполя get str = 'запомнитьпусто' callt
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ЦПстолбца' jt
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ЦПстроки' jt
;запомнили. Что же дальше? Ход возможен только если пятнашка и пустышка рядом.
;пятнашка над пустышкой
пустышкаX пятнашкаX = пустышкаY пятнашкаY sub 1 = and 'ходим' callt
;пятнашка под пустышкой
пустышкаX пятнашкаX = пятнашкаY пустышкаY sub 1 = and 'ходим' callt
;пятнашка слева от пустышки
пустышкаX пятнашкаX sub 1 = пятнашкаY пустышкаY = and 'ходим' callt
;пятнашка справа от пустышки
пятнашкаX пустышкаX sub 1 = пятнашкаY пустышкаY = and 'ходим' callt
;'ходим' call
ret
;function Step(number)
:ходим
' ' пятнашкаY str пятнашкаX str add массивполя set;меняем местами пятнашку
команда пустышкаY str пустышкаX str add массивполя set;и пустышку
количествоходов inc 'количествоходов' mov
1 'победитель' mov
'проверитьпобедитель' call
1 победитель = 'theend' jt
ret
;function Razrad(number)
:добавитьпробел
dup num 9 > 'недобавлятьпробел' jt
add ' ' add
'конецдобавления' jmp
:недобавлятьпробел
add
:конецдобавления
ret
;function SaveFifteen(X,Y)
:запомнитьпятнашку
номерстроки 'пятнашкаY' mov
номерстолбца 'пятнашкаX' mov
ret
;function SaveNull(X,Y)
:запомнитьпусто
номерстроки 'пустышкаY' mov
номерстолбца 'пустышкаX' mov
ret
;function CheckWinner()
:проверитьпобедитель
1 'пятнашка' mov
1 'номерстроки' mov
:ППстроки
1 'номерстолбца' mov
:ППстолбца
команда num номерстроки str номерстолбца str add массивполя get dup
пятнашка <> ' ' <> or 'непобедитель' callt
пятнашка inc 'пятнашка' mov
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ППстолбца' jt
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ППстроки' jt
ret
:непобедитель
0 'победитель' mov
ret
:theend
'THE END' write