《微机原理与接口技术课程设计贪吃蛇游戏.doc》由会员分享,可在线阅读,更多相关《微机原理与接口技术课程设计贪吃蛇游戏.doc(35页珍藏版)》请在三一办公上搜索。
1、微机原理与接口技术课程设计报告设计题目: 贪吃蛇游戏姓名: 班级: 自动化 学号: 同组人: 时间: 2010年12月 贪吃蛇游戏摘要:贪吃蛇游戏,运行游戏后显示提示界面,按任意键进入游戏,按Esc键退出程序。进入游戏后有两遍刷屏,之后进入游戏,由方向键控制蛇的运动,寻找食物,吃到食物得分,撞到墙壁或蛇身游戏结束,按空格键重新进入游戏,按Esc键回到提示界面,按任意键继续进入游戏,按Esc退出程序。目录1.设计任务和要求32.设计小组成员及分工33.软件编程33.1 软件流程图3 3.2 汇编语言程序44.程序运行结果335.设计过程中出现的问题及解决方法336.设计总结337.参考文献34一
2、、设计任务和要求设计一个汇编语言的贪吃蛇游戏简要说明:用一个边框作为基本显示屏,连续移动的方格表示一条蛇,用任意出现的一个方格表示食物,用4条线表示“墙”,用四个按键控制蛇的运动方向,完成贪食蛇游戏,蛇撞“墙”、边或者游戏时间到,则游戏结束。1. 食物出现的地方是随机的;2.显示得分情况,每吃掉一个食物就加1100分;3. 游戏时间不限制。4. 选做:增加游戏难度或自拟其它功能。二、设计小组成员及分工成员:郑玮 苏丹分工:郑玮:调试修改程序,拟出课程设计报告内容 苏丹:写出并整理报告内容三、 软件编程1.软件流程图2.汇编语言程序.MODEL SMALL;*.STACK 200;*.DATA
3、;蛇的参数以及游戏参数LEN DB 5 ;蛇的长度LIFE DB 1 ;蛇的生命BODY DW 200 DUP(0) ;蛇的身体位置DIRECTION DW 256 ;(0,1)(O,-1)(1,0)(-1,0)SCORE DB SCORE000000 ;得分SNAKE_COLOR DB 09 ;蛇颜色SPEED DB 0 ;速度GAMEOVER DB 0 ;游戏结束标记POINT DB 0 ;得分数FOOD_COLOR DB 04 ;食物色FOODX DW ? ;食物坐标 FOODY DW ?SEED DW 200 ;随即数种子;* ;显示方面的参数 TOPLINE DW 20 ;上边界LE
4、FTLINE DW 60 ;左边界CUT_X DW 4 ;每格宽CUT_Y DW 3 ;每格长MAX_X DW 49 ;最大格数(横)MAX_Y DW 49 ;最大格数(纵)MSG2 DB ZI DONG HUA 08-3 BAN ZHENG WEI AND SU DAN MODIFY MSG3 DB GAME OVER!MSG4 DB PRESS ANY KEY TO START! ESC FOR EXITMSG5 DB ESC FOR BACK, SPACE FOR RETRYFLASH DB 04H ;字体颜色(红)GREEN DB 02H ;字体颜色(绿)YELLOW DB 8EH ;
5、字体颜色(黄)WHITE DB 0FH ;字体颜色(白);* ;键盘扫描码LEFT EQU 4BH RIGHT EQU 4DHUP EQU 48HDOWN EQU 50HQUIT EQU 01HSPACE EQU 39H;* ;LOGO BY BSASCIITIT1 DB ZZZZZZZZZZZZZ DDDDDDDD HHH HHH TIT2 DB ZZZZZZZZZZZZZ DDDDDDDDDD HHH HHHTIT3 DB ZZZ DDD DDD HHH HHHTIT4 DB ZZZ DDD DDD HHH HHH TIT5 DB ZZZ DDD DDD HHH HHHTIT6 DB ZZ
6、Z DDD DDD HHH HHHTIT7 DB ZZZ DDD DDD HHH HHHTIT8 DB ZZZ DDD DDD HHH HHHTIT9 DB ZZZ DDD DDDHHHHHHHHHHTIT10 DB ZZZ DDD DDDHHHHHHHHHHTIT11 DB ZZZ DDD DDD HHH HHH TIT12 DB ZZZ DDD DDD HHH HHH TIT13 DB ZZZ DDD DDD HHH HHH TIT14 DB ZZZ DDD DDD HHH HHH TIT15 DB ZZZ DDD DDD HHH HHH TIT16 DB ZZZZZZZZZZZZZZZ
7、DDDDDDDDDDHHH HHHTIT17 DB ZZZZZZZZZZZZZZZ DDDDDDDD HHH HHH;*.CODEMAIN PROC FAR MOV AX , DATA MOV DS , AXSTART: MOV AH , 00 MOV AL , 12H INT 10H ;设置图形模式640*480 CALL SHOW_TITLE ;显示LOGO CALL SHOW_START_MSG ;显示开始提示信息 MOV AH , 00H INT 16H ;等待按键 CMP AH , QUIT JZ DOS ;ESC则退出,否则进入游戏GAME_START:MOV AH , 00;设置
8、图形模式320*200,游戏在此模式下运行 MOV AL , 13H INT 10H MOV CL , 10 ;边框颜色 MOV SI , 59 MOV BX , 19 MOV DI , 260 MOV DX , 170 CALL REC ;打印边框 CALL CLEAR_AREA ;游戏区域清空(效果) CALL INIT_SNAKE ;初始化蛇 CALL GETFOOD ;得到第一个食物 CALL RUN_SNAKE ;开始运动蛇EXIT: MOV DX , 0C0FH ;设置光标 CALL SETGB MOV BL , FLASH ;显示游戏结束 LEA BP , MSG3 MOV CX
9、 , 11 CALL MSG MOV DX , 1605H MOV BL , WHITE ;显示提示信息 LEA BP , MSG5 MOV CX , 29 CALL MSGEXIT_LOOP: MOV AH , 00H INT 16H ;等待按键 CMP AH , QUIT JZ START CMP AH , SPACE JZ GAME_START JMP EXIT_LOOP ;返回开始DOS: MOV AH , 00 MOV AL , 03 INT 10H ;设置文本模式 MOV AH , 4CH INT 21H ;退出到DOSMAIN ENDP;*;函数名: SHOW_START_MSG
10、;功能: 显示开始提示信息;传递参数: ;函数返回: 空;*SHOW_START_MSG PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV DX , 190CH ;设置光标 CALL SETGB MOV BL , WHITE LEA BP , MSG2 ;显示作者信息 MOV CX , 54 CALL MSG ;显示字符串 MOV DX , 1616H ;设置光标 CALL SETGB MOV BL , 0A8H LEA BP , MSG4 ;显示提示信息 MOV CX , 36 CALL MSG ;显示字符串 POP
11、DI POP SI POP DX POP CX POP BX POP AX RETSHOW_START_MSG ENDP;*;函数名: CUTSNAKE;功能: 显示蛇一段;传递参数: ; SI/DI 游戏空间行/游戏空间列(50*50);函数返回: 空;*CUTSNAKE PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV CL , SNAKE_COLOR;置颜色 MOV AX,DI;取坐标值 MUL CUT_Y;乘每格长 ADD AX,TOPLINE ;加上边界 MOV BX , AX ADD AX , 2 MOV D
12、X , AX PUSH BX PUSH DX MOV AX,SI;取坐标值 MUL CUT_X;乘每格宽 ADD AX,LEFTLINE ;加左边界 MOV SI , AX ADD AX , 3 MOV DI , AX POP DX POP BX CALL REC ;REC的参数是CL颜色 SI左边 BX上边 DI右边 DX下边 POP DI POP SI POP DX POP CX POP BX POP AX RETCUTSNAKE ENDP;*;函数名: CUTFOOD;功能: 显示食物;传递参数: ; SI/DI 游戏空间行/游戏空间列(50*50);函数返回: 空;*CUTFOOD P
13、ROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV CL , FOOD_COLOR ;置颜色 MOV AX,DI;取坐标值 MUL CUT_Y;乘每格长 ADD AX,TOPLINE ;加上边界 MOV BX , AX ADD AX , 2 MOV DX , AX PUSH BX PUSH DX MOV AX,SI;取坐标值 MUL CUT_X;乘每格宽 ADD AX,LEFTLINE ;加左边界 MOV SI , AX ADD AX , 3 MOV DI , AX POP DX POP BX CALL REC ;REC的参
14、数是CL颜色 SI左边 BX上边 DI右边 DX下边 POP DI POP SI POP DX POP CX POP BX POP AX RETCUTFOOD ENDP;*;函数名: CLEARCUT;功能: 清除格;传递参数: ; SI/DI 游戏空间行/游戏空间列(50*50);函数返回: 空;*CLEARCUT PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV CL, 0 ;置颜色(黑) MOV AX,DI ;取坐标值 MUL CUT_Y ;乘每格长 ADD AX,TOPLINE ;加上边界 MOV BX , AX
15、 ADD AX , 2 MOV DX , AX PUSH BX PUSH DX MOV AX,SI;取坐标值 MUL CUT_X;乘每格宽 ADD AX,LEFTLINE ;加左边界 MOV SI , AX ADD AX , 3 MOV DI , AX POP DX POP BX CALL REC POP DI POP SI POP DX POP CX POP BX POP AX RETCLEARCUT ENDP;*;函数名: RAND ;功能: 产生指定范围大小的随机数;传递参数: ; SI 数字的范围最大值+1 ;函数返回: AX 返回随机数的值;*RAND PROC PUSH BX PU
16、SH CX PUSH DX PUSH SI PUSH DI STI MOV AH,0 ;读时钟计数器值 INT 1AH MOV AX , SEED ADD AX , DX AND AX , 8FFFH MOV SEED , AX ;产生新种子 MOV DX , 0 MOV BX , SI ;指定随机数的范围 DIV BX MOV AX , DX POP DI POP SI POP DX POP CX POP BX RETRAND ENDP;*;函数名: GETFOOD ;功能: 产生新食物,即随机产生一组49*49的坐标;传递参数: ; ;函数返回: FOODX与FOODY的值;*GETFOO
17、D PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV SI,50;置随机数范围(最大值+1) CALL RAND ;产生随机数 MOV FOODX,AX ;赋予食物坐标X MOV SI,50;置随机数范围(最大值+1) CALL RAND ;产生随机数 MOV FOODY,AX ;赋予食物坐标Y MOV SI,FOODX MOV DI,FOODY CALL CUTFOOD ;画食物 POP DI POP SI POP DX POP CX POP BX POP AX RETGETFOOD ENDP;*;函数名: DELAY;功能:
18、延时;传递参数: ;函数返回: ;*DELAY PROC PUSH AX PUSH CX MOV AX , 0AH SUB AX , CX MOV CX , AXM3_1: PUSH CX ;外层循环来控制延时速度 MOV CX , 5000 M3_2: IN AL , 61H ;读8255A的B口 AND AL , 10H CMP AL , AH JE M3_1 MOV AH , AL LOOP M3_2 POP CX LOOP M3_1 POP CX POP AX RETDELAY ENDP;*;函数名: CHECK_KEY;功能: 处理键盘响应;传递参数: 无;函数返回: DIRECTI
19、ON的值,GAMEOVER的值(按ESC时);*CHECK_KEY PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV AH , 01H INT 16H JZ CHECK_NOKEY ;如果没有按键就继续 MOV AH , 00H ;取得扫描码 INT 16H CMP AH , LEFT ;往左移动 JZ CHECK_LEFT CMP AH , RIGHT ;往右移动 JZ CHECK_RIGHT CMP AH , UP;往上移动 JZ CHECK_UP CMP AH , DOWN ;往下移动 JZ CHECK_DOWN CMP A
20、H , QUIT ;结束游戏 JZ CHECK_QUIT JMP CHECK_NOKEYCHECK_LEFT: MOV AH , -1 ;(-1,0) MOV AL , 0 MOV BX , AX ;检查是否反向 ADD BX , DIRECTION JZ CHECK_NOKEY MOV DIRECTION , AX JMP CHECK_NOKEYCHECK_RIGHT: MOV AH , 1 ;(1,0) MOV AL , 0 MOV BX , AX ;检查是否反向 ADD BX , DIRECTION JZ CHECK_NOKEY MOV DIRECTION , AX JMP CHECK_
21、NOKEYCHECK_UP: MOV AH , 0 ;(0,-1) MOV AL , -1 MOV BX , DIRECTION ;检查是否反向 SUB BL , 1 JZ CHECK_NOKEY MOV DIRECTION , AX JMP CHECK_NOKEYCHECK_DOWN:MOV AH , 0 ;(0,1) MOV AL , 1 MOV BX , DIRECTION ;检查是否反向 ADD BL , 1 JZ CHECK_NOKEY MOV DIRECTION , AX JMP CHECK_NOKEYCHECK_QUIT:JMP CHECK_EXIT CHECK_EXIT:MOV
22、 AL,1 ;按下ESC键的情况 MOV GAMEOVER,ALCHECK_NOKEY: POP DI POP SI POP DX POP CX POP BX POP AX RETCHECK_KEY ENDP;*;函数名: CHECK_DIE;功能: 处理死亡的响应;传递参数: SI,DI为当前蛇头部的坐标;函数返回: 蛇参数的值;*CHECK_DIE PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI CMP SI , 50 ;检查是否到达边界 JZ DEAD CMP SI , 255 JZ DEAD CMP DI , 50 JZ DEAD CMP DI , 255 JZ DEAD MOV AX,SI;检查是否接触蛇身 MOV DH,AL;DX中获得当前坐标 MOV AX,DI