📄 汇编源码.txt
字号:
writestring MACRO y,x,color,info,len ;在y,x点画出color色的字符串,宏定义,在相应位置写字符串
PUSH ES
PUSH BP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,SEG info
MOV ES,AX
MOV BP,OFFSET info
MOV AH,13h
MOV AL,0
MOV BH,0
MOV BL,color
MOV CX,len
MOV DH,y
MOV DL,x
INT 10h
POP DX
POP CX
POP BX
POP AX
POP BP
POP ES
ENDM
data SEGMENT ;数据段
message01 DB 'Welcome to the game!!'
message02 DB '----Edacious Snake'
message03 DB 'push 1 to easygame'
message04 DB 'push 2 to genericgame'
message05 DB 'push 3 to diffcultgame'
message1 DB 'Edacious Snake' ;定义所写信息
message2 DB 'mark'
message3 DB 'difficulty'
message4 DB 'highestmark'
message5 DB 'Game Over'
message6 DB 'Do you want to try again(y/n)'
message7 DB 'easygame'
message8 DB 'genericgame'
message9 DB 'diffcultgame'
circle DB 44,44,44,44 ;定义点矩阵
DB 44,00,00,44
DB 44,00,00,44
DB 44,44,44,44
marks DW 100
string DB 4 DUP(?)
difficulty DW ?
diffc DB ?
snake DW 32160,32164,32168,32172,32176,95 DUP(?) ;定义初始蛇形的各点位置以队列结构存取
END_label DW ? ;获取队尾物理内存的偏移地址
headp DW ? ;定义存于队列的蛇头指针
tailp DW ? ;定义存于队列的蛇尾指针
dir DW 4 ;定义方向值
d DW ? ;定义存储豆位置的变量
data ENDS
code SEGMENT ;代码段
main PROC FAR ;主程序
ASSUME CS:code,DS:data
start:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,data
MOV DS,AX
MOV AX,0a000h
MOV ES,AX
MOV AH,00h ;定义屏幕显示方式
MOV AL,13h
INT 10h
start1:
CALL firstv
CALL clear_screen
JMP welcome
welcomeend:
CALL clear_screen
CALL diffcult
MOV AX,99 ;绘制矩形上线
MOV CX,4
MOV DX,320
MOV DI,0
CALL drawR
MOV CX,4 ;绘制矩形下线
MOV DI,62720
CALL drawR
MOV CX,192 ;绘制矩形左线
MOV DX,4
MOV DI,1280
CALL drawR
MOV CX,192 ;绘制矩形右线
MOV DX,4
MOV DI,1596
CALL drawR
MOV CX,192 ;绘制矩形中线
MOV DX,4
MOV DI,1400
CALL drawR
writestring 5,1,40,message1,14 ;显示游戏界面基本信息
writestring 8,1,47,message2,4
writestring 12,1,47,message3,10
writestring 16,1,47,message4,11
LEA SI,snake ;初始蛇形
MOV DI,[SI]
CALL drawD
MOV CX,4
next2:
ADD SI,2
MOV DI,[SI]
CALL drawD
LOOP next2
CALL markstring
CALL random2 ;画出初始随机豆
MOV d,AX
MOV DI,AX
CALL drawD
LEA SI,snake ;蛇身移动
MOV tailp,SI
ADD SI,8
MOV headp,SI
next:
CALL delay
MOV AH,06
MOV DL,0ffh
INT 21h ;响应键盘
JZ TEST1
CMP AL,27 ;响应键盘,按“ESC”键退出游戏
JNE keya
JMP return1
keya:
CMP AL,'a' ;响应键盘,按"A"蛇向右行进
JNE keyd
CMP DIr,4 ;屏蔽蛇原地转身
JE TEST1
MOV DIr,-4
keyd:
CMP AL,'d' ;响应键盘,按"D"蛇向左行进
JNE keyw
CMP DIr,-4 ;屏蔽蛇原地转身
JE TEST1
MOV DIr,4
keyw:
CMP AL,'w' ;响应键盘,按"W"蛇向上行进
JNE keys
CMP DIr,1280 ;屏蔽蛇原地转身
JE TEST1
MOV DIr,-1280
keys:
CMP AL,'s' ;响应键盘,按"S"蛇向下行进
JNE keyp
CMP DIr,-1280 ;屏蔽蛇原地转身
JE TEST1
MOV DIr,1280
keyp:
CMP AL,'p' ;响应键盘,按“P”暂停游戏
JNE TEST1
MOV AH,7
INT 21h
CMP AL,'p' ;响应键盘,再按"P"继续游戏
JNE keyp
test1:
CALL testhead ;调用子程序判断蛇头情况
CMP AL,2h ;判断是否吃到豆
JE return
CMP AL,0
JE cm ;否,则跳转到CM继续前行
CALL addhead ;是,则加长蛇身,即加一蛇头,同时指针前进
CALL random2 ;画出随机豆
MOV d,AX ;将豆的随机位置保存到变量d中
ADD marks,1 ;没吃一个豆加1分
CALL markstring
CM: ;无键盘响应时,蛇身沿直线前进
MOV DI,d ;为避免豆随机画在蛇身上,豆随蛇动而重复画
CALL drawD
MOV SI,tailp ;获取蛇尾位置
MOV DI,[SI]
CALL clearD ;擦除蛇尾
CALL cuttail ;调用子程序,尾指针前进
CALL addhead ;调用子程序,头指针前进
MOV SI,headp ;获取蛇头位置
MOV DI,[SI]
CALL drawD ;画出蛇头
JMP next
return: ;游戏结束,显示结束界面,并提问是否继续游戏
CALL clear_screen
writestring 8,10,44,message5,9
writestring 10,8,47,message6,29
MOV AH,7
INT 21h
CMP AL,'y'
JNE return1
JMP start1
return1:
RET
main ENDP
testhead PROC NEAR ;子程序,检测蛇头位置
MOV SI,headp
MOV AX,[SI]
ADD AX,DIr ;判断蛇头位置是否与豆的位置重合
CMP AX,d
JNE nextstate ;否,则跳转到下一判断状态
MOV AL,1 ;是,则返回值为1,存于AL中
JMP returntest
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -