📄 main.asm
字号:
INCLUDE MACRO.INC
DATAS SEGMENT
;菜单数据
LINE DB '////////////////////////////////////////$'
YOURSCORE DB '-Score is: -$'
YOURLIFE DB '-Life is: -$'
WELCOME DB ' --/ WELCOME TO THIS GAME /--$'
MENU_1 DB '1.NEW GAME -->$'
MENU_2 DB '2.CONTROL INFORMATION$'
MENU_3 DB '3.ABOUT$'
MENU_4 DB '4.EXIT$'
CONTROL_TITLE DB ' --/ CONTROL INFORMATION /--$'
CONTROL_INFORMATION_1 DB 'KEY_1: PRESS "->" TO MOVE RIGHT$'
CONTROL_INFORMATION_2 DB 'KEY_2: PRESS "<-" TO MOVE LEFT$'
CONTROL_INFORMATION_3 DB 'KEY_3: PRESS "SPACE" TO FIRE$'
CONTROL_INFORMATION_4 DB 'KEY_4: PRESS "ESC" TO BACK TO MENU$'
BACK DB 'PRESS "ESC" TO BACK TO THE MAIN MENU$'
ABOUT_TITLE DB ' --/ ABOUT THIS GAME /--$'
ABOUT_AUTHOR_1 DB 'MADE BY GUOYU.$'
ABOUT_AUTHOR_2 DB 'CLASS:41 NUMBER:0461010 NAME:GUOYU$'
ABOUT_TEST DB 'CPU : INTEL DUO T2250 1.73GHZ$'
RESULT DB 'YOUR SCORE IS :$'
GAMEOVER DB 'GAME OVER!!$'
;游戏数据
BULLET_RATE DB 10
BULLET_X DB 0
BULLET_Y DB 0
X DW 100
Y DW 180
X1 DW 100
Y1 DW 20
X_OLD DW 0
Y_OLD DW 0
X1_OLD DW 0
Y1_OLD DW 0
SPEED=1
SCORE DB ?,?,'0$'
LIFE DB '5$'
LIGHT DB 0 ;是否有激光,0=没有,1=有
;图形定义
PLANE_1 DB 0,0,0,0,0,0,80,0,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,0,10,0,10,0,0,0,0,0
DB 0,0,0,0,10,0,0,0,10,0,0,0,0
DB 0,0,0,10,0,20,0,20,0,10,0,0,0
DB 0,0,10,0,0,20,0,20,0,0,10,0,0
DB 0,10,0,0,0,0,0,0,0,0,0,10,0
PLANE_ENEMY DB 0,0,0,4,4,4,4,0,0,0
DB 0,0,4,0,0,0,0,4,0,0
DB 0,4,0,4,4,4,4,0,4,0
DB 4,0,4,0,4,4,0,4,0,4
DB 4,4,0,0,4,4,0,0,4,4
DB 0,0,0,0,4,4,0,0,0,0
DB 0,0,0,4,0,0,4,0,0,0
DB 0,0,0,4,0,0,4,0,0,0
DB 0,0,0,4,0,0,4,0,0,0
DB 0,0,0,0,4,4,0,0,0,0
ON_HIT_1 DB 0,0,5,0,0,0,0,5,0,0
DB 0,5,0,5,0,0,5,5,5,0
DB 5,5,5,0,5,5,5,5,0,0
DB 0,5,0,5,5,5,5,0,0,0
DB 0,0,5,5,5,0,5,5,5,0
DB 0,0,0,5,5,5,5,5,5,5
DB 0,0,5,5,5,5,5,0,5,5
DB 0,5,5,5,5,0,0,5,0,5
DB 0,0,5,5,5,0,0,0,5,0
ON_HIT_2 DB 0,0,0,0,0,5,5,5,0,0
DB 0,5,0,0,0,5,5,5,0,0
DB 0,5,5,0,5,5,0,5,0,0
DB 5,5,5,5,5,0,5,0,0,0
DB 0,0,5,5,5,5,5,5,0,0
DB 0,0,0,5,0,5,0,5,5,0
DB 0,0,5,5,0,5,5,0,5,5
DB 0,0,5,0,5,5,0,5,5,5
DB 0,0,5,5,5,5,0,0,0,5
BLACK DB 169 DUP(0)
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;设置显示模式
MOV AH,00H
MOV AL,13H
INT 10H
MAINMENU:
CLS
CALL EXTRA_MENU
;绘制主菜单
PRINTXY WELCOME,5,5
PRINTXY MENU_1,7,5
PRINTXY MENU_2,9,5
PRINTXY MENU_3,11,5
PRINTXY MENU_4,13,5
CHECK_KEY:
;监视键盘输入
MOV AH,0
INT 16H
CMP AL,'1'
JE INITIALIZE
CMP AL,'2'
JE CONTROL
CMP AL,'3'
JE ABOUT
CMP AL,'4'
JE EXIT
JMP CHECK_KEY
CONTROL:
CLS
CALL EXTRA_MENU
;显示控制菜单
PRINTXY CONTROL_TITLE,5,5
PRINTXY CONTROL_INFORMATION_1,7,5
PRINTXY CONTROL_INFORMATION_2,9,5
PRINTXY CONTROL_INFORMATION_3,11,5
PRINTXY CONTROL_INFORMATION_4,13,5
PRINTXY BACK,15,2
MOV AH,0
INT 16H
CMP AH,01
JE MAINMENU
CLS
JMP CONTROL
ABOUT:
CLS
CALL EXTRA_MENU
;显示关于菜单
PRINTXY ABOUT_TITLE,5,5
PRINTXY ABOUT_AUTHOR_1,7,5
PRINTXY ABOUT_AUTHOR_2,9,5
PRINTXY ABOUT_TEST,11,5
PRINTXY BACK,13,2
MOV AH,4
MOV AL,2
INT 10H
MOV AH,0
INT 16H
CMP AH,01
JE MAINMENU
CLS
JMP ABOUT
EXIT:
MOV AH,4CH
INT 21H
SHOW_RESULT:
CLS
PRINTXY GAMEOVER,8,8
PRINTXY RESULT,10,8
PRINTXY SCORE 10,24
MOV AH,0
INT 16H
JMP MAINMENU
INITIALIZE:
CLS
PRINT_INFORMATION
MOV LIFE,'5'
MOV SCORE,'0'
MOV SCORE+1,'0'
MOV SCORE+2,'0'
MOV SCORE+3,'$'
MOV X,100
MOV Y,180
MOV X1,100
MOV Y1,20
MOV X_OLD,100
MOV Y_OLD,180
MOV X1_OLD,100
MOV Y1_OLD,20
GAME:
CMP LIFE,'0'
JE SHOW_RESULT
;删除上一帧画面
DRAW_OTHER:
CALL CLEAN_PLANE
CALL CLEAN_ENEMY
CALL DRAW_PLANE
CALL DRAW_ENEMY
;保存本次绘图位
MOV AX,X1
MOV X1_OLD,AX
MOV AX,Y1
MOV Y1_OLD,AX
;敌机下落
MOV AX,Y1
ADD AX,SPEED
MOV Y1,AX
MOV AX,Y1
CMP AX,190
JNC OUT_SCREEN
JMP CHECKKEY
OUT_SCREEN:
MOV AL,LIFE
SUB AL,1
MOV LIFE,AL
NEW_ENEMY
PRINT_INFORMATION
;读键盘
CHECKKEY:
MOV AH,0BH
INT 21H
CMP AL,0FFH
JE KEY
JMP RETURN
KEY:
MOV AH,0
INT 16H
CMP AH,4BH
JE LEFT
CMP AH,4DH
JE RIGHT
CMP AH,01H
JE BACKMENU
CMP AH,39H
JE FIRE
JMP RETURN
LEFT:
CMP X,4
JE RETURN
MOV AX,X
MOV X_OLD,AX
SUB AX,6
MOV X,AX
JMP RETURN
RIGHT:
CMP X,196
JE RETURN
MOV AX,X
MOV X_OLD,AX
ADD AX,6
MOV X,AX
JMP RETURN
BACKMENU:
JMP SHOW_RESULT
FIRE:
CALL DRAW_LIGHT
MOV AX,X
ADD AX,6
CMP AX,X1
JC NOT_HIT
MOV AX,X1
ADD AX,4
CMP AX,X
JC NOT_HIT
JMP HIT
NOT_HIT:
CALL CLEAN_LIGHT
JMP RETURN
HIT:
CALL ON_HIT
NEW_ENEMY
CALL ADDSCORE
PRINT_INFORMATION
CALL CLEAN_LIGHT
JMP RETURN
;返回重绘
RETURN:
;延时
MOV CX,5525
CALL DELAY
JMP GAME
;延迟程序
DELAY PROC NEAR
PUSH AX
WAITF1:
IN AL,61H
AND AL,10H
CMP AL,AH
JE WAITF1
MOV AH,AL
LOOP WAITF1
POP AX
RET
DELAY ENDP
;-----------绘图程序-----------
;入口:push es
; mov ax,0a000h
; mov es,ax
; DI=像素起始位置
; SI=图像数据偏移地址
; ROW=行数
; COL=列数
DRAW_PLANE PROC NEAR
PUSH ES
MOV AX,0A000H
MOV ES,AX
MOV SI,OFFSET PLANE_1
MOV BX,Y
MOV AX,320
MUL BX
ADD AX,X
MOV DI,AX
mov cx,13
next:
push cx
mov cx,13
rep movsb
add di,307
pop cx
loop next
pop es
RET
DRAW_PLANE ENDP
DRAW_ENEMY PROC NEAR
PUSH ES
MOV AX,0A000H
MOV ES,AX
MOV SI,OFFSET PLANE_ENEMY
MOV BX,Y1
MOV AX,320
MUL BX
ADD AX,X1
MOV DI,AX
mov cx,10
next_e:
push cx
mov cx,10
REP MOVSB
add di,310
pop cx
loop next_e
pop es
RET
DRAW_ENEMY ENDP
CLEAN_PLANE PROC NEAR
PUSH ES
MOV AX,0A000H
MOV ES,AX
MOV SI,OFFSET BLACK
MOV BX,Y_OLD
MOV AX,320
MUL BX
ADD AX,X_OLD
MOV DI,AX
mov cx,13
next_1:
push cx
mov cx,13
rep movsb
add di,307
pop cx
loop next_1
pop es
RET
CLEAN_PLANE ENDP
CLEAN_ENEMY PROC NEAR
PUSH ES
MOV AX,0A000H
MOV ES,AX
MOV SI,OFFSET BLACK
MOV BX,Y1_OLD
MOV AX,320
MUL BX
ADD AX,X1_OLD
MOV DI,AX
mov cx,10
next_2:
push cx
mov cx,10
REP MOVSB
add di,310
pop cx
loop next_2
pop es
RET
CLEAN_ENEMY ENDP
EXTRA_MENU PROC NEAR
PRINTXY LINE,0,0
PRINTXY LINE,20,0
RET
EXTRA_MENU ENDP
DRAW_LIGHT PROC NEAR
MOV AH,0CH
MOV AL,9
MOV BH,0
MOV CX,170
DRAW_L:
PUSH CX
MOV DX,CX
MOV CX,X
ADD CX,6
INT 10H
POP CX
LOOP DRAW_L
MOV LIGHT,3
MOV CX,10000
CALL DELAY
RET
DRAW_LIGHT ENDP
CLEAN_LIGHT PROC NEAR
MOV AH,0CH
MOV AL,0
MOV BH,0
MOV CX,170
CLEAN_L:
PUSH CX
MOV DX,CX
MOV CX,X
ADD CX,6
INT 10H
POP CX
LOOP CLEAN_L
MOV LIGHT,0
RET
CLEAN_LIGHT ENDP
ON_HIT PROC NEAR
PUSH ES
MOV AX,0A000H
MOV ES,AX
MOV SI,OFFSET ON_HIT_1
MOV BX,Y1_OLD
MOV AX,320
MUL BX
ADD AX,X1_OLD
MOV DI,AX
mov cx,10
ON_HIT_LOOP_1:
push cx
mov cx,10
REP MOVSB
add di,310
pop cx
loop ON_HIT_LOOP_1
pop es
MOV CX,20000
CALL DELAY
PUSH ES
MOV AX,0A000H
MOV ES,AX
MOV SI,OFFSET ON_HIT_2
MOV BX,Y1_OLD
MOV AX,320
MUL BX
ADD AX,X1_OLD
MOV DI,AX
mov cx,10
ON_HIT_LOOP_2:
push cx
mov cx,10
REP MOVSB
add di,310
pop cx
loop ON_HIT_LOOP_2
pop es
MOV CX,20000
CALL DELAY
PUSH ES
MOV AX,0A000H
MOV ES,AX
MOV SI,OFFSET ON_HIT_1
MOV BX,Y1_OLD
MOV AX,320
MUL BX
ADD AX,X1_OLD
MOV DI,AX
mov cx,10
ON_HIT_LOOP_3:
push cx
mov cx,10
REP MOVSB
add di,310
pop cx
loop ON_HIT_LOOP_3
pop es
MOV CX,20000
CALL DELAY
RET
ON_HIT ENDP
ADDSCORE PROC NEAR
PUSH AX
PUSH DX
MOV AL,SCORE+2
ADD AL,1
MOV SCORE+2,AL
CMP AL,58
JE SCORE_OF
JMP ADD_FINISH
SCORE_OF:
MOV AL,48
MOV SCORE+2,AL
MOV AL,SCORE+1
CMP AL,48
JC FIRST_OF
JMP ADD_2_BYTE
FIRST_OF:
MOV AL,49
MOV SCORE+1,AL
JMP ADD_FINISH
ADD_2_BYTE:
ADD AL,1
MOV SCORE+1,AL
ADD_FINISH:
POP AX
POP DX
RET
ADDSCORE ENDP
CODES ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -