贪食蛇汇编版.docx
- 文档编号:8939270
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:39
- 大小:22.01KB
贪食蛇汇编版.docx
《贪食蛇汇编版.docx》由会员分享,可在线阅读,更多相关《贪食蛇汇编版.docx(39页珍藏版)》请在冰点文库上搜索。
贪食蛇汇编版
assumecs:
Code,ds:
Data,ss:
Stack
Datasegment
COLORWequ7h;颜色常量设置为白色00000111b
COLORBequ0h;黑色00000000b
COLORRequ4h;红色00000100b
COLORGequ2h;绿色00000010b
WCOLORequ71h;边框颜色属性,白底蓝字01110001b
szOverdb'**gameover!
=.=**',0
szLeveldb'level:
1',0
szScoredb'scores:
0',0
szOwnerdb'ChildlikeGan',0
szVersiondb'Version2.0',0
szNamedb'SnakeGame',0
szDatedb'2012.5.17',0
szArray0db0DH,0AH,'----------------------------',0DH,0AH,'$'
szArray1db0DH,0AH,'Controlkey:
',0DH,0AH,'$'
szArray2db0DH,0AH,'Left:
Arrowontheleft','$'
szArray3db0DH,0AH,'Right:
Arrowontheright','$'
szArray4db0DH,0AH,'Up:
Arrowontheup','$'
szArray5db0DH,0AH,'Down:
Arrowontheleft','$'
szArray6db0DH,0AH,'Beginthegameornot?
',0DH,0AH,'$'
szArray7db0DH,0AH,'y:
begin,n:
exit',0DH,0AH,'$'
szArray8db0DH,0AH,'inputerror!
',0DH,0AH,'pleaseselectyorn!
',0DH,0AH,'$'
szArray9db0DH,0AH,'Beginthegameagainornot?
',0DH,0AH,'$'
szArrayadb0DH,0AH,'Stop:
F1','$'
szArraybdb0DH,0AH,'Continue:
F2','$'
szArraycdb0DH,0AH,'Exit:
F10',0DH,0AH,'$'
szArrayddb0DH,0AH,'Anykeytocontinue!
',0DH,0AH,'$'
bColordb?
;存放当前蛇的颜色属性
bDirectiondb?
;存放当前蛇的前进方向
bFoodLocationdb?
?
;存放当前食物行列数
bSnakeLendb?
;存放蛇节数
bLeveldw0;存放游戏级数
bScoredw0;存放游戏得分
bScoreBufdb8dup(?
);存放得分字符串缓冲区
bLevelBufdb8dup(?
);存放级数字符串缓冲区
bSnakedb160dup(?
);蛇的每一节所在的地址(行列),蛇最大节数80节
Dataends
Stacksegment
dw32dup(?
);栈段
Stackends
Codesegment
start:
mainproc
movax,Data
movds,ax
movax,Stack
movss,ax
movsp,20h;初始化段寄存器
movax,3h
int10h;读取光标位置
movah,9h;游戏界面
movdx,offsetszArray0
int21h
movah,9h
movdx,offsetszArray1
int21h
movah,9h
movdx,offsetszArray2
int21h
movah,9h
movdx,offsetszArray3
int21h
movah,9h
movdx,offsetszArray4
int21h
movah,9h
movdx,offsetszArray5
int21h
movah,9h
movdx,offsetszArraya
int21h
movah,9h
movdx,offsetszArrayb
int21h
movah,9h
movdx,offsetszArrayc
int21h
movah,9h
movdx,offsetszArray0
int21h
movah,9h
movdx,offsetszArrayd
int21h
movcx,3h
moval,0h
movah,01h
int21h;21号中断例程的11号子程序实时判断键盘输入,结果返回al
cmpal,0h
jnbagain
press:
movdi,8000h
callDelay
looppress
again:
;容错机制,当输入非y和非n键时提示重新输入
movax,3h
int10h;读取光标位置
movah,9h
movdx,offsetszArray0
int21h
movah,9h
movdx,offsetszArray6
int21h
movah,9h
movdx,offsetszArray7
int21h
movah,9h
movdx,offsetszArray0
int21h
movah,1h
int21h
cmpal,'y'
jzstar
cmpal,'n'
jzexit
movax,3h
int10h;读取光标位置
movah,9h
movdx,offsetszArray8
int21h
movdi,8000h
callDelay
movdi,8000h
callDelay
jmpagain
star:
callGameStar;开始进入游戏
exit:
movax,3h
int10h
movax,4c00h
int21h
ret
mainendp
GameStarproc;游戏主体函数,无参数、返回
movax,3h
int10h;读取光标位置
callShowWall
callShowLevelScore;初始化游戏界面
moval,COLORW
movbx,offsetbDirection
mov[bx],al
callShowInitSnake
callRandrow;初始化蛇和随机产生食物的行列值
snakeMove:
;实现蛇的运动(四个方向)
callShowRanFood;显示随机食物星形
callHideSnakeTail;删除蛇尾
callShowSnakeHead;显示蛇头
callRunSpeechLevel;级数函数,蛇长越长级数越高速率越快
callDelay;控制速率
moval,0h
movah,0bh
int21h;21号中断例程的11号子程序实时判断键盘输入,结果返回al
cmpal,0ffh
jz@f
jmpsnakeMove
@@:
moval,0
movah,7h
int21h;无回显的键盘输入,产生键盘扫描码并返回al
movbx,offsetbDirection
cmpal,4bh;4bh为左箭头的键盘扫描码
jzrunLeft
cmpal,4dh;4dh为右箭头的键盘扫描码
jzrunRight
cmpal,48h;48h为上箭头的键盘扫描码
jzrunUp
cmpal,50h;50h为下箭头的键盘扫描码
jzrunDown
cmpal,3bh;f1键暂停
jzGameStop
cmpal,44h;f10键退出
jzEndGame
jmpsnakeMove
GameStop:
moval,0
movah,7h
int21h
cmpal,3ch;f2键继续
jzsnakeMove
loopGameStop
runLeft:
movah,2h
cmp[bx],ah;禁止改变成相反方向,防止意外over
jzsnakeMove
moval,1h;改变bDirection中的值以改变运动方向
mov[bx],al
jmpsnakeMove
runRight:
movah,1h
cmp[bx],ah
jzsnakeMove
moval,2h
mov[bx],al
jmpsnakeMove
runUp:
movah,4h
cmp[bx],ah
jzsnakeMove
moval,3h
mov[bx],al
jmpsnakeMove
runDown:
movah,3h
cmp[bx],ah
jzsnakeMove
moval,4h
mov[bx],al
jmpsnakeMove
EndGame:
callGameOver
GameStarendp
Delayproc;延迟函数,空循环di*ffffh次,用于控制蛇的移动速度,参数di、返回
pushax
pushdx
movdx,di
movax,0
@@:
subax,1
sbbdx,0;(dx)=(dx)+0+cf
cmpax,0
jnz@b
cmpdx,0
jnz@b
popdx
popax
ret
Delayendp
Randrowproc;随机函数,用于得到食物的随机位置,无参数、返回到bFoodLocation
pushax
pushsi
pushdx
callSrandom
movax,dx
andah,00001111b;将ah高四位清零,以便进行除法运算避免溢出
movdl,21;将结果与22相除取余数得出2到23之间的随机数
divdl
addah,2
movsi,offsetbFoodLocation
mov[si],ah
callSrandom
movax,dx
andah,00001111b
movdl,56;将结果与58相除取余数得出2到58之间的随机数
divdl
addah,2
mov[si+1],ah
popdx
popsi
popax
ret
Randrowendp
Srandomproc;利用系统当前时间获取随机数(1a号中断),无参数、返回dx
pushax
pushcx
sti
movah,0h
int1ah;利用1a号中断例程产生时钟滴答计数得到大随机数cx:
dx
popcx
popax
ret
Srandomendp
HideSnakeTailproc;清除蛇尾,无参数、返回
pushdi
pushsi
pushcx
pushdx
movdi,2h
movdl,COLORB;黑色属性
movsi,offsetbColor
mov[si],dl;将蛇颜色属性置为黑,即删除蛇的最后一节
movsi,offsetbSnake
movdh,[si]
movdl,[si+1];将蛇的第一节(蛇尾)坐标放入dh,dl
callShowStar
movsi,offsetbSnakeLen
movch,0
movcl,[si]
deccx
addcx,cx
movsi,offsetbSnake
@@:
movdl,[si+2]
mov[si],dl
incsi
loop@b
popdx
popcx
popsi
popdi
ret
HideSnakeTailendp
ShowSnakeHeadproc;显示蛇头,无参数、返回di
pushax
pushbx
pushdi
pushcx
pushdx
pushsi
movdl,COLORG
movsi,offsetbColor
mov[si],dl;置颜色
movsi,offsetbDirection
movdl,[si];取得当前方向
movsi,offsetbSnakeLen
movah,0
moval,[si];取得当前蛇长
addax,ax
subax,4;蛇长bSnakeLen*2-4等于存放蛇头前一节的坐标的偏移地址
movsi,ax
addsi,offsetbSnake
movah,[si]
moval,[si+1];取得当前蛇头的前一节坐标
runDirection:
;对方向做出相应的动作
cmpdl,1
jzrunToLeft
cmpdl,2
jzrunToRight
cmpdl,3
jzrunToUp
cmpdl,4
jzrunToDown
runToLeft:
;对蛇头坐标做相应调整
decal
jmp@f
runToRight:
incal
jmp@f
runToUp:
decah
jmp@f
runToDown:
incah
jmp@f
@@:
mov[si+2h],ah;取得蛇当前头坐标
mov[si+3h],al
cmpah,0h;判断蛇头是否碰到边框
jzerror
cmpah,24
jzerror
cmpal,0h
jzerror
cmpal,60
jzerror
callSnakeBiteSelf;通过蛇头坐标与蛇身任一节坐标作比较判断
movbx,offsetbFoodLocation
movch,[bx];判断是否吃到食物
movcl,[bx+1]
cmpah,ch
jnz@f
cmpal,cl
jnz@f
addsi,2;经过食物星号,将bSnake偏移地址加2以便存放延伸一节后的蛇头坐标
callRandrow;更新随机食物星形坐标
movbx,offsetbSnakeLen
movcl,[bx];将蛇长度加1
inccl
mov[bx],cl
callShowScore;更新分数
callRunSpeechLevel;更新级数
callShowLevel
jmprunDirection
error:
callGameOver;蛇撞墙,游戏玩完!
@@:
movdh,ah
movdl,al
movdi,2h
callShowStar
popsi
popdx
popcx
popdi
popbx
popax
ret
ShowSnakeHeadendp
RunSpeechLevelproc;级数函数,级数越高速率越快,参数bSnakeLen,返回di,bLevel
pushax
movax,bScore
cmpax,10;判断当前蛇长度,以制定等级数
jnalevelOne
cmpax,20
jnalevelTwo
cmpax,30
jnalevelThree
cmpax,40
jnalevelFour
cmpax,60
jnalevelFive
movdi,700
movax,6;最快速率为500
movbLevel,ax
jmp@f
levelOne:
movdi,1000h
movax,1
movbLevel,ax
jmp@f
levelTwo:
movdi,950h
movax,2
movbLevel,ax
jmp@f
levelThree:
movdi,875h
movax,3
movbLevel,ax
jmp@f
levelFour:
movdi,800h
movax,4
movbLevel,ax
jmp@f
levelFive:
movdi,800h
movax,5
movbLevel,ax
jmp@f
@@:
popax
ret
RunSpeechLevelendp
SnakeBiteSelfproc;监测是否咬到自己,参数:
ah,al行列,无返回
pushax
pushcx
pushsi
movsi,offsetbSnakeLen
movch,0
movcl,byteptr[si]
subcl,3;将蛇长减去初始蛇长
movsi,offsetbSnake
biteBody:
jcxznoneJudge;判断蛇长为三节,是则直接跳到@@处不做其它判断
cmpah,[si];蛇头和第一节蛇体做比较
jnz@f
cmpal,[si+1]
jnz@f
callGameOver
@@:
;若不相等继续循环直至蛇头与非蛇头节全部比较玩
addsi,2;指向下一节蛇体
deccl
jmpbiteBody
noneJudge:
popsi
popcx
popax
ret
SnakeBiteSelfendp
ShowInitSnakeproc;初始化蛇体,参数di
pushdi
pushcx
pushdx
pushsi
movdi,2h
movdl,COLORG
movsi,offsetbColor
mov[si],dl
movdh,1
movdl,1
movsi,offsetbSnake
movcx,3
@@:
;在(1,1)处初始化3节小蛇
callShowStar
mov[si],dh
mov[si+1],dl
addsi,2
incdl
loop@b
movsi,offsetbSnakeLen
movdl,3;初始化蛇长度
movbyteptr[si],dl
movsi,offsetbDirection
movdl,2;初始化蛇方向
movbyteptr[si],dl
popsi
popdx
popcx
popdi
ret
ShowInitSnakeendp
ShowScoreproc;显示得分字符串,参数bwScore、bp,返回bScoreBuf
pushax
pushbx
pushbp
pushcx
pushdx
pushsi
movbx,offsetbScore
movax,[bx]
addax,1
mov[bx],ax
movdx,0
movbp,0;将bp置零,函数dtoc处理得分
callDtoc;将+1后的分数转化为ASCII码显示在规定位置上
movax,0b800h
moves,ax
movdh,14
movdl,72
movbh,0
movbl,dl
addbl,dl
moval,160
muldh
addbx,ax;算出字符首字母显示位置
movsi,offsetbScoreBuf
movah,COLORW
movch,0
@@:
moval,[si]
movcl,al
jcxzendShowS
moves:
[bx],ax
incsi
addbx,2
jmp@b
endShowS:
popsi
popdx
popcx
popbp
popbx
popax
ret
ShowScoreendp
ShowLevelproc;更新级数,参数blevel,bp,返回bLevelBuf
pushax
pushbx
pushbp
pushcx
pushdx
pushsi
movbx,offsetbLevel
movax,[bx]
movdx,0
movbp,1;将bp置零,函数dtoc处理级数
callDtoc;将+1后的分数转化为ASCII码显示在规定位置上
movax,0b800h
moves,ax
movdh,10
movdl,71
movbh,0
movbl,dl
addbl,dl
moval,160
muldh
addbx,ax;算出字符首字母显示位置
movsi,offsetbLevelBuf
movah,COLORW
movch,0
@@:
moval,[si]
movcl,al
jcxzendShowL
moves:
[bx],ax
incsi
addbx,2
jmp@b
endShowL:
popsi
popdx
popcx
popbp
popbx
popax
ret
ShowLevelendp
Dtocproc;十进制向字符串转化,参数ax,ds:
si,bp,无返回
pushax
pushbp
pushbx
pushcx
pushdx
pushsi;辗转求余法求出数据各位的数字
movsi,0;统计位数
cmpbp,0
jzscorsDtoc
cmpbp,1
jzlevelD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪食 汇编