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

📄 1.asm

📁 鼠标操作左右 空格暂停 esc退出 r重玩
💻 ASM
📖 第 1 页 / 共 5 页
字号:
          mov color,1110b;光莲下卷时的颜色,最后给换成黄色之类的好看
          call setarea
     loop cmpgame_loop
     mov zhongdiany,199
     mov color,00
     call setarea
     
    mov ah,02
    mov bh,00
    mov dh,8
    mov dl,4
    int 10h
;将congratulation的信息写入
    mov ah,09
    lea dx,congratulation_msg
    int 21h
    ;将youscore的信息写入
    mov ah,02
    mov bh,00
    mov dh,12
    mov dl,4
    int 10h
    mov ah,09
    lea dx,youscore_msg;'Your score is: 181$'
    int 21h
    ;将playagai的信息写入
    mov ah,02
    mov bh,00
    mov dh,16
    mov dl,4
    int 10h
    mov ah,09
    lea dx,playagain_msg;'Play again?(Y/N)$'
    int 21h
    
    mov ah,01
    int 21h
    cmp al,79h;y的ascll码值
    jne cmpgame_noy
        mov qidianx,0;如果重玩,将刚显示的那个字给清除掉
        mov zhongdianx,310
        mov qidiany,30
        mov zhongdiany,150
        mov color,00
        call setarea
        call replayfun
        jmp cmpgame_exit
    cmpgame_noy:
    
    cmp al,59h;Y的ascll的码值
    jne cmpgame_nobigy
        mov qidianx,0;如果重玩,将刚显示的那个字给清除掉
        mov zhongdianx,310
        mov qidiany,0
        mov zhongdiany,199
        mov color,00
        call setarea
        
        call replayfun
        jmp cmpgame_exit
    cmpgame_nobigy:
        mov exitflag,0;如果不再玩,则退出的标志位置有效
    cmpgame_exit:   
ret
cmpgamefun endp
;*******************************************************************
;这个函数是当小球死光光了以后调用的
balldeadfun proc near
    mov ah,02;将光标置于中间
    mov bh,00
    mov dh,13
    mov dl,8
    int 10h
    mov ah,09;将you lose的提示信息写入
    lea dx,lose_msg
    int 21h
 ;从键盘读取输入
    mov ah,01
    int 21h
    
    cmp al,79h;y的ascll码值,如果是y,那么重玩
    jne balldead_noy
          mov ah,02
          mov bh,00
          mov dh,13
          mov dl,8
          int 10h
          ;将之前的字给清除掉
          mov ah,09
         lea dx,con1_msg
          int 21h
        call replayfun
        jmp balldead_exit  
    balldead_noy:
    
    cmp al,59h;Y的ascll的码值,如果是Y,那么重玩
    jne balldead_nobigy
        mov ah,02
          mov bh,00
          mov dh,13
          mov dl,8
          int 10h
          ;将之前的字给清除掉
          mov ah,09
         lea dx,con1_msg
          int 21h
        call replayfun
        jmp balldead_exit
    balldead_nobigy:
    
        mov exitflag,0;如果不重玩,则将推迟位的标志位置为有效
    balldead_exit:    
ret
balldeadfun endp
;*******************************************************************
;replayfun这个函数是用来处理当用户按下r或者R时,进行内存数据重新赋值
replayfun proc near
    push ax
    push bx
    mov ax,ballx;先将以前的那个球给擦去
    mov qidianx,ax
    add ax,10
    mov zhongdianx,ax
    mov ax,bally
    mov qidiany,ax
    add ax,10
    mov zhongdiany,ax
    mov color,00
    call setarea
    mov qidiany,193 ;将以前的那个球拍擦掉
    mov zhongdiany,196
    mov ax,mouse_last
    mov qidianx,ax
    add ax,racket_width
    mov zhongdianx,ax
    call setarea
    ;判断是否在原屏幕上存在道具,如果存在,那么就将以前的那个道具擦去否则直接跳转
    cmp propflag,-1
    je replay_noprop
         mov propflag,-1;以下的代码为将之前的那个道具擦去
         mov ax,propx
         mov qidianx,ax
         add ax,10
         mov zhongdianx,ax
         mov ax,propy
         mov qidiany,ax
         add ax,10
         mov zhongdiany,ax
         mov color,00
         call setarea
    replay_noprop:
    ;调用init函数,因为在init函数中,变量都已经初始化,所以这里不用在将变量初始化
    call init
    pop bx
    pop ax
