📄 game.asm
字号:
Init_game macro op1,op2,op3,op4,op5,op6 ;屏幕初始化
mov cx,00h
mov dh,op1
mov dl,op2
op6:mov ah,02h
mov bh,00h
int 10h
push cx
mov ah,0ah
mov al,op3
mov bh,00h
mov cx,01h
int 10h
pop cx
inc cx
inc op4
cmp cx,op5
jne op6
endm
clear_screen macro op1,op2,op3,op4 ;清屏宏定义
mov ah,06h
mov al,00h
mov bh,07h
mov ch,op1
mov cl,op2
mov dh,op3
mov dl,op4
int 10h
mov ah,02h
mov bh,00h
mov dh,00h
mov dl,00h
int 10h
endm
menu macro op1,op2,op3 ;菜单显示宏定义
mov ah,02h
mov bh,00h
mov dh,op1
mov dl,op2
int 10h
mov ah,09h
lea dx,op3
int 21h
endm
cursor macro op1,op2 ;置光标宏定义
mov ah,02h
mov bh,00h
mov dh,op1
mov dl,op2
int 10h
endm
hidden macro ; 字母消隐宏定义。在当前光标位置写空格
mov ah,0ah
mov al," "
mov bh,00h
mov cx,01h
int 10h
endm
display macro ;;显示字母宏定义
mov ah,0ah
mov bh,00h
mov cx,01h
int 10h
endm
data segment
ZK db "WELCOME TO PLAY$"
no db "date:2005/4/24$"
meg db "press Enter key to continue.......$"
meg1 db "when a letter is dropping,please hit it!$"
meg2 db "press space key to pause!$"
meg3 db "press ESC key to return main interface!$"
meg4 db "press letter 'E' to exit!$"
speed dw 600d
letters db "jwmilzoeucgpravskntxhdyqfb"
db "iytpkwnxlsvxrmofzhgaebudjq"
db "nwimzoexrphysfqtvdcgljukda"
letters_bak db "jwmilzoeucgpravskntxhdyqfb"
db "iytpkwnxlsvxrmofzhgaebudjq"
db "nwimzoexrphysfqtvdcgljukda"
letter_counter db 0
life_flag db 78 dup(0)
position_flag db 78 dup(0)
present_position db 1
data ends
stack segment para stack 'stack'
db 64 dup(0)
stack ends
code segment
main proc far
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
clear_screen 00d,00d,24d,79d ;清屏
Init_game 00d,00d,0ah,dl,80d,nextsign1 ;屏幕初始化
Init_game 24d,00d,0ah,dl,80d,nextsign2
Init_game 00d,00d,0ah,dh,25d,nextsign3
Init_game 00d,79d,0ah,dh,25d,nextsign4
menu 05d,15d,ZK ;菜单信息的宏调用
menu 07h,15d,no
menu 09d,15d,meg
menu 11d,15d,meg1
menu 13d,15d,meg2
menu 15d,15d,meg3
menu 17d,15d,meg4
cursor 22,33 ;设置光标位置
mov ah,00h
lea si,life_flag
mov cx,00h
init_life_flag:
mov [si],ah
inc si
inc cx
cmp cx,78d
jne init_life_flag
mov cx,00h
mov ah,01h
or ch,00010000b
int 10h
mov ah,01h ;从键盘输入任意字符
int 21h
cmp al,0dh ;回车开始
je gamebegin
exit: mov ah,4ch ;其它键结束
int 21h
gamebegin:
mov ax,speed+12
mov speed,ax
clear_screen 01d,01d,23d,78d ;清屏宏调用
Init_game 23d,01d,01h,dl,78d,nextsign5 ;最下一行显示小花脸
cursor 1,1 ;设置光标位置
mov cx,00h
lea si,letters
nextletter:
mov ah,02h ;逐个显示最上面一行字母
mov dl,[si]
int 21h
inc si
inc cx
cmp cx,78d
je nextcycle
jmp nextletter
nextcycle: ;字母下落过程
lea di,letters
lea si,position_flag
add present_position,31d ;随机选择下一个字母
cmp present_position,78
ja from_front
gobackto_si:
add si,word ptr present_position
dec si
mov ah,[si]
cmp ah,01h
je find_zero
gobackto_di:
mov ah,01h
mov [si],ah
add di,word ptr present_position
dec di
cursor 1,present_position ;设置光标位置
mov cx,00h
nextrow: push cx
mov cx,00h
out_cycle: ; 延迟
push cx
mov cx,00h
in_cycle:
inc cx
cmp cx,1000
jne in_cycle
push dx
mov ah,06h ;从键盘输入字符
mov dl,0ffh
int 21h
pop dx
jz pass
cmp al,1bh ;如果键入ESC,则返回主菜单
je to_start1
cmp al," " ;如果键入SPACE,则游戏暂停
je pause
cmp al,[di] ;输入字母正确!则字母消失
je disappear
pass: pop cx
inc cx
cmp cx,speed
je print
jmp out_cycle
to_start1: ;返回主菜单
jmp start
pause: push dx ;暂停处理
mov ah,06h ;等待再次按空格
mov dl,0ffh
int 21h
pop dx
cmp al," "
jne pause
jmp pass
disappear: ;击中字母后输出空格
pop cx
pop cx
hidden ;消隐
jmp hit
from_front:
sub present_position,78d
jmp gobackto_si
find_zero:
cmp letter_counter,78d
je recycle
cmp present_position,78d
je from_one
mov ah,00h
nextsi: add present_position,01h
inc si
cmp [si],ah
je equl
cmp present_position,78d
je from_one
jmp nextsi
equl : jmp gobackto_di
from_one:mov present_position,01h
jmp gobackto_si
recycle:mov letter_counter,00h
mov present_position,01d
lea si,position_flag
mov cx,00h
mov ah,00h
clearsi: mov [si],ah
inc cx
cmp cx,78d
jne no_equl
jmp nextcycle
no_equl: inc si
jmp clearsi
print: hidden ;消隐
inc dh
cursor dh,present_position ;改变光标位置
mov al,[di] ;在当前光标位置显示字母
display ; 显示该字母
pop cx
inc cx
cmp cx,21d
je print_next_letter
jmp nextrow ;下一行
print_next_letter: ;字母落到底部
lea si,life_flag
add si,word ptr present_position
dec si
hidden ;消隐
inc dh
cursor dh,present_position ;改变光标位置
hidden ;消隐
mov ah,1
mov [si],ah
hit: cursor 1,present_position ;光标位置回到第1行
mov al,[di] ; 出现下一个新字母
add al,7 ; 刚敲的字母加7,生成新字母
cmp al,7ah ; 超过小写字母z?
ja convey_letter
display ; 显示该字母
mov [di],al
add letter_counter,01h
jmp nextcycle
convey_letter:
sub al,7ah ; 使该字母>a
add al,61h
display ; 显示该字母
mov [di],al
add letter_counter,01h
jmp nextcycle
main endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -