Игра "15" |
Главная / ЭКВМ / Программы для ЭКВМ / Игры |
Игра "Пятнадцать" - известная игра с пятнадцатью пронумерованными фишками на шестнадцатиклеточном поле 4x4. Цель игры - расставить фишки в указанном ниже порядке за минимальное количество ходов.
ЗапускПрограмма загружается в память с нулевой страницы и запускается командами "В/О", "С/П". После запуска на экране появляется игровое поле, на котором автоматически перемещаются фишки. Через некоторое время перемещение заканчивается - можно приступать к игре.
Управление
Программа "Пятнадцать"Файл game15.mkp, v1.2 (КС 74596/119)
Исходный текст для кросс-компилятораФайл game15.mkl, v1.2
.CHARSET 1251
; Файл game15 - Игра 15 для ЭКВМ
; V1.2 (21.06.2010) НПП "СЕМИКО"
; R11-R44 - поле (начиная с RB), заполнено числами от 0 до 15
; Соответствие клеток и регистров:
; 11 12 13 14
; 21 22 23 24
; 31 32 33 34
; 41 42 43 44
; RA - текущая позиция 0 (пустой ячейки)
; R9 - позиция для обмена с 0
; R8 - позиция для обмена при перемешивании
; R7=15
; R6=0,4
; R5=0,2
; R4 - счётчик шагов
; R3=10
; используются R0, R1
.ORG 0
CX PM 44 ; начальная позиция 0 - 44
2 MC ; 2 - 12
PP M 9010 ; инициализация экрана в режиме 2
; константы
10 M3 PM 32
15 M7 PM 43
0,4 M6
0,2 M5
; начальная расстановка, кроме ранее инициализированных 12, 32, 43, 44
1 MB
3 MD
4 ME
5 PM 21
6 PM 22
7 PM 23
8 PM 24
9 PM 31
11 PM 33
12 PM 34
13 PM 41
14 PM 42
44 MA
P GSB MIX
CX M4 ; обнулить счётчик шагов
ML0: PP RM 9029 ; считать кнопку
M1
KNOT ; инвертировать код
FX!=0 ML0 ; зациклить
RM1
P GSB S_K ; обработать код
FX=0 ML0 ; нет перемещения
KRM4 ; инкремент счётчика шагов
16 ENT 90
PP M 9000
RM4
PP M 9023 ; вывод счётчика
KGRPH
GOTO ML0;
; перемещение фишки вверх
S_U: RMA 35 -
FX>=0 S_U1
1 RTN
S_U1: RMA RM3 + M9 ; +=10
KRM9 KMA
CX KM9
RTN
; перемещение фишки вниз
S_D: RMA RM7 - ; -=15
FX<0 S_D1
1 RTN
S_D1: RMA RM3 - M9 ; -=10
KRM9 KMA
CX KM9
RTN
; перемещение фишки влево
S_L: RMA RM3 / KFRAC ; /=10
RM6 - ; -=0,4
FX>=0 S_L1
1 RTN
S_L1: RMA 1 + M9
KRM9 KMA
CX KM9
RTN
; перемещение фишки вправо
S_R: RMA RM3 / KFRAC ; /=10
RM5 - ; -=0,2
FX<0 S_R1
1 RTN
S_R1: RMA 1 - M9
KRM9 KMA
CX KM9
RTN
;Координаты ячейки RX (11..44) вычислить и записать в X0,Y0
S_XY: RM3 / ENT ; /=10
KINT RM7 * ; *=15
13 - ; смещение поля по Y
<->
KFRAC 150 *
13 - ; смещение поля по X
PP M 9000
RTN
; Отрисовка фишки RX по заранее определённым координатам X0,Y0
S_P: 32 * ; умножить на размер изображения
.NUM PICT + ; смещение изображений фишек
PP M 9015 ; вывести
RTN
; вывод изображений по R9 и RA
; временно: после успешного перемещения в R9 - координаты 0, в RA - передвинутой фишки
S_I: RM9
P GSB S_XY
CX
P GSB S_P
RMA
P GSB S_XY
KRMA ; номер фишки
P GSB S_P
RM9 MA ; переместить адрес 0 из R9 в RA
RTN
; перемещение, в RX - код клавиши
S_K: 34 -
FX<0 S_K2
S_K1: 1
RTN
S_K2: FX=0 S_K3
P GSB S_R ; ==34
GOTO S_KI
S_K3: 1 -
FX=0 S_K4
P GSB S_L ; ==35
GOTO S_KI
S_K4: 1 -
FX=0 S_K5
P GSB S_U ; ==36
GOTO S_KI
S_K5: 1 -
FX=0 S_K1
P GSB S_D ; ==37
GOTO S_KI
S_KI: FX=0 S_K1 ; если нельзя переместить, то к S_K1
P GSB S_I ; после успешного перемещения отрисовать фишку
K GRPH ; вывести на графический экран
CX
RTN
MIX: ; начальная отрисовка поля
CX ENT
PP M 9000 ; X0,Y0
63 ENT
PP M 9014 ; рамка
2 ENT 70
PP M 9000
.NUM TXT1
PP M 9021 ; вывод названия игры
16 ENT 70
PP M 9000
.NUM TXT2
PP M 9021 ; шаг
15 M0 ; перемешивание
.NUM REG
M1
MIX0: RM1
RM0
+
KPRGM
M9
RM1
RM0 1 -
KRAN
*
KINT
+
1 +
KPRGM
M8
KRM8
KRM9
KM8
<->
KM9
FL0 MIX0
16 M0 ; вывод
MIX1: RM1
RM0
+
KPRGM
M9
P GSB S_XY
KRM9
P GSB S_P
FL0 MIX1
K GRPH
RTN
REG: .DB 0,11,12,13,14,21,22,23,24,31,32,33,34,41,42,43,44
TXT1: .TEXT "Игра \"15\"\0"
TXT2: .TEXT "Шаг\0"
PICT:
;"0"
.DB 0Fh, 0Fh
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
.DB 0, 0
;"1"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"2"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 21h, 23h
.DB 91h, 22h
.DB 91h, 22h
.DB 91h, 22h
.DB 61h, 22h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"3"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 21h, 21h
.DB 11h, 22h
.DB 11h, 22h
.DB 51h, 22h
.DB 0A1h, 21h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"4"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 81h, 21h
.DB 41h, 21h
.DB 21h, 21h
.DB 0F1h, 23h
.DB 1, 21h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"5"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 71h, 21h
.DB 51h, 22h
.DB 51h, 22h
.DB 51h, 22h
.DB 91h, 21h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"6"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 0E1h, 21h
.DB 51h, 22h
.DB 51h, 22h
.DB 51h, 22h
.DB 81h, 21h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"7"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 11h, 20h
.DB 11h, 23h
.DB 91h, 20h
.DB 51h, 20h
.DB 31h, 20h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"8"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 0A1h, 21h
.DB 51h, 22h
.DB 51h, 22h
.DB 51h, 22h
.DB 0A1h, 21h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"9"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 1, 20h
.DB 1, 20h
.DB 61h, 20h
.DB 91h, 22h
.DB 91h, 22h
.DB 91h, 22h
.DB 0E1h, 21h
.DB 1, 20h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"10"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 0E1h, 21h
.DB 11h, 22h
.DB 11h, 22h
.DB 11h, 22h
.DB 0E1h, 21h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"11"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"12"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 21h, 23h
.DB 91h, 22h
.DB 91h, 22h
.DB 91h, 22h
.DB 61h, 22h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"13"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 21h, 21h
.DB 11h, 22h
.DB 11h, 22h
.DB 51h, 22h
.DB 0A1h, 21h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
;"14"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 81h, 21h
.DB 41h, 21h
.DB 21h, 21h
.DB 0F1h, 23h
.DB 1, 21h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
; "15"
.DB 0Fh, 0Fh
.DB 0FEh, 1Fh
.DB 3, 30h
.DB 1, 20h
.DB 21h, 22h
.DB 0F1h, 23h
.DB 1, 22h
.DB 1, 20h
.DB 71h, 21h
.DB 51h, 22h
.DB 51h, 22h
.DB 51h, 22h
.DB 91h, 21h
.DB 3, 30h
.DB 0FEh, 1Fh
.DB 0, 0
.END
ВерсииV1.0 (11.06.10) - первая версия. V1.1 (12.06.10) - изменён алгоритм перемешивания, уменьшено количество возвратов. V1.2 (21.06.10) - для ускорения работы программы алгоритм перемешивания заменён на оптимальный. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |