基于汇编的贪食蛇游戏毕业设计论文.docx
《基于汇编的贪食蛇游戏毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于汇编的贪食蛇游戏毕业设计论文.docx(42页珍藏版)》请在冰点文库上搜索。
基于汇编的贪食蛇游戏毕业设计论文
一、实验目的
本次实验是汇编语言与接口技术这门课程的综合试验。
目的是熟练掌握并能综合应用所学的汇编语言与接口技术,同时也熟悉了汇编语言的程序的调试方法,发现并纠正了平时编写汇编程序时一些不好的习惯,养成了较好的编程习惯,同时在实践中加深对这门课程的理解,也为后面进一步的学习以及实验打下扎实的基础。
二、实验环境
MasmforWindows集成实验环境。
三、实验内容
用所学的汇编语言与接口技术的知识,用汇编语言编写一贪
食蛇的游戏。
实验要求:
贪吃蛇能正常运动;
贪吃蛇能够有指定的四个方向键控制方向;
贪吃蛇吃掉豆子能自动加分;
贪吃蛇能够在碰到边界死亡;
其余可以根据自己的想法扩展功能;
。
四、实验步骤与调试方法
程序初始化部分:
在数据段定义好相关的提示信息以及储存蛇身的数组,主要有游戏之前的提示信息,游戏之中的相关输出信息,例如得分等。
画点部分:
屏幕显示采用320*200的图形16色显示模式,点的画出采用写像素的方式,每个点占用4*3像素。
同蛇移动程序:
采用不断刷屏的方式,通过延迟,程序没执行一次,蛇便会在相应的方向往前移动一个格。
此时可以通过记录蛇头位置并重画擦屏的方式显示出蛇身的新位置。
蛇的位置重置:
由于蛇是不断运动的,此时可以采用将新的蛇身的位置覆盖原先的数组。
随即豆的产生:
利用系统时间的变化,根据秒和百分之一秒的部分,此时可以通过一系列运算产生在要求范围内的的随机数,此时的随机数便是随即点,可以通过产生的随即点的坐标画出随即点。
蛇吃食物:
当蛇头的位置可以与随即点的位置坐标判断,如果此时两点的坐标是相同的,那么便可以将此时的食物点加到蛇头位置上。
判断游戏结束的条件:
当蛇的头部位置到达边界或者蛇头的位置与自身相重合,那么变产生结束的条件了。
五、源程序清单、测试数据、运行结果
.modelsmall
.stack200
.data
Lendb?
;蛇的长度
Bodydw200dup(0);蛇的身体位置
Directiondw256
Scoredb'Score00000';得分
snake_colordb0ah;蛇颜色
food_colordb0ch;食物色
speeddb0;速度
gameoverdb0;游戏结束标记
Pointdb0;得分数
foodXdw?
;食物坐标
foodYdw?
seeddw2;随即数种子
;******************************************************************************************
;显示方面的参数
toplinedw20;上边界
leftlinedw60;左边界
cut_xdw4;每格宽
cut_ydw3;每格长
max_xdw49;最大格数(横)
max_ydw49;最大格数(纵)
msg1db'GreedySnakes'
msg2db'by:
tangxing'
msg3db'Gameisover!
'
msg4db'Pressanykeyforstart!
Escforexit'
msg5db'ESCforback,Spaceforretry'
msg6db'pressspaceforpause/continue'
msg7db''
title1db6dup(20h),5dup(0dch),5dup(20h),5dup(0dch),5dup(20h)
title2db6dup(20h),0dbh,3dup(20h),0dbh,5dup(20h),0dbh,3dup(20h),0dbh,5dup(20h)
title3db6dup(20h),0dbh,3dup(20h),0dbh,5dup(20h),0dbh,3dup(20h),0dbh,5dup(20h)
title4db7dup(0dfh),3dup(20h),7dup(0dfh),3dup(20h),5dup(0dfh),0fdh
yellodb0eh
greendb02h
whitedb0fh
bluedb01h
;******************************************************************************************
;键盘扫描码
LEFTEQU4Bh
RIGHTEQU4Dh
UPEQU48h
DOWNEQU50h
QUITEQU01h
SPACEEQU39h
.code
mainprocfar
movax,@data
movds,ax
start:
movah,00
moval,12h
int10h;设置图形模式640*480
callshow_start_msg;显示开始提示信息
callshow_title
movah,00h
int16h;等待按键
cmpah,QUIT
jzdos;ESC则退出,否则进入游戏
game_start:
movah,00;设置图形模式320*200,游戏在此模式下运行
moval,13h
int10h
movcl,7;边框颜色
movsi,59
movbx,19
movdi,260
movdx,170
callrec;打印边框
callclear_area;游戏区域清空(效果)
callInit_snake;初始化蛇
callgetfood;得到第一个食物
callrun_snake;开始运动蛇
exit:
movdx,1010h;设置光标
callSetGb;设置光标位置
movbl,white;显示死亡信息
leabp,msg3
movcx,13
callMsg;显示字符串
movdx,1605h
movbl,white;显示提示信息
leabp,msg5
movcx,29
callMsg
exit_loop:
movah,00h
int16h;等待按键
cmpah,QUIT
jzstart
cmpah,SPACE
jzgame_start
jmpexit_loop;返回开始
dos:
movah,00
moval,03
int10h;设置文本模式
movah,4ch
int21h;退出到DOS
mainendp
;******************************************************************************************
;函数名:
SetGb
;功能:
设置光标位置
;传递参数:
dh/dl行/列
;******************************************************************************************
SetGbprocnear
pushax
pushbx
movbh,0
movah,02h
int10h
popbx
popax
ret
SetGbendp
;******************************************************************************************
;函数名:
Msg
;功能:
输出字符串
;传递参数:
;bl颜色号(BLRGBIRGB)
;bp字符串偏移地址
;cx字符串长度
;dh/dl行/列
;******************************************************************************************
Msgprocnear
pushax
pushbx
pushes
pushds
popes;将数据段ds送es
moval,0
movah,13h
movbh,0
int10h
popes
popbx
popax
ret
Msgendp
;******************************************************************************************
;函数名:
show_title
;功能:
显示开始提示信息
;******************************************************************************************
show_titleprocnear
pushax
pushbx
pushcx
pushdx
movdl,10h
movcx,10h
yidong:
pushcx
decdl
movdh,0fh
callSetGb
moval,020h
movah,0eh
int10h
incdl
movdh,0ch
callSetGb
movbl,yello
leabp,title1
movcx,26
callMsg
movdh,0dh
callSetGb
movbl,yello
leabp,title2
movcx,26
callMsg
movdh,0eh
callSetGb
movbl,yello
leabp,title3
movcx,26
callMsg
movdh,0fh
callSetGb
movbl,yello
leabp,title4
movcx,26
callMsg
calldelay
incdl
popcx
callshow_start_msg
loopyidong
movah,0ch
moval,0
int21h
popdx
popcx
popbx
popax
ret
show_titleendp
;******************************************************************************************
;函数名:
show_start_msg
;功能:
显示开始提示信息
;******************************************************************************************
show_start_msgprocnear
pushax
pushbx
pushcx
pushdx
movdx,1426h
callSetGb
movbl,0a1h
leabp,msg1
movcx,12
callMsg
movdx,190bh
callSetGb;设置光标
movbl,08h
leabp,msg2;显示作者信息
movcx,11
callMsg;显示字符串
movdx,1619h;设置光标
callSetGb
movbl,white
leabp,msg4;显示提示信息
movcx,37
callMsg;显示字符串
popdx
popcx
popbx
popax
ret
show_start_msgendp
;******************************************************************************************
;函数名:
cutsnake
;功能:
显示蛇的一格
;传递参数:
;si/di游戏空间列/游戏空间行(50*50)
;******************************************************************************************
cutsnakeprocnear
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movcl,snake_color;置颜色
movax,di;取坐标值
mulcut_y;乘象素值
addax,topline;加上边界
movbx,ax
addax,2
movdx,ax
pushbx
pushdx
movax,si;取坐标值
mulcut_x;乘象素值
addax,leftline;加上边界
movsi,ax
addax,3
movdi,ax
popdx
popbx
callRec;Rec的参数是cl颜色si左边bx上边di右边dx下边
popdi
popsi
popdx
popcx
popbx
popax
ret
cutsnakeendp
;******************************************************************************************
;函数名:
cutfood
;功能:
显示食物
;传递参数:
;si/di游戏空间列/游戏空间行(50*50)
;函数返回:
空
;******************************************************************************************
cutfoodprocnear
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movcl,food_color;置颜色
movax,di;取坐标值
mulcut_y;乘象素值
addax,topline;加上边界
movbx,ax
addax,2
movdx,ax
pushbx
pushdx
movax,si;取坐标值
mulcut_x;乘象素值
addax,leftline;加上边界
movsi,ax
addax,3
movdi,ax
popdx
popbx
callRec;Rec的参数是cl颜色si左边bx上边di右边dx下边
popdi
popsi
popdx
popcx
popbx
popax
ret
cutfoodendp
;******************************************************************************************
;函数名:
clearcut
;功能:
清除格
;传递参数:
;si/di游戏空间列/游戏空间行(50*50)
;函数返回:
空
;******************************************************************************************
clearcutprocnear
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movcl,0;置颜色(黑)
movax,di;取坐标值
mulcut_y;乘象素值
addax,topline;加上边界
movbx,ax
addax,2
movdx,ax
pushbx
pushdx
movax,si;取坐标值
mulcut_x;乘象素值
addax,leftline;加上边界
movsi,ax
addax,3
movdi,ax
popdx
popbx
callRec;Rec的参数是cl颜色si左边bx上边di右边dx下边
popdi
popsi
popdx
popcx
popbx
popax
ret
clearcutendp
;******************************************************************************************
;函数名:
Rand
;功能:
产生指定范围大小的随机数
;传递参数:
si数字的范围最大值+1
;函数返回:
ax返回随机数的值
;******************************************************************************************
Randproc
pushbx
pushcx
pushdx
pushsi
movah,2ch
int21h
movax,dx
movdx,0
movbx,si;指定随机数的范围
divbx
movax,dx
popsi
popdx
popcx
popbx
ret
Randendp
;******************************************************************************************
;函数名:
getfood
;功能:
产生新食物,即随机产生一组49*49的坐标
;函数返回:
foodx与foody的值
;******************************************************************************************
getfoodproc
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
M1:
movsi,50;置随机数范围(最大值+1)
callRand;产生随机数
movfoodx,ax;赋予食物坐标x
movsi,50;置随机数范围(最大值+1)
callRand;产生随机数
movfoody,ax;赋予食物坐标y
movsi,foodx
movdi,foody
movax,di;取坐标值
mulcut_y;乘象素值
addax,topline
movdx,ax
pushdx
movax,si;取坐标值
mulcut_x;乘象素值
addax,leftline
movcx,ax
popdx
movah,0dh
movbh,0
int10h
cmpal,snake_color
jzM1
callcutfood;画食物
popdi
popsi
popdx
popcx
popbx
popax
ret
getfoodendp
;******************************************************************************************
;函数名:
Delay
;功能:
延时
;******************************************************************************************
Delayproc
pushax
pushbx
pushcx
pushdx
movcx,33144
waitf:
inal,61h
andal,10h
cmpal,ah
jewaitf
movah,al
loopwaitf
popdx
popcx
popbx
popax
ret
Delayendp
;******************************************************************************************
;函数名:
Check_key
;功能:
处理键盘响应
;函数返回:
Direction的值,gameover的值(按ESC时)
;******************************************************************************************
Check_keyproc
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movah,01h
int16h
jzcheck_nokey;如果没有按键就继续
movah,0;取得扫描码
int16h
pushax
cmpah,SPACE
jnzS2
S1:
movah,0
int16h
cmpah,SPACE
jnzS1
S2:
popax
cmpah,LEFT;往左移动
jzcheck_LEFT
cmpah,RIGHT;往右边移动
jzcheck_RIGHT
cmpah,UP;往上移动
jzcheck_UP
cmpah,DOWN;往下移动
jzcheck_DOWN
cmpah,QUIT;结束游戏
jzcheck_QUIT
jmpcheck_nokey
check_LEFT:
movah,-1;(-1,0)
moval,0
movbx,ax;检查是否反向
addbx,Direction
jzcheck_nokey
movDirection,ax
jmpcheck_nokey
check_RIGHT:
movah,1;(1,0)
moval,0
movbx,ax;检查是否反向
addbx,Direction
jzcheck_nokey
movDirection,ax
jmpcheck_nokey
check_UP:
movah,0;(0,-1)
moval,-1
movbx,Direction;检查是否反向
subbl,1
jzcheck_nokey
movDire