📄 汇编源码.txt
字号:
nextstate:
MOV SI,headp
MOV AX,[SI]
ADD AX,DIr
MOV DI,AX
CMP BYTE PTR ES:[DI],0 ;判断蛇头所处位置是否为黑色
JE nextstate2 ;是,则跳转到下一状态
MOV AL,2h ;否,则返回值为2 ,存于AL中
JMP returntest
nextstate2:
MOV AL,0 ;则返回值为0,存于AL中
returntest:
RET
testhead ENDP
addhead PROC NEAR ;子程序,加蛇尾,即在队列中前移头指针
MOV SI,headp
MOV AX,[SI]
ADD AX,DIr
ADD headp,2
LEA BX,END_label
CMP headp,BX
JL continue_head
LEA SI,snake
MOV headp,SI
continue_head:
MOV SI,headp
MOV [SI],AX
RET
addhead ENDP
cuttail PROC NEAR ;子程序,去除蛇尾,即在队列中前移尾指针
ADD tailp,2
LEA BX,END_label
CMP tailp,BX
JL continue_tail
LEA SI,snake
MOV tailp,SI
continue_tail:
RET
cuttail ENDP
drawD PROC NEAR ;在DI位置处画豆
PUSH AX
PUSH CX
PUSH SI
MOV SI,OFFSET circle
MOV CX,4
next_line1:
MOV AX,CX
MOV CX,4
REP movsb
ADD DI,316
MOV CX,AX
LOOP next_line1
POP SI
POP CX
POP AX
RET
drawD ENDP
clearD PROC NEAR ;在DI位置处擦除豆
PUSH AX
PUSH CX
MOV CX,4
MOV AL,0
next_line:
MOV DX,CX
MOV CX,4
REP STOSB
ADD DI,316
MOV CX,DX
LOOP next_line
POP CX
POP AX
RET
clearD ENDP
random PROC NEAR ;产生随机数,存在AL 0~46
IN AL,40h
MOV AH,AL
AND AH,0fh
IN AL,40h
AND AL,1fh
ADD AL,AH
MOV AH,0
RET
random ENDP
random2 PROC NEAR ;限制豆出现在蛇活动区,产生在合法区域出现的位置存于AX中
CALL random
MOV DL,4
MUL DL
ADD AX,124
MOV BX,AX
CALL random
MOV DL,4
MUL DL
ADD AX,4
MOV DX,320
MUL DX
ADD AX,BX
RET
random2 ENDP
markstring PROC NEAR ;将记分变量转化成字符类型
MOV AX,marks
MOV DX,0
MOV CX,1000 ;计算千位
DIV CX
ADD AL,30h
MOV string[0],AL
MOV AX,DX
MOV CL,100 ;计算百位
DIV CL
ADD AL,30h
MOV string[1],AL
MOV AL,AH
MOV AH,0
MOV CL,10 ;计算十位
DIV CL
ADD AL,30h
MOV string[2],AL
ADD AH,30h ;存储个位
MOV string[3],AH
writestring 9,5,40,string,4
RET
markstring ENDP
welcome PROC NEAR ;欢迎界面显示,并选择游戏难度
writestring 8,10,40,message01,21
writestring 9,14,44,message02,18
writestring 12,14,38,message03,18
writestring 13,14,38,message04,22
writestring 14,14,38,message05,23
welc:
MOV AH,7
INT 21h
CMP AL,'1'
MOV difficulty,0ffffh
JE wreturn
CMP AL,'2'
MOV difficulty,08fffh
JE wreturn
CMP AL,'3'
MOV difficulty,04fffh
JE wreturn
CMP AL,27 ;响应键盘,按"ESC"键退出游戏
JNE welc
JMP return1
wreturn:
MOV diffc,AL
JMP welcomeend
welcome ENDP
diffcult PROC NEAR ;子程序,判断选择的难度,在相应位置显示信息
MOV AL,diffc
CMP AL,'1'
writestring 13,3,40,message7,8
JE dreturn
CMP AL,'2'
writestring 13,3,40,message8,11
JE dreturn
CMP AL,'3'
writestring 13,3,40,message9,12
JE dreturn
dreturn:
RET
diffcult ENDP
clear_screen PROC NEAR ;清屏
MOV DI,0
MOV CX,32000
MOV AX,0
REP stosw
RET
clear_screen ENDP
drawR PROC NEAR ;画矩形的子程序
MOV BX,320
SUB BX,DX
next_line2:
PUSH CX
MOV CX,DX
REP STOSB
ADD DI,BX
POP CX
LOOP next_line2
RET
drawR ENDP
firstv PROC NEAR ;子程序,初始化变量
MOV marks,100
MOV snake[0],32160
MOV snake[2],32164
MOV snake[4],32168
MOV snake[6],32172
MOV snake[8],32176
LEA SI,snake
MOV tailp,SI
ADD SI,8
MOV headp,SI
RET
firstv ENDP
delay PROC NEAR ;61h端口触发延迟
PUSH CX
PUSH AX
MOV CX,difficulty ;产生(15.08*3147=0.05s) 延迟
next_delay11:
IN AL,61h
AND AL,10h
CMP AL,AH
JE next_delay11
MOV AH,AL
LOOP next_delay11
POP AX
POP CX
RET
delay ENDP
code ENDS
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -