汇编贪吃蛇实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言与接口课程实验报告
实验编号__________实验六______________
实验名称__________贪吃蛇程序__________
实验室名称________软件机房____________
班级______________软件93______________
学号______________*******___________
姓名_______________*******_____________
实验日期___2011__年___06__月___15___日
评分教师实验报告成绩__________ 评分日期________年_______月________日
软件学院汇编与接口综合实验选题表
一、实验目的:
熟练掌握汇编的各种指令,综合运用汇编的各种指令编写一个贪吃蛇程序。在贪吃蛇程序的编写过程中深刻理解汇编语言,深刻理解汇编语言与其他语言的不同。
二、实验环境
Masm for Windows集成环境2011。
三、实验内容
1、回顾书中关于汇编语言的基础知识,利用彩色图形程序设计、发声系统的程序设计的知识,实现贪吃蛇的可视化及声音。
2、实验思路:
贪吃蛇程序,利用不同的颜色形状的字符分别表示贪吃蛇蛇身,食物,以及障碍物。
在dos界面下,有25行80列,第0行设置游戏进行的分数及关卡信息,在1~24行为蛇的活动范围。
游戏设置4关,过三关游戏及通关成功。否则挑战失败,可以重新挑战或者退出。
因为此贪吃蛇程序是利用字符完成的,所以始终要对指定的行和指定的列进行读、写字符操作。所以在程序开始以前编写read和write宏命令是非常必要的。
贪吃蛇移动的过程中,方向是随时可能改变的,所以这里就利用的中断。把9号中断向量给重新定义为:把键盘读紧的字符都存放在adrs中,再判断adrs是不是指定的上下左右键。
蛇的移动过程始终伴随有各种的判断过程,首先判断是否进入下一个关卡,如果是则进入下一关,如果不是则继续判断蛇是否撞到自身、墙壁、障碍物。如果是则游戏挑战失败,如果不是则进入判断是否是食物的过程。这三个判断的方法都是一样的,即:通过蛇头所在的行dh,所在的列dl,以及蛇此时的前进方向addrs来判断蛇头字符前方的字符是什么,从而得出判断结果。
蛇的行走过程的实现:程序主干循环snake_run循环一次蛇走一步,蛇在不吃食物的行走过程的实现是根据蛇头所在的行dh,所在的列dl,以及蛇此时的前进方向addrs,将蛇头前方的位置变为蛇身,再利用蛇尾两节的特殊性,将蛇尾变为空,蛇尾第二节变为第一节,蛇尾第三节变为第二节。蛇吃食物加一的过程,只是在上诉过程中再,将蛇尾最后两节变为原来的三节。这样就实现了整个行走过程。
贪吃蛇设计思路如框图所示:
四、源程序清单、测试数据、运行结果(1)源程序清单
DATAS SEGMENT
;此处输入数据段代码
dw 0,0
snk db 1 ;蛇身的字符
snake_tail2 db 2 ;蛇倒数第二节的字符
food db 3 ;食物的字符
snake_tail db 4 ;蛇尾巴的字符
door_shape db 8 ;门的字符
squ db 9 ;障碍的字符
big_food db 15 ;大食物的字符
blank_space db 32 ;空字符
adrs db 5 ;读取的键盘数码
snake_length db?;蛇长
level db?;关卡
level_up_score db 4 ;过关条件
character db?;读取的字符
addrs dw?;蛇运动的方向
food_row db?;食物所在的行
food_column db?;食物所在列
hwrt db?
gmov db'game over press r to restart press q to quit $';初始化信息
suc_msg db' You are successful going over all zhe levels $'
suc_msg1 db' Please press q to quit $'
score_msg db'score :$'
score1 db 48 ;分数
score2 db 48
writer db'Developer: Ge Lingjia $'
ID db'ID: 09161047 $';第一行信息
level_msg db'level: $'
msg1 db'The way to play the game:$'
way db' press w to up ,press s to down,press a to left,press d to right$' msg db'Press any key(except a,s,d,w) to start$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
db 200 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ax,0
mov es,ax
;******************************************** ;清屏
clean_p macro
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,10
int 10h
endm
;******************************************* ;游戏第一行界面
firstrow macro
mov dh,0