Как написать игру для ZX Spectrum на ассемблере

         

ПОДСЧЕТ КОЛИЧЕСТВЕННЫХ ВЕЛИЧИН



ПОДСЧЕТ КОЛИЧЕСТВЕННЫХ ВЕЛИЧИН

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

XOR A LD (SUM),A ..............

Если же контролируется количество «жизней», то следует наоборот занести в SUM какое-то начальное значение:

LD A,10 LD (SUM),A ..............

Затем эта переменная будет изменяться в блоке оценки игровой ситуации, увеличиваясь или уменьшаясь в зависимости от ее типа:

............ LD A,(SUM) INC A ;или DEC A LD (SUM),A CALL PRINT ;вывод числовой оценки на экран ............ SUM DEFB 0 ;переменная для накопления суммы

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

Для иллюстрации рассмотрим программу МИШЕНЬ, которая уже использовалась нами в пятой главе для демонстрации случайных чисел. Дополним теперь эту программу некоторыми оценками, например, после каждого выстрела будем суммировать набранные очки, выводить общее количество произведенных выстрелов и, наконец, подсчитаем средний балл, полученный за один выстрел.

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

Мы уже упоминали подпрограмму ПЗУ, расположенную по адресу 12457, выполняющую умножение двух целых чисел, находящихся в регистровых парах HL и DE. Ниже показана аналогичная процедура, отличающаяся только тем, что при умножении учитываются знаки сомножителей, заданных также в HL и DE. То есть числа, участвующие в операции могут находиться в пределах от -32768 до +32767. Произведение возвращается в регистровой паре HL.


MULT LD B,8 LD A,D AND A JR Z,MULT1 RLC B MULT1 LD C,D LD A,E EX DE,HL LD HL,0 MULT2 SRL C RRA JR NC,MULT3 ADD HL,DE MULT3 EX DE,HL ADD HL,HL EX DE,HL DJNZ MULT2 RET

Следующая подпрограмма предназначена для деления знаковых величин. Делимое перед обращением к ней должно находиться в паре HL, а делитель - в DE. Напоминаем, что деление на 0 невозможно, поэтому в программе имеет смысл выполнять подобную проверку. Если такая ошибка все же произойдет, будет выдано сообщение Бейсика Number too big. После выполнения процедуры частное окажется в паре HL, а остаток от деления будет отброшен.

DIVIS LD A,D OR E JR NZ,DIVIS1 RST 8 DEFB 5 ;Number too big DIVIS1 CALL DIVIS5 PUSH BC LD C,E LD B,D LD DE,0 PUSH DE EX DE,HL INC HL DIVIS2 ADD HL,HL EX DE,HL ADD HL,HL LD A,C SUB L LD A,B SBC A,H EX DE,HL JR NC,DIVIS2 EX DE,HL DIVIS3 EX DE,HL XOR A LD A,H RRA LD H,A LD A,L RRA LD L,A OR H JR Z,DIVIS4 EX DE,HL XOR A RR H RR L LD A,C SUB L LD A,B SBC A,H JP M,DIVIS3 LD A,C SUB L LD C,A LD A,B SBC A,H LD B,A EX (SP),HL ADD HL,DE EX (SP),HL JR DIVIS3 DIVIS4 POP HL POP BC BIT 7,B JR NZ,MINUS RET DIVIS5 LD B,H LD A,H RLA CALL C,MINUS EX DE,HL LD A,H XOR B LD B,A BIT 7,H RET Z MINUS LD A,H CPL LD H,A LD A,L CPL LD L,A INC HL RET

Как вы помните, извлечение квадратного корня из отрицательного числа невозможно, результат также не может быть меньше нуля, поэтому и соответствующая процедура работает с величинами из диапазона 0...65535. Перед обращением к ней число, из которого нужно извлечь корень, поместите в пару HL. Результат, как и в предыдущих подпрограммах, будет возвращен в HL. Дробная часть при этом, к сожалению, также теряется.

SQR LD A,L LD L,H LD H,0 LD DE,64 LD B,8 SQR1 SBC HL,DE JR NC,SQR2 ADD HL,DE SQR2 CCF RL D ADD A,A ADC HL,HL ADD A,A ADC HL,HL DJNZ SQR1 LD L,D LD H,A RET

А теперь приводим модифицированный текст программы МИШЕНЬ, в которой присутствуют некоторые типы оценок, а также демонстрируется применение только что предложенных математических процедур:

