Радио-86РК/Радио 05,06-88/Играем в Ралли

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: А. ПЕКИН, Ю. СОЛНЦЕВ

Источник: http://retro.h1.ru/RK86/Games/Rally.php

Любой компьютер может быть не только помощником в проведении необходимых вам расчетов, но и хорошим партнером в электронных играх. Создавая на экране дисплея различные динамически меняющиеся игровые ситуации, компьютер развивает быстроту реакции, комбинационное мышление и координацию движений.

Все игровые программы можно условно разделить на два больших класса: интеллектуальные, написанные на языках высокого уровня и, как правило, реализующие алгоритм какой-либо из известных игр (шахматы, шашки и т. п.), и динамические, составленные на языке АССЕМБЛЕРа и работающие в реальном времени. Примером динамических программ может служить уже известная читателям программа «ПИТОН».

Основным недостатком большинства игр, реализуемых на микро-ЭВМ, является неизменность игровой ситуации и правил игры, что приводит к быстрому надоеданию программ и даже раздражению, вызванному предсказуемостью действий электронного «партнера». Выходом из этой ситуации может стать более широкое распространение игр человека с человеком, в которых партнеры могут применить присущие им умение, ловкость и даже хитрость, а на компьютер возлагается роль беспристрастного электронного «арбитра», сначала создающего игровую ситуацию, а затем «зорко» следящего за неукоснительным выполнением правил игры. Две игровые программы, реализующие подобный принцип — «РАЛЛИ» и «ТРЕК», и предлагаются в настоящей статье.

Для возможности участия в игре двух партнеров необходимо, прежде всего, изготовить два пульта управления, с которых в микро-ЭВМ будут вводиться команды игроков.

Каждый пульт состоит из пяти не фиксируемых в нажатом положении клавиш, расположенных в порядке, показанном на рис.1. Поскольку в динамических программах, имеющих весьма большую скорость изменения игровой ситуации, времени для «рассматривания» клавиш практически не бывает, такая конфигурация пульта признана наиболее удобной для осязательной идентификации необходимой клавиши. Тип используемых клавиш может быть любым, важно лишь, чтобы они обладали максимальной износоустойчивостью и надежностью, поскольку интенсивность эксплуатации их будет весьма высокой. В состав каждого пульта входит пять клавиш, из которых четыре формируют различные направления движения объектов игры — «гоночных машин» (причем, в отличие от «ПИТОНа», движение возможно не только по направлению осей координат, но и по диагоналям, что обеспечивается одновременным нажатием двух клавиш), и одна (центральная) — резервная, предназначена для дальнейшего усовершенствования игр.

Схема игровых пультов приведена на рис.2. Кабели, соединяющие пульты с компьютером, содержат по семь проводов и могут иметь длину до трех метров. Подключают пульты к РК через соответствующие разряды микросхемы D14 порта связи с внешними устройствами КР580ВВ55.

Обе предлагаемые читателю игры (таблица кодов, исходные тексты основных частей на языке АССЕМБЛЕР, а также комментарии по использованию программы будут приведены во второй части статьи) формируют на экране ситуации двух основных видов автомобильных соревнований — трековых гонок и ралли. После запуска программы на экране дисплея появляется следующий текст:

ВЫБЕРИТЕ ИГРУ: 
ТРЕК - 1
РАЛЛИ - 2 

После ответа на запрос нажатием на соответствующую клавишу компьютер запоминает вид игры и выводит новый текст;

ВВЕДИТЕ СКОРОСТЬ ГОНКИ (1-9): 

Аналогичным образом вводится скорость, с которой гонщики будут двигаться по трассе. Далее на экране формируются изображения игровых полей (различных для обеих игр) и гоночных машин, обозначаемых символами «$» и «Ж».

Рассмотрим игровые ситуации и порядок взаимодействия микро-ЭВМ и игроков при различных видах гонок.


Ралли

После запуска программы на экране формируется изображение, показанное на рис. 3. Стартовое положение машин — в нижних углах поля. Основные элементы игрового поля крестики-препятствия (начальное количество — 21 шт.), в случайном порядке разбросанные по трассе гонок, а также флажок-цель (символ «забой»), сквозь который нужно проехать машиной раньше соперника. Цель игры — первым набрать 21 флажок (проезд «через» символ забой). При столкновении с препятствием или бортом автомобиля соперника раздается звуковой сигнал и вместо символа машины формируется звездочка, показывающая, что автомобиль поврежден. Управление им на несколько ходов блокируется, что позволяет более удачливому партнеру первым достигнуть цели.

