📄 letter.asm
字号:
;=======================================================================
;打字游戏程序
;=======================================================================
init_game macro op1,op2,op3,op4,op5,op6 ;循环输出,用于初始化界面
mov cx,0
mov dh,op1 ;起行
mov dl,op2 ;起列
op6:
mov ah,02h
mov bh,00h
int 10h
push cx
mov ah,0ah
mov al,op3 ;要显示的字符
mov cx,01h
mov bh,00h
int 10h
pop cx
inc cx
inc op4 ;指出循环输出的是行还是列
cmp cx,op5 ;循环次数
jne op6
endm
;=======================================================
clean macro op1,op2,op3,op4 ;用于清屏,分别是起止的行和列
mov ah,6
mov bh,00010111b
mov al,0
mov ch,op1
mov cl,op2
mov dh,op3
mov dl,op4
int 10h
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h
endm
;======================================================
menu macro op1,op2,op3 ;用于屏幕上文字的输出
mov cx,0
mov ah,02h
mov bh,00h
mov dh,op1
mov dl,op2
int 10h
lea dx,op3
mov ah,9
int 21h
endm
;=======================================================
data segment
fgf db '===============================================$' ;分隔符
menu1 db '1.start game$'
menu2 db '2.select level$' ;主界面上显示的内容
menu3 db '3.exit$'
menu4 db 'select number of menu:$'
menu5 db 'author: wangfeng$'
menu6 db 'NO. : 20042390$'
menu7 db '1.very easy$'
menu8 db '2.normal$' ;难度的选择
menu9 db '3.hard$'
menu10 db '4.return$'
menu11 db 'data : 2006.12.24$'
meg1 db 'press any key to start the game...$' ;游戏开始之前的提示
meg2 db 'press esc key return main menu$'
meg3 db 'press space key for pause $'
meg4 db 'when the game was paused,press ese to quit!$'
meg5 db 'life:$' ;生命数
meg6 db 'score:$' ;分数
meg7 db 'hit the letter num:$'
meg8 db ' miss letter num:$'
meg9 db ' the shooting is:$'
ma db 0
mb db 0
sped1 dw 0
speed dw 3000d ;游戏的速度,也决定了游戏的难度
letters db 78 dup(0) ;上方显示的字母
life db 39h
position db 1 ;上方字母的位置,用于控制落下的字母
time_m db 0
time_s db 0
xmul db 13
n db 26
score1 db 0
level db 1
hang db 0
line db 0
fen1 db 0
fen2 db 0
fen3 db 0
fen4 db 0
fen5 db 0
string db '100%$'
error db 0
data ends
;====================================================
code segment
assume cs:code,ds:data;,ss:stack
start:
mov ax,data
mov ds,ax
mov position,1
mov speed,3000 ;这里是几个数据的初始化
mov level,1
mov sped1,50000
mov error,0
mov score1,0
jiemian:
mov ah,01h
mov cx,00h
or ch,00010000b
int 10h ;置光标类型,用于隐藏光标
clean 0,0,24,79
;下面这些是游戏的初始化
init_game 0,0,08h,dl,80,sk1
init_game 24,0,08h,dl,80,sk2
init_game 0,0,08h,dh,25,sk3
init_game 0,79,08h,dh,25,sk4
menu 5,15,fgf
menu 7,25,menu1 ;界面显示
menu 9,25,menu2
menu 11,25,menu3
menu 13,15,fgf
menu 15,25,menu4
menu 17,55,menu5
menu 19,55,menu6
menu 21,55,menu11
mov ah,2
mov bh,0
mov dh,15
mov dl,47
int 10h ;把光标放在合适的位置
mov ah,0ah
mov al,' '
mov bh,00h
mov cx,01h
int 10h ;在选择时屏蔽其他的按键,使之不出现在屏幕上
mov ah,1
int 21h
input:
cmp al,'1'
je begin ;当输入字符是1时,跳转到begin 开始游戏
cmp al,'2'
je to_speed_c ;当输入字符是2时,跳转,由于不能直接跳转到speed_c故用了个转移
cmp al,'3'
je to_exit
cmp al,1bh
je to_exit_d
to_otherkey:
jmp otherkey
to_exit:
mov ah,1
int 21h
cmp al,0dh
jne to_otherkey
jmp exit
to_speed_c:
jmp speed_c
to_exit_d:
jmp exit
;=======================================================
begin:
mov ah,1
int 21h
cmp al,0dh
jne to_otherkey
clean 1,1,23,78
play_message: ;显示有关游戏提示
menu 10,18,meg1
menu 12,18,meg2
menu 14,18,meg3
menu 16,18,meg4
mov ah,07h
int 21h
cmp al,1bh ;按任意键继续,不把输入的字符显示在屏幕上
je to_jm
jmp play
to_jm:
jmp jiemian
play:
clean 1,1,23,78
mov life,39h
mov ah,2
mov bh,0
mov dh,1
mov dl,1
int 10h
mov bx,0
lea si,letters
output_letters: ;显示上方字母
mov ah,2ch
int 21h
mov al,dl
mov ah,0
div n
mov dl,ah
add dl,61h
mov [si],dl
mov ah,2
int 21h
mov cx,14987
call waitf
inc si
inc bx
cmp bx,78
je next
jmp output_letters
next:
menu 23,70,meg5
menu 23,30,meg6 ;生命数的相关显示
push dx
mov ah,2
mov bh,0
mov dh,23
mov dl,76
int 10h
mov ah,0ah
mov al,life
mov bh,0
mov cx,1
int 10h
mov ah,2
mov bh,0
mov dh,23
mov dl,43
int 10h
mov ah,0ah
mov al,score1
mov al,30h
mov bh,0
mov cx,1
int 10h
pop dx
jmp game
sub_p:
sub position,78
cmp position,0
jne next3
inc position
next3: jmp game_next
game:
lea si,letters
mov ah,2ch ;伪随机算法,方法是读取1/100秒,
int 21h
mov al,dl
mov position,al
cmp position,0
jne next2
inc position
next2:
cmp position,78 ;和78比较,大于则减去78
ja sub_p
game_next:
add si,word ptr position
dec si
mov dl,position ;position就代表的是列
mov ah,02h
mov dh,1
mov bh,0
int 10h ;置光标位置
mov bl,12h
temp:
mov cx,0
nextrow:
push cx
mov cx,0
yanchi: ;延迟
push cx
mov cx,0
yanchi1:
add cx,1
cmp cx,sped1 ;延迟
jne yanchi1
push dx
mov ah,06h
mov dl,0ffh
int 21h
pop dx
jz pass ;不输入则跳转pass
cmp al," "
je pause1 ;空格,暂停
jmp skip1
pause1:
jmp pause
skip1:
cmp al,1bh
je display ;esc,返回到开始时的界面
cmp al,[si]
je to_disappear ;正确输入,字母消失
pass:
pop cx
inc cx
cmp cx,speed ;speed,字母下落速度,这种方法好像不同的电脑有不同的速度
je print1
jmp yanchi
print1:
jmp print
to_disappear:
mov bh,0
mov ah,3
int 10h
mov hang,dh
mov line,dl
mov bh,0
mov ah,9
mov cx,1
mov bl,1ch
int 10h
mov ah,2
mov bh,0
mov dh,hang
mov dl,line
int 10h
mov dl,[si]
mov ah,2
int 21h
call delay0
jmp disappear ;跳到记分段
display:
clean 1,1,23,78
call disp
mov ah,1
int 21
cmp al,1bh
je to_start1
to_start1:
jmp start
to_exit1:
jmp exit
pause:
push dx
mov ah,06h
mov dl,0ffh
int 21h
pop dx
cmp al,1bh ;暂停时输入大写的q,则退出游戏
je display
cmp al," " ;再次按空格,游戏继续
jne pause
jmp pass
print:
mov ah,0ah
mov bh,0
mov al," "
mov cx,1 ;在字母处输入空格填
int 10h
mov ah,02h
mov bh,0
inc dh
int 10h ;光标下移一行
mov ah,09h
mov al,[si]
mov bh,0
mov cx,1
int 10h ;输出字母
pop cx
inc cx
cmp cx,21 ;如果落到第21行还没有消失,则life减一,字母消失
je to_print_next
jmp nextrow ;如果没到21行,继续下落
to_print_next:
push ax
mov al,error
inc al
mov error,al
pop ax
call sound1
jmp print_next
;change_0:
;jmp print_next
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -