📄 1.asm
字号:
;这段代码是所有的线条进入的代码
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 + -