📄 snake.asm
字号:
DATA SEGMENT
SNAKE DW 0C20H,0C21H,0C22H,0C23H,0C24H,0C25H,0C26H,0C27H,0C28H,0C29H,0C2AH,0C2BH,0C2CH,0C2DH
NUMS EQU $-SNAKE
NT DW ?
TAIL DB 75 ;初始蛇尾方向
MSG DB " Exit: Esc ","$"
MSG_E DB "GAME OVER!","$"
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AH,00H
MOV AL,03H ;设置彩色文本显示方式
INT 10H
MOV AH,06H
MOV AL,00H
MOV BH,1EH ;蓝底黄高亮字
MOV CX,0000H ;窗口左上的行列号都置为0
MOV DH,18H ;窗口右下行号 24
MOV DL,4FH ;窗口右下列号 79
INT 10H
;DONE#####################################################
MOV AH, 01H ;隐藏光标
MOV CX, 1000H
INT 10H
MOV DX,0004H ;输出退出提示
MOV BH, 0
MOV AH, 2
INT 10H
MOV DX,OFFSET MSG
MOV AH,9
INT 21H
CALL RUN
JMP F
ERROR: MOV DX,0522H ;蛇头接触屏幕周围或者蛇身
MOV BH, 0
MOV AH, 2
INT 10H
MOV DX,OFFSET MSG_E ;输出游戏结束提示
MOV AH,9
INT 21H
MOV AH,0 ;从键盘输入字符
INT 16H
F: MOV AH, 4CH
INT 21H
;#########################################################
RUN PROC
PUSH AX
PUSH BX
CALL DISPS
NEXT: MOV BX,SNAKE[26]
MOV AH,0 ;从键盘输入字符
INT 16H
CMP AH,TAIL
JE NEXT
CMP AH,72
JNE N2
MOV TAIL,80
SUB BX,0100H ;向上
JMP M
N2: CMP AH,80
JNE N3
MOV TAIL,72
ADD BX,0100H ;向下
JMP M
N3: CMP AH,75
JNE N4
MOV TAIL,77
SUB BX,0001H ;向左
JMP M
N4: CMP AH,77
JNE N5
MOV TAIL,75
ADD BX,0001H ;向右
JMP M
N5: CMP AH,01H
JE FIN ;退出
JNE NEXT ;继续下一次输入
M: MOV NT,BX ;更新小蛇的显示位置
CALL CLEARS
CALL UPDATE
CALL DISPS
JMP NEXT
FIN: POP BX
POP AX
RET
RUN ENDP
;#########################################################
UPDATE PROC ;移动小蛇
PUSH AX
PUSH BX
PUSH CX
PUSH SI
MOV AX,NT ;检查是否越界
CMP AH,00H
JE ERROR
CMP AH,19H
JE ERROR
CMP AL,0ffH
JE ERROR
CMP AL,50H
JE ERROR
MOV SI,2 ;检查是否蛇身冲突
MOV CX,11
CHECK: MOV AX,NT
CMP AX,SNAKE[SI]
JE ERROR
INC SI
INC SI
LOOP CHECK
MOV SI,0 ;更新小蛇的位置
MOV CX,13
UD: MOV AX,SNAKE[SI+2]
MOV SNAKE[SI],AX
INC SI
INC SI
LOOP UD
MOV AX,NT
MOV SNAKE[SI],AX
POP SI
POP CX
POP BX
POP AX
RET
UPDATE ENDP
;#########################################################
DISPS PROC ;在SNAKE中储存的地址处显示小蛇
PUSH AX
PUSH CX
PUSH DX
PUSH SI
MOV DX, SNAKE[26] ;置光标位置为蛇头
MOV AL,'#'
CALL DISP
MOV CX,12
MOV SI,24
MOV AL,'='
INID: MOV DX,SNAKE[SI] ;置光标位置为蛇身
DEC SI
DEC SI ;移动两位
CALL DISP
LOOP INID
MOV DX, SNAKE[SI] ;置光标位置为蛇尾
MOV AL,'-'
CALL DISP
POP SI
POP DX
POP CX
POP AX
RET
DISPS ENDP
;#########################################################
CLEARS PROC ;根据SNAKE中储存的地址清除小蛇
PUSH AX
PUSH CX
PUSH DX
MOV DX, SNAKE[26] ;置光标位置为蛇头
CALL CLEAR
MOV CX,12
MOV SI,24
INIC: MOV DX,SNAKE[SI] ;置光标位置为蛇身
DEC SI
DEC SI ;移动两位
CALL CLEAR
LOOP INIC
MOV DX,SNAKE ;置光标位置为蛇尾
CALL CLEAR
POP DX
POP CX
POP AX
RET
CLEARS ENDP
;#########################################################
DISP PROC ;在DH行,DL列显示 AL里的字符
PUSH AX
PUSH BX
PUSH CX
MOV BH, 0
MOV AH, 2
INT 10H
MOV AH, 9 ;在光标位置显示字符及属性
MOV BH, 0 ;页号
MOV BL, 1EH ;蓝底黄高亮字
MOV CX, 01H ;显示字符次数
INT 10H
POP CX
POP BX
POP AX
RET
DISP ENDP
;#########################################################
CLEAR PROC ;清除DH行,DL列的显示
PUSH AX
PUSH BX
PUSH CX
MOV BH, 0
MOV AH, 2
INT 10H
MOV AH, 9 ;在光标位置显示字符及属性
MOV BH, 0 ;页号
MOV BL, 11H ;蓝底蓝字
MOV CX, 01H ;显示字符次数
INT 10H
POP CX
POP BX
POP AX
RET
CLEAR ENDP
;#########################################################
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -