汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc

上传人:laozhun 文档编号:2882118 上传时间:2023-03-01 格式:DOC 页数:27 大小:1.73MB
返回 下载 相关 举报
汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc_第1页
第1页 / 共27页
汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc_第2页
第2页 / 共27页
汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc_第3页
第3页 / 共27页
汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc_第4页
第4页 / 共27页
汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc》由会员分享,可在线阅读,更多相关《汇编语言与接口技术课程设计实验报告基于汇编的贪食蛇游戏.doc(27页珍藏版)》请在三一办公上搜索。

1、一、 实验目的:本次实验是汇编语言与接口技术这门课程的综合试验。目的是熟练掌握并能综合应用所学的汇编语言与接口技术,同时也熟悉了汇编语言的程序的调试方法,发现并纠正了平时编写汇编程序时一些不好的习惯,养成了较好的编程习惯,同时在实践中加深对这门课程的理解,也为后面进一步的学习以及实验打下扎实的基础。二、 实验环境Masm for Windows 集成实验环境。三、 实验内容用所学的汇编语言与接口技术的知识,用汇编语言编写一贪 食蛇的游戏。 实验要求:贪吃蛇能正常运动; 贪吃蛇能够有指定的四个方向键控制方向; 贪吃蛇吃掉豆子能自动加分; 贪吃蛇能够在碰到边界死亡; 其余可以根据自己的想法扩展功能

2、;。四、 实验步骤与调试方法程序初始化部分:在数据段定义好相关的提示信息以及储存蛇身的数组,主要有游戏之前的提示信息,游戏之中的相关输出信息,例如得分等。画点部分: 屏幕显示采用320*200的图形16色显示模式,点的画出采用写像素的方式,每个点占用4*3像素。同蛇移动程序: 采用不断刷屏的方式,通过延迟,程序没执行一次,蛇便会在相应的方向往前移动一个格。此时可以通过记录蛇头位置并重画擦屏的方式显示出蛇身的新位置。蛇的位置重置: 由于蛇是不断运动的,此时可以采用将新的蛇身的位置覆盖原先的数组。随即豆的产生: 利用系统时间的变化,根据秒和百分之一秒的部分,此时可以通过一系列运算产生在要求范围内的

3、的随机数,此时的随机数便是随即点,可以通过产生的随即点的坐标画出随即点。蛇吃食物: 当蛇头的位置可以与随即点的位置坐标判断,如果此时两点的坐标是相同的,那么便可以将此时的食物点加到蛇头位置上。判断游戏结束的条件: 当蛇的头部位置到达边界或者蛇头的位置与自身相重合,那么变产生结束的条件了。五、 源程序清单、测试数据、运行结果.model small.stack 200.dataLen db ? ;蛇的长度Body dw 200 dup(0) ;蛇的身体位置Direction dw 256Score db Score00000 ;得分snake_color db 0ah ;蛇颜色food_colo

4、r db 0ch ;食物色speed db 0 ;速度gameover db 0 ;游戏结束标记Point db 0 ;得分数foodX dw ? ;食物坐标foodY dw ?seed dw 2 ;随即数种子;* ;显示方面的参数topline dw 20 ;上边界leftline dw 60 ;左边界cut_x dw 4 ;每格宽cut_y dw 3 ;每格长max_x dw 49 ;最大格数(横)max_y dw 49 ;最大格数(纵)msg1 db Greedy Snakesmsg2 db by:tangxingmsg3 db Game is over!msg4 db Press an

5、y key for start! Esc for exitmsg5 db ESC for back, Space for retrymsg6 db press space for pause/continuemsg7 db title1 db 6 dup(20h), 5 dup(0dch), 5 dup(20h) ,5 dup(0dch), 5 dup(20h) title2 db 6 dup(20h), 0dbh,3 dup(20h),0dbh,5 dup(20h),0dbh,3 dup(20h),0dbh ,5 dup(20h) title3 db 6 dup(20h), 0dbh,3 d

6、up(20h),0dbh,5 dup(20h) ,0dbh,3 dup(20h),0dbh,5 dup(20h)title4 db 7 dup(0dfh), 3 dup(20h),7 dup(0dfh), 3 dup(20h),5 dup(0dfh),0fdhyello db 0eh green db 02h white db 0fh blue db 01h;* ;键盘扫描码LEFT EQU 4BhRIGHT EQU 4DhUP EQU 48hDOWN EQU 50hQUIT EQU 01hSPACE EQU 39h.codemain proc farmov ax , datamov ds ,

7、 axstart:mov ah , 00mov al , 12hint 10h ;设置图形模式640*480call show_start_msg ;显示开始提示信息call show_titlemov ah , 00hint 16h ;等待按键cmp ah , QUIT jz dos ;ESC则退出,否则进入游戏game_start:mov ah , 00 ;设置图形模式320*200,游戏在此模式下运行mov al , 13hint 10h mov cl , 7 ;边框颜色mov si , 59mov bx , 19mov di , 260mov dx , 170call rec ;打印边

