⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 为了熟练掌握汇编语言的编程技巧
💻 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 + -