📄 1.asm
字号:
DATAS SEGMENT
;此处输入数据段代码
;这写变量是用来给setarea传递参数
qidianx dw 0
qidiany dw 0
zhongdianx dw 10
zhongdiany dw 3
color db 10
racket_color db 0111b;球拍颜色
frame_color db 0110b;边框颜色
ball_color db 1110b;球的颜色
brick_color1 db 15;易碎球的颜色
brick_color2 db 10;普通球的颜色
brick_color3 db 5;硬质球的颜色
inmenu_color db 1110b;
wave_brick_color db 70;飘动档板的颜色
;********************************
exitflag dw 1;用来记录玩家时候要退出游戏,当为0时退出
stopflag dw 0;用于记录暂停,如果是1则暂停
replayflag dw 0;用于记录是否重新开局,1为有效
propflag db -1;用来判断当前屏幕中是否有道具,如果没有则为-1,否则为相应的第0到n个道具
speedflag dw 0;用来判断是否要加速,如果为1则为加速
cmpgameflag db 0;用来记录游戏中的所有砖块是否打完,如果打完,则为1
inmenuflag db 1;这个变量只是在最开始进入画面用到,为了防止中断打断,因此init中不需要对它初始化,1为有效
balldeadflag db 0;判断是不是小球的生命值都打完了,如果为1,那么就意味着小球死光光了
barflag db 1;用于记录是第几关,一共有5关
bomb_flag db 0;用于显示当接到bomb后的特效,当为0时说明没有特效
;*******************************
;一些要显示的字符
brick_msg db 'BRICK$'
mader_msg db 'MADE BY: Dou Fangyu$'
play_msg db 'Press space to play!$'
score_msg db 'Score:$'
life_msg db 'Life:$'
prop_msg db 'PROP$'
none_msg db 'NULL $'
hint_msg1 db ' HINT$'
hint_msg2 db '<Esc>:exit $'
hint_msg3 db 'Space:pause$'
hint_msg4 db '<R>: replay$'
;这些msg是用在道具的提示上的
addlife_msg db 'LIFE $'
addscore_msg db 'SCORE $'
speed_up_msg db 'SPEED UP $'
speed_down_msg db 'SPEEDDOWN$'
large_racket_msg db 'L RACKET $'
small_racket_msg db 'S RACKET $'
bomb_msg db 'BOMB $'
bigbomb_msg db 'SUP BOMB $'
stop_msg db 'Press space to continue!$'; 当暂停的时候要调用这个
con_msg db ' $';继续玩的时候,将之前的那个字体给涂成黑色
lose_msg db 'You lose! Play again?(Y/N)$';当生命值为0时要用到这个msg
con1_msg db ' $';继续玩的时候,将之前的那个字体给涂成黑色
congratulation_msg db 'Congratulation!!You win!!$'
youscore_msg db 'Your score is: 181$'
playagain_msg db 'Play next level?(Y/N)$'
;******************************
;要记录的数值
wave_brick1 dw 15;第一个档板的最左边的位置
wave_brick2 dw 170;第二个档板的最右边的位置
wave_brick1_pos db 1;1为向右移动,记录第一个档板的运动方向
wave_brick2_pos db 0;0为向左移动记录第二个档板的运动方向
count db 0;这个变量是用来记录次数的
bomb_count db 0;用于炸弹的特效
life_num db 3;记录生命值
score_num db 0;得分总和不能大于255
mouse_last dw 80;用于记录上一次的的鼠标的位置,只记录x轴
racket_width dw 30;用于记录球拍的宽度
ballx dw 90;用来记录球的左上角的x周坐标
bally dw 183;用来记录球的左上角的y周坐标
brick_num dw 100;用来记录砖块的数量
x dw 1;用于记录运动向量
y dw -1;用于记录运动向量
propx dw 0;这个变量是用来画道具时,储存道具的左上角的x轴信息
propy dw 0;这个变量是用来画道具时,储存道具的左上角的y轴的信息
prop_color db 10;这个是道具的颜色,它们的顺序与低下道具的顺序一一对应
db 5
db 9
db 15
db 33
db 12
db 1110b
db 1110b
bomb_color db 1100b
;*******用来记录砖块的剩余生命值
brick_life db 100 dup(?)
brick_life_huanyuan1 db 2,2,2,2,2,2,2,2,2,2
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,4,4,4,4,1,1,1
db 2,2,2,4,1,1,4,2,2,2
db 4,4,4,4,1,1,4,4,4,4
db 1,1,1,4,1,1,4,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 4,4,4,4,4,4,4,4,4,4
db 2,1,2,1,2,1,2,1,2,1
db 1,2,1,2,1,2,1,2,1,2
brick_life_huanyuan2 db 2,2,2,2,2,2,2,2,2,2
db 1,1,1,1,1,1,1,1,1,1
db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,4,1,1,4,2,2,2
db 1,1,1,4,1,1,4,1,1,1
db 2,2,2,4,1,1,4,2,2,2
db 1,1,1,1,1,1,1,1,1,1
db 4,4,4,4,4,4,4,4,4,4
db 2,1,2,1,2,1,2,1,2,1
db 1,2,1,2,1,2,1,2,1,2
brick_life_huanyuan3 db 2,2,2,2,2,2,2,2,2,2
db 2,2,2,2,2,2,2,2,2,2
db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,4,1,1,4,2,2,2
db 1,1,1,4,1,1,4,1,1,1
db 2,2,2,4,1,1,4,2,2,2
db 2,2,2,2,2,2,2,2,2,2
db 4,4,4,4,4,4,4,4,4,4
db 2,1,2,1,2,1,2,1,2,1
db 1,2,1,2,1,2,1,2,1,2
brick_life_huanyuan4 db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,2,2,2,2,2,2,2
db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,4,1,1,4,2,2,2
db 1,1,1,4,1,1,4,1,1,1
db 2,2,2,4,1,1,4,2,2,2
db 2,2,2,2,2,2,2,2,2,2
db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,2,2,2,2,2,2,2
db 2,1,2,2,2,2,2,2,1,2
brick_life_huanyuan5 db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,2,2,2,2,2,2,2
db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,4,2,2,4,2,2,2
db 1,1,1,4,2,2,4,1,1,1
db 2,2,2,4,2,2,4,2,2,2
db 4,4,4,4,2,2,4,4,4,4
db 4,4,4,4,4,4,4,4,4,4
db 2,2,2,2,2,2,2,2,2,2
db 2,1,2,2,2,2,2,2,1,2
;用来画道具和球;所有的道具都是10*10的
ball db 0,0,0,1,1,1,1,0,0,0;这个是球
db 0,1,1,1,1,1,1,1,1,0
db 0,1,1,1,1,1,1,1,1,0
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 0,1,1,1,1,1,1,1,1,0
db 0,1,1,1,1,1,1,1,1,0
db 0,0,0,1,1,1,1,0,0,0
add_life db 0,0,1,0,0,0,0,1,0,0;增加生命的道具
db 0,1,1,0,0,0,1,1,1,0
db 1,1,1,1,0,0,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 0,1,1,1,1,1,1,1,1,0
db 0,1,1,1,1,1,1,1,1,0
db 0,0,1,1,1,1,1,1,0,0
db 0,0,0,1,1,1,1,0,0,0
db 0,0,0,0,1,1,0,0,0,0
add_score db 0,0,0,0,1,1,0,0,0,0;增加分数的道具
db 0,0,0,1,1,1,1,0,0,0
db 0,0,1,1,1,1,1,1,0,0
db 0,1,1,1,1,1,1,1,1,0
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 0,1,1,1,1,1,1,1,1,0
db 0,0,1,1,1,1,1,1,0,0
db 0,0,0,1,1,1,1,0,0,0
db 0,0,0,0,1,1,0,0,0,0
speed_up db 0,0,1,0,0,0,0,1,0,0;加速的道具
db 0,1,1,1,0,0,1,1,1,0
db 1,1,1,1,1,1,1,1,1,1
db 0,1,1,1,0,0,1,1,1,0
db 0,0,1,0,0,0,0,1,0,0
db 0,0,1,0,0,0,0,1,0,0
db 0,1,1,1,0,0,1,1,1,0
db 1,1,1,1,1,1,1,1,1,1
db 0,1,1,1,0,0,1,1,1,0
db 0,0,1,0,0,0,0,1,0,0
speed_down db 0,0,0,0,1,1,0,0,0,0;减速的道具
db 0,0,1,1,1,1,1,1,0,0
db 1,1,1,1,1,1,1,1,1,1
db 0,0,1,1,1,1,1,1,0,0
db 0,0,0,0,1,1,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0
db 0,0,1,1,1,1,1,1,0,0
db 1,1,1,1,1,1,1,1,1,1
db 0,0,1,1,1,1,1,1,0,0
db 0,0,0,0,1,1,0,0,0,0
lar_racket db 1,1,1,1,1,1,1,1,1,1;大球拍的道具
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1
sma_racket db 1,1,1,1,1,1,1,1,1,1;小球拍的道具
db 1,1,1,1,1,1,1,1,1,1
db 1,1,0,0,1,1,0,0,1,1
db 1,0,1,1,0,0,1,1,0,1
db 1,0,1,1,0,0,1,1,0,1
db 1,0,1,1,0,0,1,1,0,1
db 1,0,1,1,0,0,1,1,0,1
db 1,0,1,1,0,0,1,1,0,1
db 1,0,1,1,0,0,1,1,0,1
db 1,1,1,1,1,1,1,1,1,1
bomb db 0,0,0,0,0,0,0,1,1,1;炸弹的道具
db 0,0,0,0,0,0,0,0,1,0
db 0,0,1,1,1,1,0,0,1,0
db 0,1,1,1,1,1,1,1,0,0
db 0,1,1,1,1,1,1,1,0,0
db 0,1,1,1,1,1,1,1,0,0
db 0,1,1,1,1,1,1,1,0,0
db 0,1,1,1,1,1,1,1,0,0
db 0,0,1,1,1,1,1,0,0,0
db 0,0,0,1,1,1,0,0,0,0
bigbomb db 1,1,0,0,0,0,0,0,1,1;炸弹的道具
db 1,1,1,0,0,0,0,1,1,1
db 0,1,1,1,0,0,1,1,1,0
db 0,0,1,1,1,1,1,1,0,0
db 0,0,0,1,1,1,1,0,0,0
db 0,0,0,1,1,1,1,1,0,0
db 0,0,1,1,1,1,1,1,0,0
db 0,1,1,1,0,0,1,1,1,0
db 1,1,1,0,0,0,0,1,1,1
db 1,1,0,0,0,0,0,0,1,1
showbomb db 0,1,0,0,1,0,0,1,0,0;炸弹爆炸的样子
db 0,0,1,0,1,0,1,0,0,1
db 0,1,0,1,1,1,1,0,1,0
db 1,0,1,1,0,0,1,1,0,0
db 0,0,1,0,1,1,0,1,1,1
db 1,1,1,0,1,1,0,1,0,0
db 0,0,1,1,0,0,1,1,1,0
db 0,1,0,1,1,1,1,0,0,1
db 1,0,0,1,0,1,0,1,0,0
db 0,0,1,0,0,1,0,0,1,0
xiaodou db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1;made by xiaodou
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0
db 0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0
db 0,1,1,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,0,0,1,1,0
db 1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0
db 1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0
db 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1
zhizuo db 0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0;zhizuo
db 0,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0,1,1,0,0,0
db 0,1,1,1,1,1,0,1,0,1,0,0,0,1,1,0,0,1,1,1,1,1,1
db 1,0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,1,1,1,0,0,0,0
db 0,1,1,1,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,1,1
db 0,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0
db 0,1,1,1,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0
db 0,1,0,1,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,1,1
db 0,1,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0
db 0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0
MUS_FREG2 DW 330,392,330,294,330,392,330,294,330
DW 330,392,330,294,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,332,262,-1
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100
DW 2 DUP(50,50,25,25),100
DW 3 DUP(50,25,25),100
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
hh dw 100 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ax,0
int 33h
cmp ax,0
jz exit
;将屏幕设置为320*200的显示分辨率
mov ah,00
mov al,13h
int 10h
;***********************************获取中断向量并保存
mov al,1ch
mov ah,35h
int 21h
push es
push bx
push ds
;***********************************置新的向量
mov dx,offset zhongduan
mov ax,seg zhongduan
mov ds,ax
mov al,1ch
mov ah,25h
int 21h
pop ds
;***********************************
call inmenufun
call init
next2:
call mouse_racket
cmp exitflag,0;判断退出位是否有效,0为有效,若有效则退出
jz exit
cmp stopflag,1;如果stopfalg有校,则进入暂停状态
jne nostop
call waitfun;调用暂停函数
nostop:
;判断replay的标志位是否为有效,如果有效(1),那么就重新开局
cmp replayflag,1
jne noreplay
call replayfun
noreplay:
;判断小球是不是已经都死光光了,如果是,那么调用函数,询问玩家是不是重新开局或者退出
cmp balldeadflag,1
jne noballdead
call balldeadfun
noballdead:
cmp bomb_flag,1
jne nobomb
call bomb_show
nobomb:
;当所有的砖块都已经被击碎
cmp cmpgameflag,1
jne nocmpgame
call cmpgamefun
nocmpgame:
jmp next2;循环,等待美妙18.2次的中断,对屏幕中的各个对象进行操作
exit:
;***********************************还原中断向量
pop dx
pop ds
mov al,1ch
mov ah,25h
int 21h
MOV AH,4CH
INT 21H
;******************************************************************
;当接到炸弹后,调用这个函数来实现特效
bomb_show proc near
push ax
push bx
push cx
mov qidiany,45;先定位垂直方向
mov zhongdiany,75
mov al,inmenu_color
mov color,al
mov cx,13
mov propx,-2
mov propy,65
mov propflag,8
show_loop1:;这个函数是把类似炸弹的东西画出来
add bomb_color,50
add propx,6
sub propy,15
call printprop
call waitf
add bomb_color,33
add propx,8
add propy,15
call printprop
call waitf
loop show_loop1
mov propflag,-1;一定要把propflag置为-1,否则将会使prop下掉
mov qidianx,4
mov zhongdianx,8
call setarea
mov cx,194
bomb_show_loop:;这个循环是用来从做到右把砖块划掉
mov ax,qidianx
mov zhongdianx,ax
mov color,00
call setarea
add qidianx,1
add zhongdianx,5
mov al,inmenu_color
mov color,al
call setarea
push cx
mov ax,03fh
bomb_show_delay:;延时
mov cx,0ffffh
bomb_show_delay1:
add bx,1
loop bomb_show_delay1
sub ax,1
cmp ax,0
jne bomb_show_delay
pop cx
loop bomb_show_loop
mov color,00
call setarea
bomb_show_exit:
mov bomb_flag,0
pop cx
pop bx
pop ax
ret
bomb_show endp
;****************************************************************
waitf proc near;没什么好解释的吧,很简单的延时
push cx
mov cx,0ffffh
waitf_1:
push cx
mov cx,01ffh
waitf_2:
loop waitf_2
pop cx
loop waitf_1
pop cx
ret
waitf endp
;******************************************************************
;当将所有的砖块都打完后,执行这个函数
cmpgamefun proc near
;由一个光莲由上到吓显示,将屏幕清空
add barflag,1
mov qidianx,0;设置在水平方向上,全部在操作范围内
mov zhongdianx,319
mov qidiany,0;设置垂直方向上,从0开始
mov zhongdiany,5
mov color,00
call setarea
mov cx,194
cmpgame_loop:;用循环操作,由上到下形成光莲
mov ax,qidiany;先将上面的一行擦去
mov zhongdiany,ax
mov color,00
call setarea
;再在底下生成一行
add qidiany,1
add zhongdiany,5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -