📄 1.asm
字号:
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 + -