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

📄 letter.asm

📁 此打字游戏采用取系统时间生成随机数来完成的,打开letter.exe文件,输入1则进入游戏 输入2,选择游戏难度 3或Ese退出游戏.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;=======================================================================
;打字游戏程序
;=======================================================================
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 + -