ORG 60000 ENT $ LD A,7 LD (23693),A XOR A CALL 8859 CALL 3435 LD A,2 CALL 5633 ;Основная часть программы МИШЕНЬ LD HL,UDG LD (23675),HL LD HL,0 LD (SCORE),HL ;обнуление счетчика количества очков, ; заработанных при стрельбе по «мишени» XOR A LD (KOL_W),A ;обнуление счетчика числа выстрелов, ; произведенных по «мишени» CALL MISH ;рисование «мишени» MAIN CALL WAIT ;ожидание нажатия любой клавиши LD A,22 RST 16 LD E,19 ;диапазон изменения координаты Y ; для пулевого отверстия CALL RND ;задаем координату Y LD (ROW),A ;заносим ее в переменную ROW RST 16 LD E,30 ;диапазон изменения координаты X ; для пулевого отверстия CALL RND ;задаем координату X LD (COL),A ;заносим ее в переменную COL RST 16 LD A,16 RST 16 LD A,6 ;задаем цвет пулевых отверстий RST 16 LD E,3 ;количество видов пулевых отверстий CALL RND ADD A,144 RST 16 CALL SND ;звуковой сигнал, имитирующий полет пули CALL OCENKA ;вычисление оценок результата стрельбы ; и вывод их на экран LD A,(23560) ;выход из программы CP " " JR NZ,MAIN RET ; Подпрограмма оценки результата стрельбы OCENKA LD BC,(COL) ;заносим в BC координаты выстрела LD A,10 ;вертикальная координата центра «мишени» CP B JR C,BOT_Y SUB B ;пулевое отверстие находится в верхней ; половине «мишени» JR CONT1 BOT_Y LD A,B SUB 10 ;пулевое отверстие находится в нижней ; половине «мишени» CONT1 LD B,A ;в регистре B длина катета по Y LD A,15 ;горизонтальная координата центра «мишени» CP C JR C,BIG_X SUB C JR CONT2 BIG_X LD A,C SUB 15 CONT2 LD C,A ;в регистре C длина катета по X ; Определяем длину гипотенузы прямоугольного треугольника LD H,0 LD L,B LD D,H LD E,L PUSH BC CALL MULT ;вычисляем квадрат величины Y LD B,H LD C,L POP HL LD H,0 LD D,H LD E,L PUSH BC CALL MULT ;вычисляем квадрат величины X POP BC ADD HL,BC CALL SQR ;определяем длину гипотенузы, ; величину которой помещаем в пару HL ; По длине гипотенузы находим количество заработанных очков ; в результате одного выстрела LD C,0 LD A,L CP 11 JR NC,SUM LD DE,D_SUM ADD HL,DE LD C,(HL) ; Вычисление трех оценочных характеристик стрельбы и их вывод на экран SUM PUSH BC LD DE,TXT1 LD BC,11 CALL 8252 POP BC LD HL,(SCORE) LD B,0 ADD HL,BC LD (SCORE),HL LD B,H LD C,L CALL 11563 CALL 11747 ;печать общего количества заработанных ; в результате стрельбы очков LD DE,TXT2 LD BC,11 CALL 8252 LD HL,KOL_W INC (HL) LD C,(HL) LD B,0 CALL 11563 CALL 11747 ;печать количества произведенных ; по «мишени» выстрелов LD DE,TXT3 LD BC,10 CALL 8252 LD HL,(SCORE) LD D,H LD E,L LD A,(KOL_W) LD L,A LD H,0 CALL DIVIS LD B,H LD C,L CALL 11563 JP 11747 ;печать среднего числа очков за один выстрел

; Подпрограммы MISH, CIRC и другие, а также блоки TEXT и UDG, ; на которые имеются ссылки в основной программе, описывались нами ; в первом варианте программы МИШЕНЬ

; Данные для мишени

LENTXT EQU $-TEXT ; Данные для пулевых отверстий

; Данные оценок D_SUM DEFB 10,10,8,8,8,6,6,6,4,4,4 TXT1 DEFB 22,21,0,16,4 DEFM "SCORE:" TXT2 DEFB 22,21,12,16,1 DEFM "SHOTS:" TXT3 DEFB 22,21,22,16,2 DEFM "MEAN:" ; Переменные для оценок SCORE DEFW 0 KOL_W DEFB 0 COL DEFB 0 ROW DEFB 0


Содержание раздела







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий