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

📄 1.asm

📁 鼠标操作左右 空格暂停 esc退出 r重玩
💻 ASM
📖 第 1 页 / 共 5 页
字号:
       jl left1
          mov x,2
          mov y,-4
          jmp getpos_exit
       left1:
          mov x,-4
          mov y,-2
    
    getpos_exit:        
    pop di;还原数据
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
ret
getpos endp
;***********************************************************************
;这个方法是用来计算小球与砖块的碰撞的,是与哪一个砖块碰撞,它的抗击能力将减一
;如果为0,则砖块消失,并加分
hitbrick proc near
    push ax;保存数据
    push bx
    push dx
    push cx
    push si
        
    cmp bally,78;如果没到小于74,那么肯定不会与砖块相撞
    jnl hitbrick_exitqq;那么就ret
    mov si,0
    mov ax,ballx
    mov bx,bally
    sub ax,x;ax中存储的是球的上个x位置
    sub bx,y;bx中存储的是球的上个y位置
    mov qidiany,3
    mov cx,8
    hit_lie:
        cmp cx,bx
        jnl hit_lie_exit;先判断行,没多一行,就多10个砖块
        add cx,7
        add qidiany,7
        add si,10
        jmp hit_lie
    hit_lie_exit:
    
    mov cx,23
    mov qidianx,4
    hit_line:
        cmp cx,ax
        jnl hit_line_exit;再判断列,没多一列,就多1个砖块在其中间
        add cx,20
        add qidianx,20
        add si,1
        jmp hit_line
    hit_line_exit:
    
    cmp brick_life[si],0;判断是不是已经被击碎
    je hitbrick_exitqq;否则hit_next2
    
    mov ah,0dh
    mov bh,00
    mov dx,qidiany
    ;add dx,1
    mov cx,qidianx
    add cx,10
    int 10h
    cmp al,00
    je hitbrick_exitqq
    
    sub brick_life[si],1;将抗击能力减一
    
    cmp brick_life[si],0;判断在这次撞击以后是不是击碎,如果是击碎,那么将它涂黑,否则跳出
    jne hitbrick_exitqq
    
    sub brick_num,1
    cmp brick_num,0
    jne gp
     mov cmpgameflag,1;将完成位置为有效1
    gp:
    mov ax,qidianx;将那个砖块画为黑色的
    add ax,18
    mov zhongdianx,ax
    mov ax,qidiany
    add ax,5
    mov zhongdiany,ax
    mov color,00
    call setarea;
    mov al,brick_life_huanyuan1[si];
    add score_num,al
    call score_screen
    ;用来生成道具
    cmp propflag,-1;如果已经有道具的存在,那么就不生成道具
        jne hitbrick_exitqq

    mov ax,ballx
    mov propx,ax
    mov ax,bally
    add ax,13
    mov propy,ax
    ;当有砖块被击碎的时候,那么就有可能出现道具,具体是出现什么,要根据目前的砖块剩余数
    cmp brick_num,99;加速的道具
    jne brick_num99
    mov propflag,2
    jmp hitbrick_exitqq
    brick_num99:
    
    cmp brick_num,96
    jne brick_num96
    mov propflag,6;炸弹的道具
    jmp hitbrick_exitqq
    brick_num96:
    
    cmp brick_num,59
    jne brick_num93
    mov propflag,4;大球拍的道具
    jmp hitbrick_exitqq
    brick_num93:
    
    cmp brick_num,55
    jne brick_num89
    mov propflag,1;加分数的道具
    jmp hitbrick_exitqq
    brick_num89:
    
    cmp brick_num,52
    jne brick_num57
    mov propflag,0;加生命的道具
    jmp hitbrick_exitqq
    brick_num57:
    
    cmp brick_num,49
    jne brick_num54
    mov propflag,2;加速的道具
    jmp hitbrick_exitqq
    brick_num54:
    
    
    cmp brick_num,42
    jne brick_num48
    mov propflag,3;减速的道具
    jmp hitbrick_exitqq
    brick_num48:
    
    cmp brick_num,37
    jne brick_num42
    mov propflag,5;小球拍的道具
    jmp hitbrick_exitqq
    brick_num42:
    
    cmp brick_num,46
    jne brick_num40
    mov propflag,7;大炸弹的道具
    jmp hitbrick_exitqq
    brick_num40:
    
    hitbrick_exitqq:
    pop si
    pop cx
    pop dx
    pop bx
    pop ax
ret
hitbrick endp
;***********************************************************************
;这个函数是用来处理两个飘动档板的
wave_brick_fun proc near
    push ax

    ;对第一个砖块进行操作
    mov ax,qidiany
    push ax
    mov ax,zhongdiany
    push ax
    mov ax,qidianx
    push ax
    mov ax,zhongdianx
    push ax
    
    mov qidiany,100
    mov zhongdiany,102
    cmp wave_brick1_pos,1
    je brick1_right
    brick1_left:;处理第一个砖块向左移动
        cmp wave_brick1,5
        jnb brick1_noleft
            mov wave_brick1_pos,1;如果是在最左边,则方向变反
            jmp brick1_exit
        brick1_noleft:
            sub wave_brick1,1
            mov ax,wave_brick1
            mov qidianx,ax
            add ax,20
            mov zhongdianx,ax
            mov color,70
            call setarea
            
            add ax,1
            mov qidianx,ax
            mov zhongdianx,ax
            mov color,00
            call setarea
        jmp brick1_exit
    brick1_right:;处理第一个砖块向右移动
        cmp wave_brick1,182
        jne brick1_noright
            mov wave_brick1_pos,0
            jmp brick1_exit
        brick1_noright:
            mov ax,wave_brick1
            add wave_brick1,1
            mov qidianx,ax
            mov zhongdianx,ax
            mov color,00
            call setarea
            
            mov qidianx,ax
            add qidianx,1
            mov zhongdianx,ax
            add zhongdianx,21
            mov color,70
            call setarea
    brick1_exit:
    ;处理第二个档板
    mov qidiany,130
    mov zhongdiany,132
    cmp wave_brick2_pos,1
    je brick2_right
    brick2_left:
        cmp wave_brick2,5
        jnb brick2_noleft
            mov wave_brick2_pos,1;如果是在最左边,则方向变反
            jmp brick2_exit
        brick2_noleft:
            sub wave_brick2,1
            mov ax,wave_brick2
            mov qidianx,ax
            add ax,20
            mov zhongdianx,ax
            mov color,70
            call setarea
            
            add ax,1
            mov qidianx,ax
            mov zhongdianx,ax
            mov color,00
            call setarea
        jmp brick2_exit
    brick2_right:;处理第一个砖块向右移动
        cmp wave_brick2,182
        jne brick2_noright
            mov wave_brick2_pos,0
            jmp brick2_exit
        brick2_noright:
            mov ax,wave_brick2
            add wave_brick2,1
            mov qidianx,ax
            mov zhongdianx,ax
            mov color,00
            call setarea
            
            mov qidianx,ax
            add qidianx,1
            mov zhongdianx,ax
            add zhongdianx,21
            mov color,70
            call setarea
    brick2_exit:
    pop zhongdianx
    pop qidianx
    pop zhongdiany
    pop qidiany
    pop ax
ret
wave_brick_fun endp
;***********************************************************************
;这个方法是用来画道具的,其中道具的左上角的x和y的位置已经存储在propx和propy中
;另外,道具的颜色也有n中,根据不同的道具,选择不同的颜色
printprop proc near
    push ax;保存数据
    push bx
    push cx
    push dx
    push si
    push di
    
    mov al,100;先用乘法,找到要画的道具的第一个元素的位置
    mov bl,propflag
    mul bl
    mov si,ax;并将其送到si处
    mov count,0
    
    mov al,propflag;再将是第几个道具的db的性质的量扩展后送给di
    mov ah,00h
    mov di,ax

    mov bh,00;显示页号为0
    mov ah,0ch;写像素
    sub si,1;将从第一个开始读
    mov dx,propy;得到球的左上角的坐标
    sub dx,1
    mov cx,propx
    add cx,10;为了方便循环
    printprop_line:;画行
    mov bl,0
    add dx,1
    
    sub cx,10
    printprop_lie:;画点
      add bl,1;用于计数一行中的10个点
      add cx,1
      add si,1
      mov al,prop_color[di];第n的颜色值
      cmp add_life[si],00
      jne printpropcolor;是否为黑点
      mov al,00
      printpropcolor:
      int 10h
      add count,1
      cmp bl,10
    jb printprop_lie;当一行中的10个点画完后,进入外循环

    cmp count,99
    jb printprop_line;当100个点全部画完后,跳出
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax 
ret
printprop endp
;************************************************************************
;setball这个方法是用来画出小球
;左上角的位置和颜色都在内存中ballx和bally以及color中存储
;小球的大小是固定不变的
setball proc near
    push ax
    push bx
    push cx
    push dx
    
    mov bh,00;显示页号为0
    mov ah,0ch;写像素
    mov si,-1;将从第一个开始读
    mov dx,bally;得到球的左上角的坐标
    sub dx,1
    mov cx,ballx
    add cx,10;为了方便循环
    setball_line:;画行
    mov bl,0
    add dx,1
    
    sub cx,10
    setball_lie:;画点
      add bl,1;用于计数一行中的10个点
      add cx,1
      add si,1
      mov al,color
      cmp ball[si],00
      jne setballcolor;是否为黑点
      mov al,00
      setballcolor:
      int 10h
      cmp bl,10
    jb setball_lie;当一行中的10个点画完后,进入外循环

    cmp si,99
    jb setball_line;当100个点全部画完后,跳出
    
    setballexit:
    pop dx
    pop cx
    pop bx
    pop ax
ret
setball endp
;************************************************************************

;************************************************************************
;setarea()
;这个方法是用来填充一个矩形的颜色.其中,矩形的左上角的坐标和右下角
;坐标以及颜色值存储在内存变量中huaqidianx\huaqidiany\huazhongdianx
;huazhongdiany\color 
setarea proc near;
    push ax
    push bx
    push cx
    push dx
    push si
    
    mov ah,0ch
    mov al,color
    mov dx,qidiany
    sub dx,1
    next:
    add dx,1
    mov cx,qidianx
    sub cx,1
    next1:
    add cx,1
    int 10h
    cmp cx,zhongdianx
    jnz next1
    
    cmp dx,zhongdiany
    jnz next
    mov color,al;将颜色再次返回给color。如果没有这一句,后面画的结果可能不确定。至于原因不清除
    pop si
    pop dx
    pop cx
    pop bx
    pop ax  
ret
setarea endp   
;**********************************************************************
;**********************************************************
;这个方法是用来将分数写入屏幕的
score_screen proc near
    push ax
    push bx
    push dx
    push cx
    
    mov ah,02
    mov bh,00
    mov dh,2
    mov dl,33
    int 10h
    ;计算百位并写入
    mov al,score_num
    mov ah,0
    mov cl,100
    div cl
    mov cl,ah
    mov dl,al
    add dl,30h
    mov ah,02
    int 21h
    ;计算十位并写入
    mov al,cl
    mov ah,00
    mov cl,10
    div cl
    
    mov cl,ah
    mov ah,02
    mov dl,al
    add dl,30h
    int 21h
    ;写入个位
    mov dl,cl
    add dl,30h
    int 21h
    
    pop cx
    pop dx
    pop bx
    pop ax
ret
score_screen endp

⌨️ 快捷键说明

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