汇编贪吃蛇课程设计附源码.doc
《汇编贪吃蛇课程设计附源码.doc》由会员分享,可在线阅读,更多相关《汇编贪吃蛇课程设计附源码.doc(38页珍藏版)》请在三一文库上搜索。
1、目录1程序简介12程序设计12.1程序分析程序初始化:12.2游戏流程22.3程序流程图32.4数据定义及重要函数43系统测试及改进123.1程序测试123.2系统改进144源码151程序简介贪吃蛇游戏是一个经典小游戏,在封闭的围墙里面,通过键盘的上下左右控制蛇的方向,寻找随机出现的食物。蛇头撞到食物,则食物被吃掉,蛇身体长度+1,同时记100分,蛇的身子越吃越长,身子越长玩的难度就越大,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。2程序设计2.1程序分析程序初始化:加载在数据段定义好相关的提示信息以及储存蛇身的数组,主要是如何开始游戏的提示信息蛇的移动:程序的关键是表示蛇的图形以
2、及蛇的移动。一开始用4个小矩形表示蛇的身体,每吃一个食物,身体增加一个矩形,移动时必须从蛇头开始,所以蛇不能向相反方向移动,蛇头的前进方向也就是蛇的方向,蛇尾不能改作蛇头。设置一个等待时间,如果不按任何按键,蛇在当前方向上前进。按了有效的方向键后,先确定蛇头的位置然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有清屏的原因,原来蛇的位置和新蛇的位置相差一个单位,所以看起来蛇会多一节身体。食物的产生:通过一系列运算产生在要求范围内的的随机数,此时的随机数便是随即点,可以通过产生的随即点的坐标画出随即点,也就是食物了。蛇吃食物: 蛇头的位置可以与随即点的位置坐标判断,如果此
3、时两点的坐标是相同的,那么该食物被蛇吃掉,蛇的长度+1。判断游戏结束的条件: 当蛇的头部位置坐标与边界坐标重合或者蛇头的位置与自身相重合,游戏结束 暂停: 游戏过程中,按空格键可以使游戏暂停,在按空格键进入被暂停的游戏2.2游戏流程 由程序分析知,该游戏是用方向键实现贪吃蛇的移动,游戏大概流程分为:游戏初始化(描绘围墙、蛇体、食物等及其颜色),游戏过程(通过四个方向键控制蛇头带动身体移动),游戏结束(显示总分并判断是否重新游戏)。2.3程序流程图 2.4数据定义及重要函数 数据定义及键盘扫描码 数据定义: Len db ? ;蛇的长度Body dw 200 dup(0) ;蛇的身体位置Dire
4、ction dw 256Score db Score00000 ;得分snake_color db 0ah ;蛇颜色food_color db 0ch ;食物色speed db 0 ;速度gameover db 0 ;游戏结束标记Point db 0 ;得分数foodX dw ? ;食物坐标foodY dw ?seed dw 2 ;随即数种子 键盘扫描码:LEFT EQU 4BhRIGHT EQU 4DhUP EQU 48hDOWN EQU 50hQUIT EQU 01hSPACE EQU 39h main函数 主函数首先加载定义好的数据,设置图形模式大小,调用显示开始提示信息的函数,中断等待
5、用户按键输入,判断退出或开始游戏。进入游戏,重新设置图形模式,调用rec,clear_area,getfood,run_sanke函数分别打印边框,初始化蛇,随机食物,开始运动蛇。当蛇死亡时,中断,等待用户输入,根据用户的输入继续游戏或退出程序。 main proc farmov ax , datamov ds , axstart:mov ah , 00mov al , 12hint 10h ;设置图形模式640*480call show_start_msg ;显示开始提示信息call show_titlemov ah , 00hint 16h ;等待按键cmp ah , QUIT jz do
6、s ;ESC则退出,否则进入游戏game_start:mov ah , 00 ;设置图形模式320*200,游戏在此模式下运行mov al , 13hint 10h mov cl , 7 ;边框颜色mov si , 59mov bx , 19Init_snake ;初始化蛇call getfood ;得到第一个食物call run_snake ;开始运动蛇mov dx , 1010h ;设置光标call SetGb ;设置光标位置mov bl , white ;显示死亡信息lea bp , msg3mov cx , 13call Msg ;显示字符串mov dx , 1605hmov bl ,
7、 white ;显示提示信息lea bp , msg5mov cx , 29call Msgexit_loop:mov ah , 00hint 16h ;等待按键cmp ah , QUITjz startcmp ah , SPACEjz game_startjmp exit_loop ;返回开始dos:mov ah , 00mov al , 03int 10h ;设置文本模式mov ah , 4chint 21h ;退出到DOSmain endp Run_snake函数 蛇一开始默认向右运动,当按下空格键时游戏暂停,再按空格键游戏开始。用INT10H的1号功能检测是否有按键输入,改变蛇头前进的
8、方向,没有保持当前的前进方向。在蛇运动过程中,不断检查是否撞墙或蛇头触碰到蛇身,如果是,跳转到stop,提示重新或退出。当检查到食物坐标和蛇头坐标一致时,食物被吃,蛇身长度+1,保存当前前进方向。run_snake procpush axpush bxpush cxpush dxpush sipush dimov dx, 0005hcall SetGbmov bl,whitelea bp,msg6mov cx,30call Msgloop1:call Delaymov al,1cmp al,gameoverjz stopmov bx , offset Bodymov cx,0mov cl,Le
9、nadd bx,cxadd bx,cxsub bx,2A1:mov ax,bx mov bx+2,axsub bx,2loop A1addhead: mov bx , offset Body ;增加新头部并改写数据mov ax , bxmov dx , Directionadd ah , dh ;坐标加方向add al , dl ;坐标加方向mov bx , ax ;存入头部mov dx,0 ;为check_die准备参数si,dimov dl , ahmov si , dxmov dl , almov di , dxcall check_die ;检查死亡mov al,1cmp al,gam
10、eoverjz stop call check_eat ;检查吃cmp cx,1jz A2 mov bx , offset Bodymov ax,0add Len,1mov al , Lenadd bx , ax ;取到蛇尾add bx , axsub bx , 2mov ax , bxmov cx,0mov bx,cxmov dx,0mov dl , ahmov si , dxmov dl , almov di , dxsub Len,1call clearcutmov bx , offset Bodymov ax, bxmov dx,0mov dl , ahmov si , dxmov d
11、l , almov di , dxcall cutsnakejmp A3A2:add Len,1mov bx , offset Bodymov ax, bxmov dx,0mov dl , ahmov si , dxmov dl , almov di , dxcall cutsnake ;画新头部call getfoodA3:call show_pointcall check_key ;检查按键jmp loop1 ;蛇运动循环DATAS SEGMENTstop:pop dipop sipop dxpop cxpop bxpop axretrun_snake endp getfood函数 设置了
12、一个随机数坐标x最大值50,调用Rand函数获取随机x轴坐标,同理可得随机y轴坐标,该坐标就是食物的随机坐标。调用cutfood函数,将随机食物在显示屏输出getfood procpush axpush bxpush cxpush dxpush sipush diM1:mov si,50 ;置随机数范围(最大值+1)call Rand ;产生随机数mov foodx,ax ;赋予食物坐标xmov si,50 ;置随机数范围(最大值+1)call Rand ;产生随机数mov foody,ax ;赋予食物坐标ymov si,foodxmov di,foodymov ax,di ;取坐标值mul
13、cut_y ;乘象素值add ax,topline mov dx,axpush dxmov ax,si ;取坐标值mul cut_x ;乘象素值add ax,leftline mov cx,axpop dxmov ah,0dhmov bh,0int 10hcmp al,snake_colorjz M1call cutfood ;画食物pop dipop sipop dxpop cxpop bxpop axretgetfood endp Check_key函数响应键盘输入,控制蛇的移动以及控制游戏退出 Check_key procpush axpush bxpush cxpush dxpush
14、sipush dimov ah , 01hint 16hjz check_nokey ;如果没有按键就继续mov ah , 0 ;取得扫描码 int 16hpush ax cmp ah , SPACEjnz S2S1:mov ah,0int 16hcmp ah, SPACEjnz S1S2:pop axcmp ah , LEFT ;往左移动jz check_LEFTcmp ah , RIGHT ;往右边移动jz check_RIGHTcmp ah , UP ;往上移动jz check_UPcmp ah , DOWN ;往下移动jz check_DOWNcmp ah , QUIT ;结束游戏jz
15、 check_QUITjmp check_nokeycheck_LEFT:mov ah , -1 ;(-1,0)mov al , 0mov bx , ax ;检查是否反向add bx , Directionjz check_nokeymov Direction , axjmp check_nokeycheck_RIGHT:mov ah , 1 ;(1,0)mov al , 0mov bx , ax ;检查是否反向add bx , Directionjz check_nokeymov Direction , axjmp check_nokeycheck_UP:mov ah , 0 ;(0,-1)
16、mov al , -1mov bx , Direction ;检查是否反向sub bl , 1jz check_nokey mov Direction , axjmp check_nokeycheck_DOWN:mov ah , 0 ;(0,1)mov al , 1 mov bx , Direction ;检查是否反向add bl , 1jz check_nokeymov Direction , axjmp check_nokeycheck_QUIT:jmp check_exitcheck_exit: ;按下ESC键的情况mov gameover,1check_nokey:mov ah,0ch
17、mov al,0int 21hpop dipop sipop dxpop cxpop bxpop axretCheck_key endp3系统测试及改进3.1程序测试打开程序,显示欢迎界面,提醒用户输入,按任意键进入程序,游戏开始时,贪吃蛇默认向右移动,使用键盘的上下左右控制贪吃蛇的前进的方向,最下方的Score实时更新分数,游戏过程中空格键可以暂停和继续、每吃一个食物,Socre+100,蛇身长度+1当蛇头撞墙之后,弹出信息Game is over!程序中断,提示并等待用户操作,当按ESC键时退回主界面,按空格键重新开始游戏,此时分数归零,蛇身长度也恢复到开始时的默认值如图,当蛇头撞上蛇身时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 贪吃 课程设计 源码