Аналогичная ситуация возникает при наезде на другую машину или ее «обломки» (звездочку). При столкновении двух машин всегда виноват тот, кто «стукнул» первым (он и штрафуется простоем). При ударе машин «в лоб» возникает сразу две звездочки. При известном навыке можно «повредить» машину партнера, подставив ему свою (например, «тормознуть», если за тобой устремились в погоню).

После каждого прохождения одной из машин через флажок он возникает на новом месте. Одновременно с этим на трассе появляются три новых препятствия, что постепенно усложняет игру (при равном классе партнеров к концу заезда на трассе может находиться до 140 препятствий). Количество очков, набранных партнерами, выводится на экран. При сборе 21 флажка одной из машин игра прекращается, на экране возникает надпись:

 
ПОБЕДИТЕЛЬ - с символом победившей машины, а также текст:
ПОВТОР - 1 
ВЫБОР ИГРЫ - 2 
КОНЕЦ - 3

При ответе на запрос можно либо повторить заезд (клавиша 1), либо сменить игру или скорость (клавиша 2), либо выйти в МОНИТОР (клавиша 3).

Трек

После запуска программы на экран выводится игровое поле, примерный вид которого показан на рис.4. Рисунок трека может быть любым и задаваться владельцем компьютера (о том, как это сделать, будет рассказано во второй, части статьи).

Автомобили при трековых гонках установлены в левой верхней части трека. В левой нижней его части формируется финишная линия, состоящая из двух символов «: :». Задача играющих, стартовав в направлении слева направо, быстрей партнера проехать пять кругов (напомним, что машины могут двигаться и по диагонали), как можно тщательнее «вписываясь» в повороты трека. При столкновении с «обочиной» трека, а также с другой машиной гонщик штрафуется так же, как в ралли. Направление движения может быть любым, что позволяет вести весьма разнообразную тактическую борьбу на трассе с использованием большего числа приемов (разворот и движение навстречу приближающемуся партнеру с целью психологического прессинга, выезд из-за «угла» и т. п.).

При прохождении финишной линии символ машины на мгновение гаснет и раздается звуковой сигнал. В тот момент, когда один из играющих достигнет финиша в пятый раз, игра прекращается, и на экране появляются сообщения, аналогичные приведенным для ралли.

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

Машинные коды программы обеих игр занимают в ОЗУ компьютера область адресов с 0000Н по 0454Н и приведены в табл.1. Их вводят в компьютер по директиве МОНИТОРа «М». После проверки корректности набора программу запускают по адресу 0000Н и, выбрав, например, игру «РАЛЛИ», оценивают правильность реагирования машин на команды с пультов. Направление движения должны соответствовать сочетаниям нажимаемых клавиш. При запрещенных комбинациях (например, одновременной подаче команд влево — вправо или вверх-вниз), и также при трех или четырех нажатых клавишах машины должны оставаться на месте. При неверном реагировании на управляющие команды следует проверить правильность монтажа и подключения к порту ввода клавиши, соответствующей этому направлению.

						Таблица 1.
0000 	CD 4F 04 21 40 01 CD 18 F8 CD 03 F8 FE 31 CA 16
0010	00 FE 32 C2 09 00 D6 31 32 55 04 21 17 02 CD 18
0020	F8 CD 03 F8 4F D6 30 32 56 04 FE 01 FA 21 00 FE
0030	0A D2 21 00 CD 09 F8 11 00 21 00 00 f1 47 3E 0A
0040 	90 19 3D C2 41 00 22 57 04 CD 3D 04 CD 4F 04 3A
0050	55 04 A7 C2 98 00 CD 4F 04 CD 3D 04 32 55 04 21
0060	49 79 22 5D 04 21 97 79 22 5F 04 21 00 05 01 FA
0070 	78 7E 02 03 23 7C FE 0B C2 71 00 C0 6E 03 CD 46
0080 	03 3A 8B 02 B9 CA 0D 01 CD D5 03 CD 46 03 3A 8B
0090 	02 B9 CA 16 01 C3 7B 00 CD 4F 04 CD 09 F8 21 C2
00A0 	77 E5 01 01 00 1E 3F CD 90 02 E5 21 12 7F 1E 3F
00B0 	CD 90 02 E1 0E 4E 1E 19 CD 90 02 E1 1E 19 CD 90
00C0 	02 1E 15 CD BD 02 0E 2B CD 09 F8 1D C2 C3 00 21
00D0 	74 01 CD 18 F8 3A 56 04 CD 15 F8 CD BD 02 0E 7F
00E0 	CD 09 F8 CD 3D 04 2F 32 55 04 21 C5 7E 22 5D 04
00F0 	21 02 7F 22 5F 04 CD 6E 03 3A 8C 02 B9 CA 0D 01
0100 	CD D5 03 3A 8C 02 B9 CA 16 01 C3 F6 00 21 C3 01
0110 	CD 18 F8 C3 1C 01 21 D0 01 CD 18 F8 21 DD 01 CD
0120 	18 F8 21 45 02 CD 18 F8 CD 03 F8 FE 31 CA 49 00
0130 	FE 32 CA 00 00 FE 33 CA 00 F8 C3 28 01 1B 59 00
0140 	1B 59 2C 34 20 20 77 79 62 65 72 69 74 65 20 69
0150 	67 72 75 3A 1B 59 2E 34 74 72 65 6B 20 2D 20 22
0160 	31 22 1B 59 30 34 72 61 6C 6C 69 20 2D 20 22 32
0170 	22 20 20 00 1B 59 20 20 24 2D 30 30 2E 1B 59 20
0180 	5B 2E 76 2D 30 30 1B 59 21 20 58 58 58 58 58 58
0190 	1B 59 21 5A 58 58 58 58 58 58 1B 59 20 3A 2E 73
01A0 	6B 6F 72 6F 73 74 78 3A 20 20 2E 1B 59 21 39 58
01B0 	58 58 58 58 58 58 58 58 58 58 58 58 58 58 1B 59
01C0 	20 44 00 1B 59 2C 46 20 20 22 24 22 20 21 20 00
01D0 	1B 59 2C 46 20 20 22 76 22 20 21 20 00 1B 59 2C
01E0 	31 20 70 20 4F 20 62 20 65 20 64 20 69 20 74 20
01F0 	63 20 6C 20 78 20 20 1B 59 2D 31 20 20 20 20 20
0200 	20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0210 	20 20 20 20 20 20 00 1B 59 31 2E 20 20 77 77 65
0220 	64 69 74 65 20 73 6B 6F 72 6F 73 74 78 20 67 6F
0230 	6E 6B 69 20 28 31 2D 39 29 3A 20 20 20 08 08 00
0240 	1B 59 20 20 00 1B 59 2E 32 20 20 70 6F 77 74 6F
0250 	72 20 2D 20 22 31 22 1B 59 2F 32 20 20 77 79 62
0260 	6F 72 20 69 67 72 79 20 2D 20 22 32 22 1B 59 30
0270 	32 20 20 6B 6F 6E 65 63 20 2D 20 22 33 22 20 20
0280 	00 1B 59 20 22 00 1B 59 20 5E 00 05 21 6E 30 0A
0290 	36 58 09 1D C2 90 02 C9 0A 3C 27 02 CD 4F 03 3A
02A0 	55 04 A7 C8 E5 CD BD 02 0E 7F CD 09 F8 1E 03 CD
02B0 	BD 02 0E 2B CD 09 F8 1D C2 AF 02 E1 C9 21 3D 01
02C0 	CD 18 F8 CD F7 02 4C CD 09 F8 4D CD 09 F8 CD 21
02D0 	F8 B7 C2 BD 02 C9 A7 CA DD 02 11 00 00 36 00 19
02E0 	7E FE 2A C8 FE 2B C8 FE 58 C8 B8 C9 0A A7 CA F5
02F0 	02 3D 02 1E 2A 73 C9 2A 8D 02 0E 10 7C 29 E6 60
0300 	EA 04 03 23 0D C2 FC 02 7C FE 20 FA FC 02 22 8D
0310 	02 C9 A7 DB A0 C2 1A 03 DB A1 E6 0F 11 01 00 FE
0320 	0B C8 11 4D 00 FE 06 C8 13 FE 07 C8 13 FE 03 C8
0330 	11 B1 FF FE 0C C8 13 FE 0D C8 13 FE 09 C8 11 FF
0340 	FF FE 0E C8 13 C9 3E 3A 32 30 7E 32 7E 7E C9 C5
0350 	0E 07 CD 09 F8 CD 09 F8 C1 C9 E5 2A 57 04 21 7D
0360 	B4 C2 5E 03 E1 C9 3A 8F 02 02 CD 4F 03 C9 AF CD
0370 	12 03 2A 5D 04 3A 59 04 06 76 CD D6 02 C2 83 03
0380 	2A 5D 04 22 5D 04 01 59 04 F5 CC 66 03 0E 3A 3A
0390 	55 04 A7 CA 98 03 0E 7F F1 B9 01 5B 04 CC 98 02
03A0 	01 59 04 1E 24 CD EC 02 3A 5B 04 E5 CD 1E F8 E5
03B8 	21 81 02 CD 18 F8 3A 5B 04 CD 15 F8 E1 D5 11 18
03C0 	1D 19 D1 22 42 02 21 40 02 CD 18 F8 E1 CD 5A 03
03D0 	3A 5B 04 4F C9 3E 01 CD 12 03 2A 5F 04 3A 5A 04
03E0 	06 24 CD D6 02 C2 EB 03 2A 5F 04 22 5F 04 01 5A
03F0 	04 F5 CC 66 03 0E 3A 3A 55 04 A7 CA 00 04 0E 7F
0400 	F1 B9 01 5C 04 CC 98 02 01 5A 04 1E 76 CD EC 02
0410 	3A 5C 04 E5 CD 1E F8 E3 21 86 02 CD 18 F8 3A 5C
0420 	04 CD 15 F8 E1 D5 11 18 1D 19 D1 22 42 02 21 40
0430 	02 CD 18 F8 E1 CD 5A 03 3A 5C 04 4F C9 3E 9B D3
0440 	A3 AF 32 59 04 32 5A 04 32 5B 04 32 5C 04 C9 0E
0450 	1F CD 09 F8 C9 00 00 00 00 00 00 00 00 00 00 00

После освоения игры «РАЛЛИ» и приобретения определенного навыка в обращении с пультами управления можно приступить к построению рисунка игрового поля для трековых гонок. Для этой цели служит программа, исходный текст которой приведен в табл.2.

					Таблица 2.
;*************************************
;*  ПPOГPAММA  ПОСТРОЕНИЯ РИСУНКА    * 
;*    ТРЕКА  С ИСПОЛЬЗОВАНИЕМ        * 
;*           КЛАВИАТУРЫ              * 
;*************************************
	ORG 2000Н
	MVI  C,1FH   ; СТИРАНИЕ ЭКРАНА 
	CALL ВЫВСИМ
	MVI  А,'$'   ; УСТАНОВКА 
	STA  П031    ; МАШИНЫ 1 
	MVI  А,'Ж'   ; УСТАНОВКА 
	STA  ПОЗ2    ; МАШИНЫ 2 
	MVI  А,'"'   ; УСТАНОВКА 
	STA  ФИНИШ1  ; ФИНИШНОЙ 
	STA  ФИНИШ2  ; ЛИНИИ
; *  ЦИКЛ ПОСТРОЕНИЯ ТРЕКА    
M1:  	CALL ВВОД      
	СРI  03      ; КЛАВИША  "F4"
	JZ   М2 
	MOV  С,А 
	CALL ВЫВСИМ 
	JMP  М1
; *  ЦИКЛ ПЕРЕЗАПИСИ ТРЕКА    
; "  В СЛУЖЕБНУЮ ОБЛАСТЬ ОЗУ   
M2:  	LXI  Н,500Н   ; НАЧАЛО ОБЛ. ОЗУ
	LXI  В,77С2Н  ; НАЧАЛО ЭКР.ОБЛ. 
M3:  	LDAX В 
	MOV  М,А 
	INX  В 
	INX  Н 
	MOV  А,В 
	CPI  80Н 
	JN2  МЗ 
	JMP  MONIT    	; ВЫХОД ИЗ ЦИКЛА
MONIT:  EQU 0F86CH 	; АДРЕС ВЫХОДА В
			; MONITOR БЕЗ СТИР 
ВЫВСИМ: EQU 0F809Н 
ВВОД:   EQU 0F803Н
ПОЗ1:   EQU 77С2Н+391	; ПОЗ .МАМИНЫ 1 
ПОЗ2:   EQU 77C2H+469	; ПОЗ. МАШИНЫ 2 
ФИНИШ1: EQU 77С2Н+1646	; 2 ПОЗИЦИИ 
ФИНИШ2: EQU 77С2Н+1724	; ФИНИША

В начале программы производится стирание экрана и установка элементов игры, положение которых на экране фиксировано (двух машин и финишной линии). Затем в цикле построения собственно рисунка трека поочередно выполняются подпрограммы МОНИТОРа ВВОД (0F803H) и ВЫВСИМ (вывод символа, 0F809H), Нажатие на любую клавишу будет непосредственно отображаться на экране (этот режим аналогичен директиве «К» МОНИТОРа микро-ЭВМ «МИКРО-80»1). После нажатия на клавишу «F4»> весь рисунок трека, построенный на экране, циклом перезаписи будет скопирован в служебную область ОЗУ программы.

Практически работа с программой производится в следующем порядке. В компьютер вводят программы РЕДАКТОР ТЕКСТА АССЕМБЛЕР и с клавиатуры набираются исходный текст программы построения рисунка трека, который переводят в машинные коды программой АССЕМБЛЕР и переносят затем директивой «Т» МОНИТОРа в область ОЗУ с начальным адресом 2000Н. После запуска программы с этого адреса и стирания экрана с помощью клавиш управления курсором, а также клавиш «+», «X», «*» (любой из этих символов является препятствием для машин) «строят трек». При этом следует избегать стирания символов машин и финишной линии. В качестве примера можно воспользоваться рис. 4. После построения рисунка трека нажимают клавишу «F4» — рисунок трека перепишется в служебную область ОЗУ (начиная с адреса 500Н) и произойдет выход в МОНИТОР без стирания экрана. Рисунок трека может быть записан на магнитную ленту (адреса с 500Н по 0CFFH). Таким образом, при использовании игры в «ТРЕК» в компьютер сначала вводят собственно игровую программу, а затем один из треков (на ленте их может быть несколько).

При необходимости можно изменить количество флажков в «РАЛЛИ» и число заездов в «ТРЕКЕ», необходимых для достижения победы. Эти значения находятся в ячейках ОЗУ по адресам 028СН (код 21 Н) и 028ВН (код 05Н) соответственно.

Для тех читателей, которые захотят самостоятельно использовать возможности, вложенные в соревновании двух партнеров, приводим сходный текст подпрограммы, использованной в приведенных играх. Подпрограмма считывания информации из пультов (табл.3) возвращает в регистровой паре DE значение, которое складывается с текущей координатой машины (предварительно она должна быть записана в регистровой паре HL) и дает новый адрес символа машины в ОЗУ экрана. При не нажатых клавишах и запрещенных ситуациях содержимое регистровой пары DE равно 0. Перед использованием подпрограммы необходимо выполнение двух условий. Во-первых, в регистр РУС порта параллельно интерфейса КР580ВВ55А, должен быть записан код 9ВН (все регистры порта настраиваются на чтение). Адрес порта РУС — 0А0А3Н. Во-вторых, при чтении подпрограммой информации из регистра «В» порта в аккумулятор предварительно следует записать ноль, а при чтении с регистра «А» — число, отличное от нуля.

					Таблица 3. 
;   *************************** 
;   * ПОДПРОГРАММА СЧИТЫВАНИЯ * 
;   *       ИНФОРМАЦИИ        * 
;   *        ИЗ ПУЛЬТОВ       * 
;   ***************************
УПРАВЛ:	ANA А 		; УСТАНОВКА ПРИЗНАКА Z
	IN  0А0Н 	; СЧИТЫВАНИЕ ИЗ
			; ПОРТА  "А" 
	JNZ $+5
	IN  0А1Н	; СЧИТЫВАНИЕ ИЗ 
			; ПОРТА  "В"
	ANI BFH  	; МАСКИРОВАНИЕ НЕИСПОЛЬ*
			; ЗУЕМЫХ РАЗРЯДОВ 
	LXI D,1
	СРI 0ВН  	; ВПРАВО ? 
	RZ
	LXI D,77
	СРI 6    	; ВЛЕВО-ВНИЗ ? 
	RZ
	INX D
	СРI 7    	; ВНИЗ ? 
	RZ
	INX D
	СРI 3    	; ВПРАВО-ВНИЗ ? 
	RZ 
	LXI D,0-79
	CPI 0CH  	; ВЛЕВО-ВВЕРХ ?
	RZ
	INX D
	CPI 0DH  	; ВВЕРХ ? 
	RZ
	INX D
	CPI 9    	; ВПРАВО-ВВЕРХ ? 
	RZ
	LXI D,0-1
	CPI 0EH  	; ВЛЕВО ? 
	RZ 
	INX D    	; КНОПКИ HE НАЖАТЫ,
			; РЕГИСТР D=0 
	RET

В заключение следует сказать несколько слов о командах чтения информации из портов ввода «IN», используемых в начале подпрограммы. При получении такой команды микропроцессор считывает информацию из порта ввода (или ячейки памяти), расположенного по адресу, шестнадцатеричное значение которого состоит из двух одинаковых байтов, эквивалентных второму байту команды. Поэтому при получении команды IN 0А0Н информация будет считана с регистра «А» порта ввода, поскольку адресный дешифратор компьютера, подключенный к старшим разрядам шины адресов микропроцессора, активизирует для обмена соответствующий порт. Выбор необходимого регистра внутри БИС осуществляется внутренним дешифратором, использующим младшие разряды адресной шины.

А. ПЕКИН, Ю. СОЛНЦЕВ, г. Москва