Игра "15"


Главная / ЭКВМ / Программы для ЭКВМ / Игры

Игра "Пятнадцать" - известная игра с пятнадцатью пронумерованными фишками на шестнадцатиклеточном поле 4x4. Цель игры - расставить фишки в указанном ниже порядке за минимальное количество ходов.

1234
5678
9101112
131415 

Запуск

Программа загружается в память с нулевой страницы и запускается командами "В/О", "С/П". После запуска на экране появляется игровое поле, на котором автоматически перемещаются фишки. Через некоторое время перемещение заканчивается - можно приступать к игре.

Игра пятнадцать - вариант начальной расстановки

Случайные варианты расстановки в процессе игры сводятся к двум вариантам: полностью упорядоченному и с изменённым порядком следования двух фишек. Чтобы исключить возможность неприводимости начальное состояние в игре достигается путём перемешивания из упорядоченного. Качество и продолжительность перемешивания можно варьировать, заменив число 300 по адресам 336-338 на меньшее или большее количество шагов.

Управление

Игра пятнадцать - выполнено два хода влево

Управление в игре производится стрелками, т.е. клавишами ВЫБОР. По нажатию стрелки фишка перемещается в указанном направлении на свободную клетку. Если ход невозможен, он не выполняется и не учитывается.

Программа "Пятнадцать"

Файл game15.mkp, v1.2 (КС 74596/119)

  0 1 2 3 4 5 6 7 8 9
