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

📄 1.asm

📁 鼠标操作左右 空格暂停 esc退出 r重玩
💻 ASM
📖 第 1 页 / 共 5 页
字号:
    
    ;这段代码是所有的线条进入的代码
    mov qidiany,54;线条的上下是固定的
    mov zhongdiany,199
    mov qidianx,0
    mov al,inmenu_color

    mov cx,70
    mov bx,qidianx
    push bx
    inmenuloop2:
        ;将左边的向右移动,先擦去一个像素列 
        ;mov bx,qidianx
        pop bx
        mov qidianx,bx
        mov zhongdianx,bx
        mov color,00
        call setarea
        ;再画一个像素列
        add bx,1
        push bx
        mov qidianx,bx
        add bx,5;宽度为5个像素
        mov zhongdianx,bx
        mov color,al
        call setarea
        ;画右边的
        mov dx,319
        sub dx,bx
        mov qidianx,dx
        mov zhongdianx,dx
        call setarea
        add qidianx,6
        add zhongdianx,6
        mov color,00
        call setarea
    loop inmenuloop2
    pop bx;将之前压栈的取出,使堆栈平衡
    
    ;将光标置于中间,写made by:
    mov ah,02
    mov bh,00
    mov dh,11
    mov dl,11
    int 10h
    ;将标题made by写入
    mov ah,09
    lea dx,mader_msg
    int 21h
    
    ;画字——小豆
    mov ah,0ch
    mov bh,00
    mov si,-1;将从第一个开始读
    mov dx,110;
    mov count,0
    print_line:;画行
    mov bl,0
    add dx,1
    mov cx,145
    print_lie:;画点
      add bl,1;用于计数一行中的10个点
      add cx,1
      add si,1
      mov al,10
      cmp xiaodou[si],00
      jne printcolor;是否为黑点
      mov al,00
      printcolor:
      int 10h
      add count,1
      cmp bl,23
    jb print_lie;当一行中的10个点画完后,进入外循环

    cmp count,229
    jb print_line;当100个点全部画完后,跳出
    
    
        ;画字——制作
    mov ah,0ch
    mov bh,00
    mov si,-1;将从第一个开始读
    mov dx,125;
    mov count,0
    print_linezhizuo:;画行
    mov bl,0
    add dx,1
    mov cx,145
    print_liezhizuo:;画点
      add bl,1;用于计数一行中的10个点
      add cx,1
      add si,1
      mov al,10
      cmp zhizuo[si],00
      jne printcolorzhizuo;是否为黑点
      mov al,00
      printcolorzhizuo:
      int 10h
      add count,1
      cmp bl,23
    jb print_liezhizuo;当一行中的10个点画完后,进入外循环

    cmp count,229
    jb print_linezhizuo;当100个点全部画完后,跳出
    
    CALL MUSIC2
    
    ;将光标置于中间,写press space to play~!
    mov ah,02
    mov bh,00
    mov dh,20
    mov dl,10
    int 10h
    ;将标题play_msg写入
    mov ah,09
    lea dx,play_msg
    int 21h
    
    inmunuloop:
        mov ah,07
        int 21h
        cmp al,20h
        je inmunuloop_exit
    jmp inmunuloop
    
    inmunuloop_exit:
    mov qidianx,0
    mov zhongdianx,319
    mov qidiany,0
    mov zhongdiany,199
    mov color,00
    call setarea
    mov inmenuflag,0
    pop dx
    pop cx
    pop bx
    pop ax
ret
inmenufun endp
;**********************************************************************
;init()这个方法是在程序开始运行时,画出界面用的
;每次程序运行或者玩家重新开始时会调用一次
init proc near
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    
    mov exitflag,1;用来记录玩家时候要退出游戏,当为0时退出
    mov stopflag,0;用于记录暂停,如果是1则暂停
    mov replayflag,0;用于记录是否重新开局,1为有效
    mov propflag,-1;用来判断当前屏幕中是否有道具,如果没有则为-1,否则为相应的第0到n个道具
    mov speedflag,0;用来判断是否要加速,如果为1则为加速
    mov cmpgameflag,0;用来记录游戏中的所有砖块是否打完,如果打完,则为1
    mov balldeadflag,0;用于记录当小球死光光后
    
    mov count,0;这个变量是用来记录次数的
    mov life_num,3;这个变量是用来记录生命值的
    mov score_num,0;得分总和不能大于255
    mov mouse_last,80;用于记录上一次的的鼠标的位置,只记录x轴
    mov racket_width,30;用于记录球拍的宽度
    mov ballx,90;用来记录球的左上角的x周坐标
    mov bally,183;用来记录球的左上角的y周坐标
    mov brick_num,100;用来记录砖块的数量
    mov x,1;用于记录运动向量
    mov y,-1;用于记录运动向量
    
    mov al,frame_color
    mov color,al;设置颜色
    ;画顶部
    mov qidianx,0
    mov qidiany,0
    mov zhongdianx,320
    mov zhongdiany,2
    call setarea
    ;画左边
    mov zhongdianx,3
    mov zhongdiany,200
    call setarea
    ;画底部
    mov qidianx,0
    mov qidiany,197
    mov zhongdianx,320
    mov zhongdiany,200
    call setarea
    ;画右边
    mov qidianx,317
    mov qidiany,0
    call setarea
    ;画中间的分割线
    mov qidianx,203
    mov qidiany,2
    mov zhongdianx,206
    mov zhongdiany,200
    call setarea
    ;画右边的第一条分割线
    mov qidianx,205
    mov qidiany,30
    mov zhongdianx,320
    mov zhongdiany,32
    call setarea
    ;画右边的第二条分割线
    mov qidiany,60
    mov zhongdiany,62
    call setarea
    ;画右边的第三条分割线
    mov qidiany,109
    mov zhongdiany,111
    call setarea
    ;将光标置于右边第一个框内
    mov ah,02
    mov bh,00
    mov dh,2
    mov dl,26
    int 10h
    ;将score写如
    mov ah,09
    lea dx,score_msg
    int 21h
    call score_screen
    ;将光标置于右边第二个框内
    mov ah,02
    mov bh,00
    mov dh,6
    mov dl,26
    int 10h
    ;将life写入
    mov ah,09
    lea dx,life_msg
    int 21h
    ;将初始的生命值写入
    mov ah,02
    mov dl,life_num
    add dl,30h
    int 21h
    ;将光标置于右边第三个框内
    mov ah,02
    mov bh,00
    mov dh,09
    mov dl,28
    int 10h
    ;将prop写入
    mov ah,09
    lea dx,prop_msg
    int 21h
    ;将光标置于右边第三个框内,写入第二行
    mov ah,02
    mov bh,00
    mov dh,11
    mov dl,28
    int 10h
    ;将none_msg写入
    mov ah,09
    lea dx,none_msg
    int 21h
    
    ;将光标置于右边第四个框内
    mov ah,02
    mov bh,00
    mov dh,15
    mov dl,27
    int 10h
    ;将hint1写入hint
    mov ah,09
    lea dx,hint_msg1
    int 21h
    ;光标下移,将esc的hint提示写入
    mov ah,02
    mov bh,00
    mov dh,18
    mov dl,26
    int 10h
    mov ah,09
    lea dx,hint_msg2
    int 21h
    ;光标下移,将space的hint提示写入
    mov ah,02
    mov dh,20
    mov dl,26
    int 10h
    mov ah,09
    lea dx,hint_msg3
    int 21h
    ;光标下移,将人<r>的hint提示写入
    mov ah,02
    mov dh,22
    mov dl,26
    int 10h
    mov ah,09
    lea dx,hint_msg4
    int 21h
    
    ;将球拍画入
    mov dl,racket_color
    mov color,dl
    mov qidianx,80
    mov zhongdianx,110
    mov qidiany,193
    mov zhongdiany,196
    call setarea
    ;将初始的球画入
    
    ;将砖块画入屏幕;先要将数据还原
    mov cx,brick_num;得到砖块的数量
    mov si,-1;为了方便循环
    .if barflag==1
    init_brick_huanyuan1:;这个循环是为了还原数据的,主要是用于在玩家重玩时
    add si,1
    mov al,brick_life_huanyuan1[si];将数据一一还原
    mov brick_life[si],al
    loop init_brick_huanyuan1
    jmp huanyuan_end
    .endif
    .if barflag==2
    init_brick_huanyuan2:;这个循环是为了还原数据的,主要是用于在玩家重玩时
    add si,1
    mov al,brick_life_huanyuan2[si];将数据一一还原
    mov brick_life[si],al
    loop init_brick_huanyuan2
    jmp huanyuan_end
    .endif
    .if barflag==3
    init_brick_huanyuan3:;这个循环是为了还原数据的,主要是用于在玩家重玩时
    add si,1
    mov al,brick_life_huanyuan3[si];将数据一一还原
    mov brick_life[si],al
    loop init_brick_huanyuan3
    jmp huanyuan_end
    .endif
    .if barflag==4
    init_brick_huanyuan4:;这个循环是为了还原数据的,主要是用于在玩家重玩时
    add si,1
    mov al,brick_life_huanyuan4[si];将数据一一还原
    mov brick_life[si],al
    loop init_brick_huanyuan4
    jmp huanyuan_end
    .endif
    .if barflag==5
    init_brick_huanyuan5:;这个循环是为了还原数据的,主要是用于在玩家重玩时
    add si,1
    mov al,brick_life_huanyuan5[si];将数据一一还原
    mov brick_life[si],al
    loop init_brick_huanyuan5
    jmp huanyuan_end
    .endif
    
    
    
    huanyuan_end:
    
    mov si,-1;这里是将还原后的砖块显示在屏幕上
    mov di,0
    mov qidianx,4;第一块砖块的左上角和右下角的坐标
    mov zhongdianx,22
    mov qidiany,3
    mov zhongdiany,8
    
    init_brick:;用于将砖块画出
    add si,1
    add di,1
    cmp si,brick_num;如果将所有的砖块已经画完则跳出
    je init_brick_exit
        mov al,brick_color1;如果是易碎砖块
        cmp brick_life[si],1
        je init_brick_color
        
        mov al,brick_color2;如果是普通砖块
        cmp brick_life[si],2
        je init_brick_color
        
        mov al,brick_color3;如果是硬质砖块
    init_brick_color:
    mov color,al;将要画的砖块颜色送给color
    call setarea;调用函数

    cmp di,10;判断是否一行画完
    jne brick_x
        mov di,0;如果一行画完在y轴的值也变化,di也要置0
        add zhongdiany,7
        add qidiany,7
        mov qidianx,-16;为了方便循环,这里将x的值赋予负值,在下面的add中增加
        mov zhongdianx,2
    brick_x:;将x的值增加,画下一个砖块
        add qidianx,20
        add zhongdianx,20
    jmp init_brick
    init_brick_exit:;砖块画完

    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
ret
init endp
;***********************************************************************
;**********************************************************************
GENSOUND PROC NEAR;以下的代码是用来发生
          PUSH AX
          PUSH BX
          PUSH CX
          PUSH DX
          PUSH DI
          MOV AL,0B6H
          OUT 43H,AL
          MOV DX,12H
          MOV AX,533H*896
          DIV DI
          OUT 42H,AL
          MOV AL,AH
          OUT 42H,AL
          IN AL,61H
          MOV AH,AL
          OR AL,3
          OUT 61H,AL
WAIT1:    MOV CX,8FF0H
DELAY1:   LOOP DELAY1
          DEC BX
          JNZ WAIT1
          MOV AL,AH
          OUT 61H,AL
          POP DI
          POP DX
          POP CX
          POP BX
          POP AX
          RET
GENSOUND ENDP
MUSIC2    PROC NEAR
          LEA SI,MUS_FREG2
          LEA BP,DS:MUS_TIME2
FREG2:    MOV DI,[SI]
          CMP DI,-1
          JE END_MUS2
          MOV DX,DS:[BP]
          MOV BX,1400
          CALL GENSOUND
          ADD SI,2
          ADD BP,2
FREG1:     MOV DI,[SI]
          CMP DI,-1
          JE END_MUS2
          MOV DX,DS:[BP]
          MOV BX,1400
          CALL GENSOUND
          ADD SI,2
          ADD BP,2
          JMP FREG1
END_MUS2:
          RET
MUSIC2    ENDP
;**********************************************************************
CODES ENDS
    END START

⌨️ 快捷键说明

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