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