基于汇编的贪食蛇游戏.docx

上传人:b****5 文档编号:8009771 上传时间:2023-01-27 格式:DOCX 页数:37 大小:1.67MB
下载 相关 举报
基于汇编的贪食蛇游戏.docx_第1页
第1页 / 共37页
基于汇编的贪食蛇游戏.docx_第2页
第2页 / 共37页
基于汇编的贪食蛇游戏.docx_第3页
第3页 / 共37页
基于汇编的贪食蛇游戏.docx_第4页
第4页 / 共37页
基于汇编的贪食蛇游戏.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

基于汇编的贪食蛇游戏.docx

《基于汇编的贪食蛇游戏.docx》由会员分享,可在线阅读,更多相关《基于汇编的贪食蛇游戏.docx(37页珍藏版)》请在冰豆网上搜索。

基于汇编的贪食蛇游戏.docx

基于汇编的贪食蛇游戏

一、实验目的

本次实验是汇编语言与接口技术这门课程的综合试验。

目的是熟练掌握并能综合应用所学的汇编语言与接口技术,同时也熟悉了汇编语言的程序的调试方法,发现并纠正了平时编写汇编程序时一些不好的习惯,养成了较好的编程习惯,同时在实践中加深对这门课程的理解,也为后面进一步的学习以及实验打下扎实的基础。

二、实验环境

MasmforWindows集成实验环境。

三、实验内容

用所学的汇编语言与接口技术的知识,用汇编语言编写一贪

食蛇的游戏。

实验要求:

贪吃蛇能正常运动;

贪吃蛇能够有指定的四个方向键控制方向;

贪吃蛇吃掉豆子能自动加分;

贪吃蛇能够在碰到边界死亡;

其余可以根据自己的想法扩展功能;

四、实验步骤与调试方法

程序初始化部分:

在数据段定义好相关的提示信息以及储存蛇身的数组,主要有游戏之前的提示信息,游戏之中的相关输出信息,例如得分等。

画点部分:

屏幕显示采用320*200的图形16色显示模式,点的画出采用写像素的方式,每个点占用4*3像素。

同蛇移动程序:

采用不断刷屏的方式,通过延迟,程序没执行一次,蛇便会在相应的方向往前移动一个格。

此时可以通过记录蛇头位置并重画擦屏的方式显示出蛇身的新位置。

蛇的位置重置:

由于蛇是不断运动的,此时可以采用将新的蛇身的位置覆盖原先的数组。

随即豆的产生:

利用系统时间的变化,根据秒和百分之一秒的部分,此时可以通过一系列运算产生在要求范围内的的随机数,此时的随机数便是随即点,可以通过产生的随即点的坐标画出随即点。

蛇吃食物:

当蛇头的位置可以与随即点的位置坐标判断,如果此时两点的坐标是相同的,那么便可以将此时的食物点加到蛇头位置上。

判断游戏结束的条件:

当蛇的头部位置到达边界或者蛇头的位置与自身相重合,那么变产生结束的条件了。

五、源程序清单、测试数据、运行结果

.modelsmall

.stack200

.data

Lendb?

;蛇的长度

Bodydw200dup(0);蛇的身体位置

Directiondw256

Scoredb'Score00000';得分

snake_colordb0ah;蛇颜色

food_colordb0ch;食物色

speeddb0;速度

gameoverdb0;游戏结束标记

Pointdb0;得分数

foodXdw?

;食物坐标

foodYdw?

seeddw2;随即数种子

;******************************************************************************************

;显示方面的参数

toplinedw20;上边界

leftlinedw60;左边界

cut_xdw4;每格宽

cut_ydw3;每格长

max_xdw49;最大格数(横)

max_ydw49;最大格数(纵)

msg1db'GreedySnakes'

msg2db'by:

tangxing'

msg3db'Gameisover!

'

msg4db'Pressanykeyforstart!

Escforexit'

msg5db'ESCforback,Spaceforretry'

msg6db'pressspaceforpause/continue'

msg7db''

title1db6dup(20h),5dup(0dch),5dup(20h),5dup(0dch),5dup(20h)

title2db6dup(20h),0dbh,3dup(20h),0dbh,5dup(20h),0dbh,3dup(20h),0dbh,5dup(20h)

title3db6dup(20h),0dbh,3dup(20h),0dbh,5dup(20h),0dbh,3dup(20h),0dbh,5dup(20h)

title4db7dup(0dfh),3dup(20h),7dup(0dfh),3dup(20h),5dup(0dfh),0fdh

yellodb0eh

