《汇编贪吃蛇实验报告》由会员分享,可在线阅读,更多相关《汇编贪吃蛇实验报告(60页珍藏版)》请在金锄头文库上搜索。
1、0一、实验目的:一、实验目的:熟练掌握汇编的各种指令,综合运用汇编的各种指令编写一个贪吃蛇程序。在贪吃蛇程序的编写过程中深刻理解汇编语言,深刻理解汇编语言与其他语言的不同。二、实验环境二、实验环境Masm for Windows 集成环境 2011。三、实验内容三、实验内容1、回顾书中关于汇编语言的基础知识,利用彩色图形程序设计、发声系统的程序设计的知识,实现贪吃蛇的可视化及声音。2、实验思路:贪吃蛇程序,利用不同的颜色形状的字符分别表示贪吃蛇蛇身,食物,以及障碍物。在 dos 界面下,有 25 行 80 列,第 0 行设置游戏进行的分数及关卡信息,在 124 行为蛇的活动范围。游戏设置 4
2、关,过三关游戏及通关成功。否则挑战失败,可以重新挑战或者退出。因为此贪吃蛇程序是利用字符完成的,所以始终要对指定的行和指定的列进行读、写字符操作。所以在程序开始以前编写 read和 write 宏命令是非常必要的。贪吃蛇移动的过程中,方向是随时可能改变的,所以这里就利用的中断。把 9 号中断向量给重新定义为:把键盘读紧的字符都1存放在 adrs 中,再判断 adrs 是不是指定的上下左右键。蛇的移动过程始终伴随有各种的判断过程,首先判断是否进入下一个关卡,如果是则进入下一关,如果不是则继续判断蛇是否撞到自身、墙壁、障碍物。如果是则游戏挑战失败,如果不是则进入判断是否是食物的过程。这三个判断的方
3、法都是一样的,即:通过蛇头所在的行 dh,所在的列 dl,以及蛇此时的前进方向 addrs 来判断蛇头字符前方的字符是什么,从而得出判断结果。蛇的行走过程的实现:程序主干循环 snake_run 循环一次蛇走一步,蛇在不吃食物的行走过程的实现是根据蛇头所在的行 dh,所在的列 dl,以及蛇此时的前进方向 addrs,将蛇头前方的位置变为蛇身,再利用蛇尾两节的特殊性,将蛇尾变为空,蛇尾第二节变为第一节,蛇尾第三节变为第二节。蛇吃食物加一的过程,只是在上诉过程中再,将蛇尾最后两节变为原来的三节。这样就实现了整个行走过程。贪吃蛇设计思路如框图所示:2QNNNYYRStart游戏初 始说明任意输入刷新
4、屏幕 产生新蛇, 初始化分数 (第一关) 产生障碍Y进入关卡?挑战结束输入重新 挑 战游戏结束N撞墙,撞自己?N吃食物?最后 一关NScore+1 Length+1 产生食物Length=4产生关卡门Run3四、源程序清单、测试数据、运行结果四、源程序清单、测试数据、运行结果(1)源程序清单DATAS SEGMENT;此处输入数据段代码 dw 0,0snk db 1 ;蛇身的字符snake_tail2 db 2 ;蛇倒数第二节的字符food db 3 ;食物的字符snake_tail db 4 ;蛇尾巴的字符door_shape db 8 ;门的字符squ db 9 ;障碍的字符big_foo
5、d 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 ? 4gmov db game over press r to restart press q to quit $ ;初始化信息suc_msg db You are successful
6、 going over all zhe levels $suc_msg1 db Please press q to quit $score_msg db score :$score1 db 48 ;分数score2 db 48writer 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$m
7、sg db Press any key(except a,s,d,w) to start$DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码db 200 dup(0)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS5START:MOV AX,DATASMOV DS,AX;此处输入代码段代码mov ax,0mov es,ax;*;清屏clean_p macro mov ah,6mov al,0mov ch,0mov cl,0mov dh,24mov dl,79mov bh,10int 10hendm;*;游戏第
8、一行界面firstrow macro mov dh,06mov dl,0mov ah,2mov bh,0int 10hmov ah,9lea dx,score_msgint 21hmov dl,15mov ah,2mov bh,0int 10hmov ah,9lea dx,writerint 21hmov ah,9lea dx,IDint 21hmov ah,9lea dx,level_msgint 21hendm;*7;宏定义用于向当前光标处输出字符write macro row,col,cnt,color push bxpush cxpush dxmov dh,rowmov dl,colm
9、ov ah,2mov bh,0int 10hmov ah,9mov bl,colormov cx,1lea di,cnt mov al,diint 10hpop op cxpop bxendm;*;用于读出当前光标处字符的宏定义 8read macro row,col push ush axpush bxmov dh,rowmov dl,colmov ah,2mov bh,0int 10hmov ah,08hint 10hmov character,alpop bxpop axpop dxendm;*;宏定义只用在readcg宏中当readcg的所有判断都不成立调用此宏wnear macro
10、local wnext1local wnext2local wnext39local wnext4push dxdec dhread dh,dlcmp character,1jne wnext1write dh,dl,snake_tail2,9jmp wnext4wnext1:inc dhdec dlread dh,dlcmp character,1jne wnext2write dh,dl,snake_tail2,9jmp wnext4wnext2:inc dhinc dlread dh,dlcmp character,1jne wnext310write dh,dl,snake_tail2
11、,9jmp wnext4wnext3:dec dhinc dlread dh,dlcmp character,1jne wnext4write dh,dl,snake_tail2,9wnext4:pop dxendm;*;宏定义用于改变判断出来的字符 row,col是倒数第二节蛇的行和列;实际就是实现蛇的前进过程readcg macro row,col local turn_up,turn_up1,turn_up2,turn_left,turn_left1,turn_left2,turn_down,turn_down1,turn_down2,turn_right,turn_right1,tur
12、n_right2,gooutpush bxpush axpush dx11write dh,dl,snake_tail,9 ;倒数第二节蛇,变为最后一节 dec rowread dh,dlcmp character,4jne turn_up1jmp turn_up2turn_up1:jmp turn_upturn_up2:write dh,dl,blank_space,0 ;最后一节变为0inc dhinc dhread dh,dlcmp character,1jne turn_upwrite dh,dl,snake_tail2,9 ;向上倒数第三节变为倒数第二节jmp near ptr go
13、outturn_up:pop ush dxdec colread dh,dl12cmp character,4jne turn_left1jmp turn_left2turn_left1:jmp near ptr turn_leftturn_left2:write dh,dl,blank_space,0inc dlinc dlread dh,dlcmp character,1jne turn_leftwrite dh,dl,snake_tail2,9jmp near ptr gooutturn_left:pop ush dxinc rowread dh,dlcmp character,4jne
14、 turn_down1jmp turn_down213turn_down1:jmp near ptr turn_downturn_down2:write dh,dl,blank_space,0dec dhdec dhread dh,dlcmp character,1jne turn_downwrite dh,dl,snake_tail2,9jmp near ptr gooutturn_down:pop ush dxinc colread dh,dlcmp character,4jne turn_right1jmp turn_right2turn_right1:jmp near ptr turn_rightturn_right2:14write dh,dl,blan