000 Cx P П 44 2 П C PP П 90 10 1 0
010 П 3 P П 32 1 5 П 7 P П 43 0 ,
020 4 П 6 0 , 2 П 5 1 П B 3 П D
030 4 П E 5 P П 21 6 P П 22 7 P П
040 23 8 P П 24 9 P П 31 1 1 P П
050 33 1 2 P П 34 1 3 P П 41 1
060 4 P П 42 4 4 П A P ПП 02 73 Cx
070 П 4 PP ИП 90 29 П 1 K NOT F x≠0 71 ИП 1 P ПП
080 02 24 F x=0 71 K ИП 4 1 6 B↑ 9 0
090 PP П 90 00 ИП 4 PP П 90 23 K ГРФ БП 71
100 ИП A 3 5 - F x≥0 08 1 В/О ИП A ИП 3
110 + П 9 K ИП 9 K П A Cx K П 9 В/О ИП A ИП 7 -
120 F x<0 24 1 В/О ИП A ИП 3 - П 9 K ИП 9 K П A
130 Cx K П 9 В/О ИП A ИП 3 ÷ K {x} ИП 6 - F x≥0
140 43 1 В/О ИП A 1 + П 9 K ИП 9 K П A Cx
150 K П 9 В/О ИП A ИП 3 ÷ K {x} ИП 5 - F x<0 62
160 1 В/О ИП A 1 - П 9 K ИП 9 K П A Cx K П 9
170 В/О ИП 3 ÷ B↑ K [x] ИП 7 × 1 3 -
180 K {x} 1 5 0 × 1 3 - PP П
190 90 00 В/О 3 2 × 0 3 9 5
200 + PP П 90 15 В/О ИП 9 P ПП 01 71 Cx
210 P ПП 01 93 ИП A P ПП 01 71 K ИП A P ПП 01
220 93 ИП 9 П A В/О 3 4 - F x<0 31 1
230 В/О F x=0 38 P ПП 01 52 БП 65 1 -
240 F x=0 47 P ПП 01 33 БП 65 1 - F x=0
250 56 P ПП 01 00 БП 65 1 - F x=0 29
260 P ПП 01 17 БП 65 F x=0 29 P ПП 02 05
270 K ГРФ Cx В/О Cx B↑ PP П 90 00 6 3
280 B↑ PP П 90 14 2 B↑ 7 0 PP П 90
290 00 0 3 8 1 PP П 90 21 1 6
300 B↑ 7 0 PP П 90 00 0 3 9 1
310 PP П 90 21 1 5 П 0 0 3 6 4
320 П 1 ИП 1 ИП 0 + K ИПРГ П 9 ИП 1 ИП 0 1 -
330 K СЧ × K [x] + 1 + K ИПРГ П 8 K ИП 8 K ИП 9
340 K П 8 K П 9 F L0 21 1 6 П 0 ИП 1 ИП 0
350 + K ИПРГ П 9 P ПП 01 71 K ИП 9 P ПП 01 93
360 F L0 48 K ГРФ В/О 00h 0Bh 0Ch 0Dh 0Eh 15h
370 16h 17h 18h 1Fh 20h 21h 22h 29h 2Ah 2Bh
380 2Ch 88h A3h E0h A0h 20h 22h 31h 35h 22h
390 00h 98h A0h A3h 00h 0Fh 0Fh 00h 00h 00h
400 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h
410 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h
420 00h 00h 00h 00h 00h 00h 00h 0Fh 0Fh FEh
430 1Fh 03h 30h 01h 20h 01h 20h 01h 20h 01h
440 20h 21h 22h F1h 23h 01h 22h 01h 20h 01h
450 20h 01h 20h 03h 30h FEh 1Fh 00h 00h 0Fh
460 0Fh FEh 1Fh 03h 30h 01h 20h 01h 20h 01h
470 20h 21h 23h 91h 22h 91h 22h 91h 22h 61h
480 22h 01h 20h 01h 20h 03h 30h FEh 1Fh 00h
490 00h 0Fh 0Fh FEh 1Fh 03h 30h 01h 20h 01h
500 20h 01h 20h 21h 21h 11h 22h 11h 22h 51h
510 22h A1h 21h 01h 20h 01h 20h 03h 30h FEh
520 1Fh 00h 00h 0Fh 0Fh FEh 1Fh 03h 30h 01h
530 20h 01h 20h 01h 20h 81h 21h 41h 21h 21h
540 21h F1h 23h 01h 21h 01h 20h 01h 20h 03h
550 30h FEh 1Fh 00h 00h 0Fh 0Fh FEh 1Fh 03h
560 30h 01h 20h 01h 20h 01h 20h 71h 21h 51h
570 22h 51h 22h 51h 22h 91h 21h 01h 20h 01h
580 20h 03h 30h FEh 1Fh 00h 00h 0Fh 0Fh FEh
590 1Fh 03h 30h 01h 20h 01h 20h 01h 20h E1h
600 21h 51h 22h 51h 22h 51h 22h 81h 21h 01h
610 20h 01h 20h 03h 30h FEh 1Fh 00h 00h 0Fh
620 0Fh FEh 1Fh 03h 30h 01h 20h 01h 20h 01h
630 20h 11h 20h 11h 23h 91h 20h 51h 20h 31h
640 20h 01h 20h 01h 20h 03h 30h FEh 1Fh 00h
650 00h 0Fh 0Fh FEh 1Fh 03h 30h 01h 20h 01h
660 20h 01h 20h A1h 21h 51h 22h 51h 22h 51h
670 22h A1h 21h 01h 20h 01h 20h 03h 30h FEh
680 1Fh 00h 00h 0Fh 0Fh FEh 1Fh 03h 30h 01h
690 20h 01h 20h 01h 20h 61h 20h 91h 22h 91h
700 22h 91h 22h E1h 21h 01h 20h 01h 20h 03h
710 30h FEh 1Fh 00h 00h 0Fh 0Fh FEh 1Fh 03h
720 30h 01h 20h 21h 22h F1h 23h 01h 22h 01h
730 20h E1h 21h 11h 22h 11h 22h 11h 22h E1h
740 21h 03h 30h FEh 1Fh 00h 00h 0Fh 0Fh FEh
750 1Fh 03h 30h 01h 20h 21h 22h F1h 23h 01h
760 22h 01h 20h 01h 20h 21h 22h F1h 23h 01h
770 22h 01h 20h 03h 30h FEh 1Fh 00h 00h 0Fh
780 0Fh FEh 1Fh 03h 30h 01h 20h 21h 22h F1h
790 23h 01h 22h 01h 20h 21h 23h 91h 22h 91h
800 22h 91h 22h 61h 22h 03h 30h FEh 1Fh 00h
810 00h 0Fh 0Fh FEh 1Fh 03h 30h 01h 20h 21h
820 22h F1h 23h 01h 22h 01h 20h 21h 21h 11h
830 22h 11h 22h 51h 22h A1h 21h 03h 30h FEh
840 1Fh 00h 00h 0Fh 0Fh FEh 1Fh 03h 30h 01h
850 20h 21h 22h F1h 23h 01h 22h 01h 20h 81h
860 21h 41h 21h 21h 21h F1h 23h 01h 21h 03h
870 30h FEh 1Fh 00h 00h 0Fh 0Fh FEh 1Fh 03h
880 30h 01h 20h 21h 22h F1h 23h 01h 22h 01h
890 20h 71h 21h 51h 22h 51h 22h 51h 22h 91h
900 21h 03h 30h FEh 1Fh 00h 00h      

Исходный текст для кросс-компилятора

Файл 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 (многоканальный)