greendb02h

whitedb0fh

bluedb01h

;******************************************************************************************

;键盘扫描码

LEFTEQU4Bh

RIGHTEQU4Dh

UPEQU48h

DOWNEQU50h

QUITEQU01h

SPACEEQU39h

.code

mainprocfar

movax,@data

movds,ax

start:

movah,00

moval,12h

int10h;设置图形模式640*480

callshow_start_msg;显示开始提示信息

callshow_title

movah,00h

int16h;等待按键

cmpah,QUIT

jzdos;ESC则退出,否则进入游戏

game_start:

movah,00;设置图形模式320*200,游戏在此模式下运行

moval,13h

int10h

movcl,7;边框颜色

movsi,59

movbx,19

movdi,260

movdx,170

callrec;打印边框

callclear_area;游戏区域清空(效果)

callInit_snake;初始化蛇

callgetfood;得到第一个食物

callrun_snake;开始运动蛇

exit:

movdx,1010h;设置光标

callSetGb;设置光标位置

movbl,white;显示死亡信息

leabp,msg3

movcx,13

callMsg;显示字符串

movdx,1605h

movbl,white;显示提示信息

leabp,msg5

movcx,29

callMsg

exit_loop:

movah,00h

int16h;等待按键

cmpah,QUIT

jzstart

cmpah,SPACE

jzgame_start

jmpexit_loop;返回开始

dos:

movah,00

moval,03

int10h;设置文本模式

movah,4ch

int21h;退出到DOS

mainendp

;******************************************************************************************

;函数名:

SetGb

;功能:

设置光标位置

;传递参数:

dh/dl行/列

;******************************************************************************************

SetGbprocnear

pushax

pushbx

movbh,0

movah,02h

int10h

popbx

popax

ret

SetGbendp

;******************************************************************************************

;函数名:

Msg

;功能:

输出字符串

;传递参数:

;bl颜色号(BLRGBIRGB)

;bp字符串偏移地址

;cx字符串长度

;dh/dl行/列

;******************************************************************************************

Msgprocnear

pushax

pushbx

pushes

pushds

popes;将数据段ds送es

moval,0

movah,13h

movbh,0

int10h

popes

popbx

popax

ret

Msgendp

;******************************************************************************************

;函数名:

show_title

;功能:

显示开始提示信息

;******************************************************************************************

show_titleprocnear

pushax

pushbx

pushcx

pushdx

movdl,10h

movcx,10h

yidong:

pushcx

decdl

movdh,0fh

callSetGb

moval,020h

movah,0eh

int10h

incdl

movdh,0ch

callSetGb

movbl,yello

leabp,title1

movcx,26

callMsg

movdh,0dh

callSetGb

movbl,yello

leabp,title2

movcx,26

callMsg

movdh,0eh

callSetGb

movbl,yello

leabp,title3

movcx,26

callMsg

movdh,0fh

callSetGb

movbl,yello

leabp,title4

movcx,26

callMsg

calldelay

incdl

popcx

callshow_start_msg

loopyidong

movah,0ch

moval,0

int21h

popdx

popcx

popbx

popax

ret

show_titleendp

;******************************************************************************************

;函数名:

show_start_msg

;功能:

显示开始提示信息

;******************************************************************************************

show_start_msgprocnear

pushax

pushbx

pushcx

pushdx

movdx,1426h

callSetGb

movbl,0a1h

leabp,msg1

movcx,12

callMsg

movdx,190bh

callSetGb;设置光标

movbl,08h

leabp,msg2;显示作者信息

movcx,11

callMsg;显示字符串

movdx,1619h;设置光标

callSetGb

movbl,white

leabp,msg4;显示提示信息

movcx,37

callMsg;显示字符串

popdx

popcx

popbx

popax

ret

show_start_msgendp

;******************************************************************************************

;函数名:

cutsnake

;功能:

显示蛇的一格

;传递参数:

;si/di游戏空间列/游戏空间行(50*50)

;******************************************************************************************

cutsnakeprocnear

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

movcl,snake_color;置颜色

movax,di;取坐标值

mulcut_y;乘象素值

addax,topline;加上边界

movbx,ax

addax,2

movdx,ax

pushbx

pushdx

movax,si;取坐标值

mulcut_x;乘象素值

addax,leftline;加上边界

movsi,ax

addax,3

movdi,ax

popdx

popbx

callRec;Rec的参数是cl颜色si左边bx上边di右边dx下边

popdi

popsi

popdx

popcx

popbx

popax

ret

cutsnakeendp

;******************************************************************************************

;函数名:

cutfood

;功能:

显示食物

;传递参数:

;si/di游戏空间列/游戏空间行(50*50)

;函数返回:

;******************************************************************************************

cutfoodprocnear

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

movcl,food_color;置颜色

movax,di;取坐标值

mulcut_y;乘象素值

addax,topline;加上边界

movbx,ax

addax,2

movdx,ax

pushbx

pushdx

movax,si;取坐标值

mulcut_x;乘象素值

addax,leftline;加上边界

movsi,ax

addax,3

movdi,ax

popdx

popbx

callRec;Rec的参数是cl颜色si左边bx上边di右边dx下边

popdi

popsi

popdx

popcx

popbx

popax

ret

cutfoodendp

;******************************************************************************************

;函数名:

clearcut

;功能:

清除格

;传递参数:

;si/di游戏空间列/游戏空间行(50*50)

;函数返回:

;******************************************************************************************

clearcutprocnear

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

movcl,0;置颜色(黑)

movax,di;取坐标值

mulcut_y;乘象素值

addax,topline;加上边界

movbx,ax

addax,2

movdx,ax

pushbx

pushdx

movax,si;取坐标值

mulcut_x;乘象素值

addax,leftline;加上边界

movsi,ax

addax,3

movdi,ax

popdx

popbx

callRec;Rec的参数是cl颜色si左边bx上边di右边dx下边

popdi

popsi

popdx

popcx

popbx

popax

ret

clearcutendp

;******************************************************************************************

;函数名:

Rand

;功能:

产生指定范围大小的随机数

;传递参数:

si数字的范围最大值+1

;函数返回:

ax返回随机数的值

;******************************************************************************************

Randproc

pushbx

pushcx

pushdx

pushsi

movah,2ch

int21h

movax,dx

movdx,0

movbx,si;指定随机数的范围

divbx

movax,dx

popsi

popdx

popcx

popbx

ret

Randendp

;******************************************************************************************

;函数名:

getfood

;功能:

产生新食物,即随机产生一组49*49的坐标

;函数返回:

foodx与foody的值

;******************************************************************************************

getfoodproc

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

M1:

movsi,50;置随机数范围(最大值+1)

callRand;产生随机数

movfoodx,ax;赋予食物坐标x

movsi,50;置随机数范围(最大值+1)

callRand;产生随机数

movfoody,ax;赋予食物坐标y

movsi,foodx

movdi,foody

movax,di;取坐标值

mulcut_y;乘象素值

addax,topline

movdx,ax

pushdx

movax,si;取坐标值

mulcut_x;乘象素值

addax,leftline

movcx,ax

popdx

movah,0dh

movbh,0

int10h

cmpal,snake_color

jzM1

callcutfood;画食物

popdi

popsi

popdx

popcx

popbx

popax

ret

getfoodendp

;******************************************************************************************

;函数名:

Delay

;功能:

延时

;******************************************************************************************

Delayproc

pushax

pushbx

pushcx

pushdx

movcx,33144

waitf:

inal,61h

andal,10h

cmpal,ah

jewaitf

movah,al

loopwaitf

popdx

popcx

popbx

popax

ret

Delayendp

;******************************************************************************************

;函数名:

Check_key

;功能:

处理键盘响应

;函数返回:

Direction的值,gameover的值(按ESC时)

;******************************************************************************************

Check_keyproc

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

movah,01h

int16h

jzcheck_nokey;如果没有按键就继续

movah,0;取得扫描码

int16h

pushax

cmpah,SPACE

jnzS2

S1:

movah,0

int16h

cmpah,SPACE

jnzS1

S2:

popax

cmpah,LEFT;往左移动

jzcheck_LEFT

cmpah,RIGHT;往右边移动

jzcheck_RIGHT

cmpah,UP;往上移动

jzcheck_UP

cmpah,DOWN;往下移动

jzcheck_DOWN

cmpah,QUIT;结束游戏

jzcheck_QUIT

jmpcheck_nokey

check_LEFT:

movah,-1;(-1,0)

moval,0

movbx,ax;检查是否反向

addbx,Direction

jzcheck_nokey

movDirection,ax

jmpcheck_nokey

check_RIGHT:

movah,1;(1,0)

moval,0

movbx,ax;检查是否反向

addbx,Direction

jzcheck_nokey

movDirection,ax

jmpcheck_nokey

check_UP:

movah,0;(0,-1)

moval,-1

movbx,Direction;检查是否反向

subbl,1

jzcheck_nokey

movDirection

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1