8、框call clear_area ;游戏区域清空(效果)call Init_snake ;初始化蛇call getfood ;得到第一个食物call run_snake ;开始运动蛇exit:mov dx , 1010h ;设置光标call SetGb ;设置光标位置mov bl , white ;显示死亡信息lea bp , msg3mov cx , 13call Msg ;显示字符串mov dx , 1605hmov bl , white ;显示提示信息lea bp , msg5mov cx , 29call Msgexit_loop:mov ah , 00hint 16h ;等待按键cm

9、p ah , QUITjz startcmp ah , SPACEjz game_startjmp exit_loop ;返回开始dos:mov ah , 00mov al , 03int 10h ;设置文本模式mov ah , 4chint 21h ;退出到DOSmain endp;*;函数名: SetGb;功能: 设置光标位置;传递参数: dh/dl 行/列;*SetGb proc nearpush axpush bxmov bh , 0mov ah , 02hint 10hpop bxpop ax retSetGb endp;*;函数名: Msg;功能: 输出字符串;传递参数: ; bl

10、 颜色号(BL RGB IRGB); bp 字符串偏移地址; cx 字符串长度; dh/dl 行/列;*Msg proc near push axpush bxpush espush dspop es ;将数据段ds送esmov al , 0mov ah , 13hmov bh , 0 int 10hpop espop bxpop axret Msg endp;*;函数名: show_title;功能: 显示开始提示信息;*show_title proc nearpush axpush bxpush cxpush dxmov dl,10hmov cx,10hyidong:push cxdec

11、dlmov dh,0fhcall SetGbmov al,020hmov ah,0ehint 10hinc dlmov dh,0chcall SetGbmov bl,yellolea bp,title1mov cx,26call Msgmov dh,0dhcall SetGbmov bl,yellolea bp,title2mov cx,26call Msgmov dh,0ehcall SetGbmov bl,yellolea bp,title3mov cx,26call Msgmov dh,0fhcall SetGbmov bl,yellolea bp,title4mov cx,26call

12、 Msgcall delayinc dlpop cxcall show_start_msgloop yidongmov ah,0chmov al,0int 21hpop dxpop cxpop bxpop ax retshow_title endp;*;函数名: show_start_msg;功能: 显示开始提示信息;*show_start_msg proc nearpush axpush bxpush cxpush dxmov dx,1426hcall SetGbmov bl,0a1hlea bp,msg1mov cx,12call Msgmov dx , 190bhcall SetGb ;

13、设置光标mov bl,08hlea bp,msg2 ;显示作者信息mov cx,11call Msg ;显示字符串mov dx , 1619h ;设置光标call SetGbmov bl , whitelea bp , msg4 ;显示提示信息mov cx , 37call Msg ;显示字符串pop dxpop cxpop bxpop ax retshow_start_msg endp;*;函数名: cutsnake;功能: 显示蛇的一格;传递参数: ; si/di 游戏空间列/游戏空间行(50*50);*cutsnake proc nearpush axpush bxpush cxpush

14、 dxpush sipush dimov cl, snake_color ;置颜色mov ax,di ;取坐标值mul cut_y ;乘象素值add ax,topline ;加上边界mov bx , ax add ax , 2 mov dx , axpush bxpush dxmov ax,si ;取坐标值mul cut_x ;乘象素值add ax,leftline ;加上边界mov si , axadd ax , 3mov di , axpop dxpop bxcall Rec ;Rec的参数是cl颜色 si左边 bx上边 di右边 dx下边pop dipop sipop dxpop cxp

15、op bxpop ax retcutsnake endp;*;函数名: cutfood;功能: 显示食物;传递参数: ; si/di 游戏空间列/游戏空间行(50*50);函数返回: 空;*cutfood proc nearpush axpush bxpush cxpush dxpush sipush dimov cl , food_color ;置颜色mov ax,di ;取坐标值mul cut_y ;乘象素值add ax,topline ;加上边界mov bx , axadd ax , 2mov dx , axpush bx push dxmov ax,si ;取坐标值mul cut_x

16、;乘象素值add ax,leftline ;加上边界mov si , axadd ax , 3mov di , axpop dxpop bxcall Rec ;Rec的参数是cl颜色 si左边 bx上边 di右边 dx下边pop dipop sipop dxpop cxpop bxpop ax retcutfood endp;*;函数名: clearcut;功能: 清除格;传递参数: ; si/di 游戏空间列/游戏空间行(50*50);函数返回: 空;*clearcut proc nearpush axpush bxpush cxpush dxpush sipush dimov cl , 0

17、 ;置颜色(黑)mov ax,di ;取坐标值mul cut_y ;乘象素值add ax,topline ;加上边界mov bx , axadd ax , 2mov dx , axpush bxpush dxmov ax,si ;取坐标值mul cut_x ;乘象素值add ax,leftline ;加上边界mov si , axadd ax , 3mov di , axpop dxpop bxcall Rec ;Rec的参数是cl颜色 si左边 bx上边 di右边 dx下边pop dipop sipop dxpop cxpop bxpop ax retclearcut endp;*;函数名:

18、 Rand;功能: 产生指定范围大小的随机数;传递参数: si 数字的范围最大值+1;函数返回: ax 返回随机数的值;*Rand procpush bxpush cxpush dxpush simov ah,2chint 21hmov ax,dxmov dx,0mov bx,si ;指定随机数的范围div bx mov ax,dxpop sipop dxpop cxpop bx retRand endp;*;函数名: getfood;功能: 产生新食物,即随机产生一组49*49的坐标 ;函数返回: foodx与foody的值;*getfood procpush axpush bxpush c

19、xpush 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 cut_y ;乘象素值add ax,topline mov dx,axpush dxmov ax,si ;取坐标值mul cut_x ;乘象素值add ax,leftline mov cx,axpop dxmov ah,

20、0dhmov bh,0int 10hcmp al,snake_colorjz M1call cutfood ;画食物pop dipop sipop dxpop cxpop bxpop axretgetfood endp;*;函数名: Delay;功能: 延时;*Delay procpush axpush bxpush cx push dx mov cx,33144waitf:in al,61hand al,10hcmp al,ahje waitfmov ah,alloop waitfpop dxpop cxpop bxpop axretDelay endp;*;函数名: Check_key;功

21、能: 处理键盘响应 ;函数返回: Direction的值,gameover的值(按ESC时);*Check_key procpush axpush bxpush cxpush dxpush 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 ;往右边移动

22、jz check_RIGHTcmp ah , UP ;往上移动jz check_UPcmp ah , DOWN ;往下移动jz check_DOWNcmp ah , QUIT ;结束游戏jz 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 ;检查是

23、否反向add bx , Directionjz check_nokeymov Direction , axjmp check_nokeycheck_UP:mov ah , 0 ;(0,-1)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

24、 check_nokeycheck_QUIT:jmp check_exitcheck_exit: ;按下ESC键的情况mov gameover,1check_nokey:mov ah,0chmov al,0int 21hpop dipop sipop dxpop cxpop bxpop axretCheck_key endp;*;函数名: Check_die;功能: 处理死亡的响应;传递参数: SI,DI为当前蛇头部的坐标 ;函数返回: 蛇参数的值;*Check_die procpush axpush bxpush cxpush dxpush sipush dicmp si , 50 ;检查是

25、否到达边界jz deadcmp si , 255jz deadcmp di , 50jz deadcmp di , 255jz deadmov ax,si ;检查是否接触蛇身mov dh,al ;DX中获得当前坐标mov ax,dimov dl,almov cx,0mov cl, Lensub cl,1 mov bx,offset Bodycheck_die_loop:add bx , 2mov ax , bxcmp ax , dx ;取出蛇身信息进行比较jz dead ;触及蛇身即死亡loop check_die_loopjmp nextdead:mov gameover,1 ;死亡即赋ga

26、meover值1next:pop dipop sipop dxpop cxpop bxpop axretCheck_die endp;*;函数名: Check_eat;功能: 处理吃到食物的响应;传递参数: SI,DI为当前蛇头部的坐标 ;函数返回: cx;*Check_eat procpush axpush bxpush dxpush sipush dimov cx,0mov ax , foodxmov bx , foodycmp ax , sijz ok1jmp check_eat_outok1: ;横坐标相等cmp bx , dijz ok2jmp check_eat_outok2: ;

27、纵坐标也相等 add point,1 ;加分mov cx,1check_eat_out:pop dipop sipop dxpop bxpop axretCheck_eat endp;*;函数名: Run_snake;功能: 蛇运动;*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 B

28、odymov cx,0mov cl,Lenadd 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 ;检查

29、死亡mov al,1cmp al,gameoverjz 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

30、, ahmov si , dxmov dl , 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_snak

31、e endp;*;函数名: Init_snake;功能: 蛇初始化;*Init_snake procpush axpush bxpush cxpush dxpush sipush dimov al , 4mov Len, al ;蛇的初始大小为4mov ax,256 ;初始方向为右mov Direction,axmov gameover,0mov point,0mov bx , offset Bodymov ch , 25 ;蛇的初始位置设为25,25mov cl , 25mov bx , cxmov cx,3init_first: ;生成第一个蛇mov ax , bxmov dx , Dir

32、ectionsub ah , dh ;坐标x减方向sub al , dl ;坐标y减方向add bx , 2mov bx , ax ;保存一格蛇的信息loop init_firstinit_print: ;开始画第一个蛇mov cx,0mov cl, Lenmov dx,0mov bx , offset Bodyinit_print_loop:mov ax , bxmov dl , ahmov si , dxmov dl , almov di , dxcall cutsnake ;画一格add bx , 2loop init_print_loopInit_over:pop dipop sipop dxpop cxpop bxpop axretInit_snake endp;*;函数名: clear_area;功能: 清空游戏区域;*clear_area procpush axpush bxpush cxpush dxpush sipush dimov ax,0mov dx,0clear_loop1: ;填充一遍黑颜色cmp ax,50jz clear_loop1_overclear_loop2:cmp dx,50jz clear_loop2_over

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号