ret
replayfun endp
;*******************************************************************
;waitfun这个函数是当用户按下空格时,游戏处于暂停状态
waitfun proc near
    push ax
    cmp stopflag,1
    jne waitfun_exit
    ;将光标置于要显示信息的位置
    mov ah,02
    mov bh,00
    mov dh,18
    mov dl,1
    int 10h
    ;将stop_msg写入
    mov ah,09
    lea dx,stop_msg
    int 21h
    
    waitfunloop:;等待再次按空格或者esc键
       mov ah,07
       int 21h
       cmp al,20h
       je waitfun_exit
       cmp al,1bh;如果按的是esc键,那么将退出位置为有效
       jne waitfunloop
       mov exitflag,0
    waitfun_exit:
    ;将光标置于要显示信息的位置
    mov ah,02
    mov bh,00
    mov dh,18
    mov dl,1
    int 10h
    mov ah,09;将stop_msg擦除,继续游戏
    lea dx,con_msg
    int 21h
    
    mov stopflag,0;将暂停的控制位stopflag置为0,1为有效
    pop ax
ret
waitfun endp
;******************************************************************
zhongduan proc near
    push ds
    push ax
    push cx
    push dx
    mov ax,DATAS
    mov ds,ax
    sti
    cmp stopflag,1;如果是处于暂停时,那么定时中断什么都不做
    je zhongduan_exit_1
    cmp replayflag,1;如果是按下重玩后,则中断什么都不做
    je zhongduan_exit_1
    cmp inmenuflag,1;如果是最初始画面,则什么都不做
    je zhongduan_exit_1
    cmp balldeadflag,1;如果是小球死光光了,那么什么都不做
    je zhongduan_exit_1 
    cmp cmpgameflag,1;如果是已经将所有的砖块都打完了
    je zhongduan_exit_1
    
    cmp bomb_flag,1;如果是炸弹效果,则什么都不做
    je zhongduan_exit_1
    
    call wave_brick_fun
    mov ah,6
    mov dl,0ffh
    int 21h
    cmp al,1bh;判断是不是有《Esc》按键
    jne zhongduan_noesc;如果不是则跳转执行
    mov exitflag,0;否则将退出为置为0,有效
    jmp zhongduan_exit
    
    zhongduan_noesc:
    cmp al,72h;判断是不是r
    jne zhongduan_nor;不是则跳转执行
    mov replayflag,1;如果是r,则将replay置为有效位1
    jmp zhongduan_exit
    
    zhongduan_nor:;判断是不是R;不是则跳转
    cmp al,52h
    jne zhongduan_noR1
    mov replayflag,1;如果是R,则将replay置为有效位1
    jmp zhongduan_exit
    
    zhongduan_noR1:
    cmp al,20h;判断是不是空格,如果是,则将stopflag置为1有效
    jne zhongduan_nospace
    mov stopflag,1
    jmp zhongduan_exit_1
    zhongduan_nospace:
    
  zhongduan_exit:;结束本次中断的程序
    call ballstep;将球的位置重新设置
    call prop_screen
    cmp speedflag,0
    jz zhongduan_exit_1;;判断是不是加速
    call ballstep
    
  zhongduan_exit_1:
      
    pop dx
    pop cx
    pop ax
    pop ds
iret
zhongduan endp
;*************************************************************************
;ballstep这个方法是用来处理小球运动函数
ballstep proc near
    push ax
    push bx
    push cx
    push dx
    mov color,00
    call setball;将之前的那个球给清除
    
    call getpos;获得新的位置
    cmp bally,185;如果小球落地,则生命值减一
    jl notdeadball
    sub life_num,1
        cmp life_num,0;小球落地且生命值已经为0时执行下面的操作
        jnl notdead
        
        mov balldeadflag,1;将balldeadflag置为有效
        jmp ballstep_exit

        notdead:;只是小球落地而还有生命值时,执行下面的操作
        mov ah,02;先将光标移到生命值处,然后将提示信息和剩余生命值显示出来
        mov bh,00
        mov dh,6
        mov dl,26
        int 10h
        mov ah,09
        lea dx,life_msg;将life显示出来
        int 21h
        mov ah,02
        mov dl,life_num
        add dl,30h
        int 21h;将剩余生命值显示出来
        mov ballx,90;将小球的默认值初始化
        mov bally,183
        mov x,2
        mov y,-2
        mov al,ball_color
        mov  color,al
        call setball;将小球画出来
        
        mov ax,mouse_last;将以前球拍擦去
        mov qidianx,ax
        mov zhongdianx,ax
        mov ax,racket_width
        add zhongdianx,ax
        mov qidiany,193
        mov zhongdiany,196
        mov color,00
        call setarea
        mov racket_width,30;将新的球拍显示出来
        mov mouse_last,80
        mov qidianx,80
        mov zhongdianx,110
        mov al,racket_color
        mov color,al
        call setarea

        mov cx,0ffffh;这段代码是用来延时的公延时0fff*0ffff次
        onlyfortime:
        push cx
        mov cx,0fffh
        onlyfortime2:
        mov ax,1
        loop onlyfortime2
        pop cx
        loop onlyfortime
        jmp ballstep_exit
     notdeadball:
        mov al,ball_color
        mov  color,al
        call setball;将球画出来
        call hitbrick;调用函数,对小球撞击之类的进行判断
        
        ballstep_exit:
    pop dx
    pop cx
    pop bx
    pop ax
ret
ballstep endp
;*************************************************************************
;setpos这个方法是通过对当前的 球的位置 以及 的运动向量 和球的速度
;而得到新的 运动向量 和新的位置
getpos proc near
    push ax;将信息保存
    push bx
    push cx
    push dx
    push si
    push di
    cmp x,0;先判断在x轴方向是向右还是向左
    jnl posright
    posleft:;如果是向左,那么它下一个位置在自己的左边
         mov cx,ballx
         add cx,x
         jmp posline1
    posright:;否则下个位置在自己的右边
         mov cx,ballx
         add cx,x
         add cx,10
    posline1:;先判断在水平方向的下一个位置处是不是有障碍
    mov dx,bally
    mov ah,0dh
    mov bh,00
    int 10h;获得下个位置处的像素值
    cmp al,00
    ;je nonex;如是黑色,则x不发生变化
    je rightup
       neg x;否则x变反
    jmp rightup_exit
       
    rightup:
       add cx,10
       int 10h
    cmp al,00
    je nonex
       neg x
       mov ax,x
       sub ballx,ax
    nonex:
       mov ax,x
       add ballx,ax
    rightup_exit:
    
    cmp y,0;再判断在垂直方向的运动方向,是向上还是想下
    jl up
    down:;如果是想下运动
         mov dx,bally
         add dx,9
         add dx,y
    jmp poschuizhi
    up: ;向上运动
         mov dx,bally
         add dx,y
    poschuizhi:;判断在垂直方向的下一个位置是不是有障碍
    mov cx,ballx
    mov ah,0dh
    mov bh,00
    int 10h;获得垂直方向的下一个位置的像素颜色
    cmp al,00
    ;je noney;如果有则变反
    je rightcro
       neg y;如果y周的方向变反,则在y轴方向的向量不变
       jmp rightcro_exit
    rightcro:
    add cx,10
    int 10h
    cmp al,00
    je noney
       neg y
       jmp rightcro_exit  
    noney:
       mov ax,y
       add bally,ax
    rightcro_exit:
    
    cmp y,0
    jl getpos_exit
    mov ax,bally
    add ax,y
    cmp ax,185
    jl getpos_exit;判断是不是在球拍附近
;如果是,则要根据球拍的位置,而使球的方向向量做相应的变化
    mov ax,racket_width
    mov dx,mouse_last
    cmp dx,ballx
    jnl getpos_exit;如果是从球拍的右边出界
    add dx,ax
    cmp dx,ballx;判断是不是从左边出界
        jl getpos_exit
    
    mov dx,00;如果没有出界
    mov cx,3
    div cx
    ;ax存储的是球拍的三分之一长度
    mov cx,ballx
    ;add cx,5;取球的中央
    mov bx,mouse_last
    add bx,ax
    add bx,ax
    cmp bx,cx
    jnl getpos_notright;如果是在球拍左侧相撞
        cmp x,0
        jl right1
           mov x,4
           mov y,-2
           jmp getpos_exit
        right1:
           mov x,-2
           mov y,-4
        jmp getpos_exit
    getpos_notright:
    sub bx,ax
    cmp bx,cx
    jl getpos_exit;如果是在球的中央相撞则不变
       cmp x,0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -