汇编语言写的贪吃蛇小游戏源代码.docx
《汇编语言写的贪吃蛇小游戏源代码.docx》由会员分享,可在线阅读,更多相关《汇编语言写的贪吃蛇小游戏源代码.docx(27页珍藏版)》请在冰豆网上搜索。
![汇编语言写的贪吃蛇小游戏源代码.docx](https://file1.bdocx.com/fileroot1/2022-11/24/bdd9d6c3-b8e6-4e5f-b60f-f825ede1f125/bdd9d6c3-b8e6-4e5f-b60f-f825ede1f1251.gif)
汇编语言写的贪吃蛇小游戏源代码
DATASEGMENT
dw0,0
snkdb1
blkdb32
fooddb3
tal1db4
tal2db2
adrsdb5
lendb?
pstdb?
addrsdw?
frowdb?
fcoldb?
hwrtdb?
gmovdb'gameoverpressrtorestartpressqtoquit$'
score1db'score:
$'
score2db?
score0db1
zerodb48
writerdb'Developer:
Geniusdot$'
emaildb':
geniusdotgmail.$'
msg1db'Thewaytoplaythegame:
$'
waydb'presswtoup,pressstodown,pressatoleft,pressdtoright$'
msgdb'Pressanykey(excepta,s,d,w)tostart$'
DATAENDS
STACKSEGMENTstack
db200dup(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
start:
movax,data
movds,ax
movax,0
moves,ax
movfrow,10
movfcol,6
movdh,10
movdl,26
movah,2
movbh,0
int10h
movah,9
leadx,msg1
int21h
movdh,11
movdl,7
movah,2
movbh,0
int10h
movah,9
leadx,way
int21h
movdh,12
movdl,20
movah,2
movbh,0
int10h
movah,9
leadx,msg
int21h
movah,0
int16h
movah,6
moval,0
movch,0
movcl,0
movdh,24
movdl,79
movbh,10
int10h
movdh,0
movdl,0
movah,2
movbh,0
int10h
movah,9
leadx,score1
int21h
movdl,15
movah,2
movbh,0
int10h
movah,9
leadx,writer
int21h
movah,9
leadx,email
int21h
movscore2,48
pushes:
[9*4];将原int9入口地址保存
popds:
[0]
pushes:
[9*4+2]
popds:
[2]
movwordptres:
[9*4],offsetint9;更改中断向量表
moves:
[9*4+2],cs
jmpaa
writemacrorow,col,cnt;宏定义用于向当前光标处输出字符
pushbx
pushcx
pushdx
movdh,row
movdl,col
movah,2
movbh,0
int10h
movah,9
movbl,11
movcx,1
leadi,cnt;50
moval,[di]
int10h
popdx
popcx
popbx
endm
readhmacrorow,col;宏定义用于读出当前光标处字符
pushdx
pushax
pushbx
movdh,row
movdl,col
movah,2
movbh,0
int10h
movah,08h
int10h
movpst,al
popbx
popax
popdx
endm
wnearmacro;宏定义只用在readcg宏中当readcg的所有判断都不成立调用此宏
localwnext1
localwnext2
localwnext3
localwnext4
pushdx
decdh
readhdh,dl
cmppst,1
jnewnext1
writedh,dl,tal2
jmpwnext4
wnext1:
incdh
decdl
readhdh,dl
cmppst,1
jnewnext2
writedh,dl,tal2
jmpwnext4
wnext2:
incdh
incdl
readhdh,dl
cmppst,1
jnewnext3
writedh,dl,tal2
jmpwnext4
wnext3:
decdh
incdl
readhdh,dl
cmppst,1
jnewnext4
writedh,dl,tal2
wnext4:
popdx
endm
readcgmacrorow,col;宏定义用于改变判断出来的字符
localtnup,tnup1,tnup2,tnlf,tnlf1,tnlf2,tndn,tndn1,tndn2,tnrt,tnrt1,tnrt2,goout
pushbx
pushax
pushdx
writedh,dl,tal1
decrow
readhdh,dl
cmppst,4
jnetnup1
jmptnup2
tnup1:
jmpnearptrtnup
tnup2:
writedh,dl,blk
incdh
incdh
readhdh,dl
cmppst,1
jnetnup
writedh,dl,tal2
jmpnearptrgoout
tnup:
popdx
pushdx
deccol
readhdh,dl
cmppst,4
jnetnlf1
jmptnlf2
tnlf1:
jmpnearptrtnlf
tnlf2:
writedh,dl,blk
incdl
incdl
readhdh,dl
cmppst,1
jnetnlf
writedh,dl,tal2
jmpnearptrgoout
tnlf:
popdx
pushdx
incrow
readhdh,dl
cmppst,4
jnetndn1
jmptndn2
tndn1:
jmpnearptrtndn
tndn2:
writedh,dl,blk
decdh
decdh
readhdh,dl
cmppst,1
jnetndn
writedh,dl,tal2
jmpnearptrgoout
tndn:
popdx
pushdx
inccol
readhdh,dl
cmppst,4
jnetnrt1
jmptnrt2
tnrt1:
jmpnearptrtnrt
tnrt2:
writedh,dl,blk
decdl
decdl
readhdh,dl
cmppst,1
jnetnrt
writedh,dl,tal2
jmpnearptrgoout
tnrt:
popdx
pushdx
wnear
goout:
popdx
popax
popbx
endm
addone:
;此标号功能是将蛇身增加一
pushdx
incscore2
movdh,1
movdl,0
movcx,23
cmpad1:
pushcx
movcx,79
cmpad2:
readhdh,dl
cmppst,2
jnenextad3
jmpnextad4
nextad3:
jmpnearptrnextad
nextad4:
writedh,dl,snk
decdh
readhdh,dl
cmppst,4
jnenatup
writedh,dl,tal2
decdh
writedh,dl,tal1
jmpouto
natup:
incdh
decdl
readhdh,dl
cmppst,4
jnenatlf
writedh,dl,tal2
decdl
writedh,dl,tal1
jmpouto
natlf:
incdh
incdl
readhdh,dl
cmppst,4
jnenatdn
writedh,dl,tal2
incdh
writedh,dl,tal1
jmpouto
natdn:
decdh
incdl
readhdh,dl
cmppst,4
jnenatrt
writedh,dl,tal2
incdl
writedh,dl,tal1
natrt:
outo:
popcx
jmpnearptrendad
nextad:
incdl
jmpnextad2
chgad2:
jmpnearptrcmpad2
nextad2:
loopchgad2
subdl,79
incdh
popcx
jmpnextad1
chgad1:
jmpnearptrcmpad1
nextad1:
loopchgad1
endad:
popdx
jmpnearptrcrtf
aa:
;从这开始产生最原始的蛇
movaddrs,offsetturnright
movdh,10
movdl,1
movcx,3
writedh,dl,tal1
incdl
writedh,dl,tal2
wrt:
incdl
writedh,dl,snk
loopwrt
movlen,6
movax,0
jmpwrt1
ovflw:
;当蛇碰壁或自身转到此游戏结束
movah,6
moval,0
movch,0
movcl,0
movdh,24
movdl,79
movbh,7
int10h
movdh,17
movdl,17
movah,2
movbh,0
int10h
movah,9
leadx,gmov
int21h
movax,0;恢复int9中断
moves,ax
pushds:
[0]
popes:
[9*4]
pushds:
[2]
popes:
[9*4+2]
stop:
movah,0
int16h
cmpal,'r'
jeaa1
jmpaa2
aa1:
jmpnearptrstart
aa2:
cmpal,'q'
jnestop
jmpnearptrexit
wrt1:
;此处蛇行走过程的无限循环
calldly
pushdx
incdh
cmpdh,25
jeovflw
incdl
cmpdl,80
jeovflw
popdx
pushdx
decdh
cmpdh,0
jeovflw
decdl
cmpdl,-1
jeovflw
popdx
pushdx
leaax,turnright
cmpaddrs,ax
jnetonxt2
incdl
readhdh,dl
cmppst,1
jetonxt1
cmppst,2
jetonxt1
cmppst,4
jetonxt1
jmptonxt2
tonxt1:
jmpovflw
tonxt2:
popdx
pushdx
leaax,turnup
cmpaddrs,ax
jnetonxt4
decdh
readhdh,dl
cmppst,1
jetonxt3
cmppst,2
jetonxt3
cmppst,4
jetonxt3
jmptonxt4
tonxt3:
jmpovflw
tonxt4:
popdx
pushdx
leaax,turndown
cmpaddrs,ax
jnetonxt6
incdh
readhdh,dl
cmppst,1
jetonxt5
cmppst,2
jetonxt5
cmppst,4
jetonxt5
jmptonxt6
tonxt5:
jmpovflw
tonxt6:
popdx
pushdx
leaax,turnback
cmpaddrs,ax
jnetonxt8
decdl
readhdh,dl
cmppst,1
jetonxt7
cmppst,2
jetonxt7
cmppst,4
jetonxt7
jmptonxt8
tonxt7:
jmpovflw
tonxt8:
popdx
jmpnexta
crtf1:
jmpnearptraddone
crtf:
callrand1
callrand2
incfrow
movah,frow
moval,fcol
pushdx
movdh,1
movdl,0
pushcx
movcx,23
check1:
pushcx
movcx,79
check2:
readhdh,dl
cmppst,1
jenextn
cmppst,2
jenextn
cmppst,4
jenextn
jmpnextnn
nextn:
cmpax,dx
jecrtf
nextnn:
incdl
loopcheck2
incdh
subdl,79
popcx
loopcheck1
popcx
popdx
writefrow,fcol,food
nexta:
movah,frow
moval,fcol
cmpax,dx
jecrtf12
jmpcrtf13
crtf12:
jmpnearptrcrtf1
crtf13:
pushdx
cmpscore2,58
jlnormal
movscore2,49
incscore0
normal:
movdh,0
movdl,8
writedh,dl,score2
adddl,score0
writedh,dl,zero
popdx
cmpadrs,17
jejmp1
cmpadrs,145
jejmp1
cmpadrs,31
jejmp2
cmpadrs,159
jejmp2
cmpadrs,32
jejmp3
cmpadrs,160
jejmp3
cmpadrs,30
jejmp4
cmpadrs,158
jejmp4
jmpaddrs
jmp1:
leaax,turndown
cmpax,addrs
jejmp2
movaddrs,offsetturnup
jmpnearptrturnup
jmp2:
leaax,turnup
cmpax,addrs
jejmp1
movaddrs,offsetturndown
jmpnearptrturndown
jmp3:
leaax,turnback
cmpax,addrs
jejmp4
movaddrs,offsetturnright
jmpnearptrturnright
jmp4:
leaax,turnright
cmpax,addrs
jejmp3
movaddrs,offsetturnback
jmpnearptrturnback
turnright:
;此处实现蛇向左走
pushdx
movdh,1
movdl,0
movcx,23
cmpr1:
pushcx
movcx,79
cmpr2:
readhdh,dl
cmppst,2
jenextr4
jmpnearptrnextr
nextr4:
readcgdh,dl
popcx
jmpnearptrendr
nextr:
incdl
jmpnextr2
chgr2:
jmpnearptrcmpr2
nextr2:
loopchgr2
subdl,79
incdh
popcx
jmpnextr1
chgr1:
jmpnearptrcmpr1
nextr1:
loopchgr1
endr:
popdx
incdl
writedh,dl,snk
jmpnearptrwrt1
turnup:
;此处实现蛇向上走
pushdx
movdh,1
movdl,0
movcx,23
cmpu1:
pushcx
movcx,79
cmpu2:
readhdh,dl
cmppst,2
jnenextu3
jmpnextu4
nextu3:
jmpnearptrnextu
nextu4:
readcgdh,dl
popcx
jmpnearptrendu
nextu:
incdl
jmpnextu2
chgu2:
jmpnearptrcmpu2
nextu2:
loopchgu2
subdl,79
incdh
popcx
jmpnextu1
chgu1:
jmpnearptrcmpu1
nextu1:
loopchgu1
endu:
popdx
decdh
writedh,dl,snk
jmpnearptrwrt1
turndown:
;此处实现蛇向下走
pushdx
movdh,1
movdl,0
movcx,23
cmpd1:
pushcx
movcx,79
cmpd2:
readhdh,dl
cmppst,2
jnenextd3
jmpnextd4
nextd3:
jmpnearptrnextd
nextd4:
readcgdh,dl
popcx
jmpnearptrendd
nextd:
incdl
jmpnextd2
chgd2:
jmpnearptrcmpd2
nextd2:
loopchgd2
subdl,79
incdh
popcx
jmpnextd1
chgd1:
jmpnearptrcmpd1
nextd1:
loopchgd1
endd:
popdx
incdh
writedh,dl,snk
jmpnearptrwrt1
turnback:
;此处实现蛇向右走
pushdx
movdh,1
movdl,0
movcx,23
cmpb1:
pushcx
movcx,79
cmpb2:
readhdh,dl
cmppst,2
jnenextb3
jmpnextb4
nextb3:
jmpnearptrnextb
nextb4:
readcgdh,dl
popcx
jmpnearptrendb
nextb:
incdl
jmpnextb2
chgb2:
jmpnearptrcmpb2
nextb2:
loopchgb2
subdl,79
incdh
popcx
jmpnextb1
chgb1:
jmpnearptrcmpb1
nextb1:
loopchgb1
endb:
popdx
decdl
writedh,dl,snk
jmpnearptrwrt1
exit:
movax,0;恢复int9中断
moves,ax
pushds:
[0]
popes:
[9*4]
pushds:
[2]
popes:
[9*4+2]
movah,4ch
int21h
int9:
;更改后的中断服务程序
pushax
inal,60h
movadrs,al
moval,20h
out20h,al
popax
iret
DLYPROCnear;延时子程序
PUSHCX
PUSHDX
MOVDX,10000
DL1:
MOVCX,9801
DL2:
LOOPDL2
DECDX
JNZDL1
POPDX
POPCX
RET
DLYENDP
RAND1PROC
PUSHCX
PUSHDX
PUSHAX
STI
MOVAH,0;读时钟计数器值
INT1AH
MOVAX,DX;清高6位
ANDAH,3
MOVDL,23;除23,产生0~23余数
DIVDL
MOVfrow,AH;余数存frow,作随机行数
POPAX
POPDX
POPCX
RET
RAND1ENDP
RAND2PROC
PUSHCX
PUSHDX
PUSHAX
STI
MOVAH,0;读时钟计数器值
INT1AH
MOVAX,DX;清高6位
ANDAH,3
MOVDL,79;除79,产生0~79余数
DIVDL
MOVfcol,AH;余数存fcol,作随机列数
POPAX
POPDX
POPCX
RET
RAND2ENDP
CODEENDS
ENDstart