📄 5.asm
字号:
DATA SEGMENT
HEAD DB 12,46,12,45,12,44,12,43,12,42,12,41,12,40,12,39,12,38,12,37,12,36,12,35,12,34,12,33
DB 100 DUP(0)
DIREC DB 1 ;方向变量,1表示向右,2表示向左,3表示向上,4表示向下
SUM DW 0
SUM1 DW 0
ERROR DB "GAME OVER!",0DH,0AH,"$"
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 AL, 03H
MOV AH, 0
INT 10H
MOV AL, 0 ;清屏功能
MOV BH, 1EH ;蓝底黄字
MOV CH, 0 ;左上角行号
MOV CL, 0 ;左上角列号
MOV DH, 24 ;右下角行号
MOV DL, 79 ;右下角列号
MOV AH, 6 ;功能号
INT 10H ;中断调用
MOV AH, 01H
MOV CX, 1000H
INT 10H
MOV DH, 12 ; 置光标位置
MOV DL, 33
MOV BH, 0
MOV AH, 2
INT 10H
MOV AH, 2 ;在光标位置显示字符及属性
MOV DL,'-'
INT 21H
MOV AH, 9 ;在光标位置显示字符及属性
MOV AL, '='
MOV BH, 0 ;页号
MOV BL, 1EH ;白底红字
MOV CX, 12 ;显示字符次数
INT 10H
MOV DH, 12 ; 置光标位置
MOV DL, 46
MOV BH, 0
MOV AH, 2
INT 10H
MOV DL,'#'
MOV AH,2
INT 21H
CALL MAKE
RRR:
MOV DL,0FFH ;输入方向键
MOV AH,06H
INT 21H
CMP AL,77 ;如果是向右
JE R
CMP AL,80 ;如果是向下
JE D
CMP AL,72 ;如果是向上
JE U
CMP AL,75 ;如果是向左
JE L
MOV CX,01FFFH
DELAY:
MOV AX,CX
MOV CX,0FFFH
DELAY1:
LOOP DELAY1
MOV CX,AX
LOOP DELAY
CMP DIREC,1
JE R
CMP DIREC,2
JE L
CMP DIREC,3
JE U
CMP DIREC,4
JE D
R:
CMP DIREC,2
JZ RRR
MOV DIREC,1
MOV DH,HEAD ;判断头所要前进的方向上有没有字符
MOV AL,[HEAD+1]
CMP AL,79 ;如果撞壁就输出err
JE ERR
INC AL
MOV DL,AL
MOV BH,0
MOV AH,2
INT 10H
MOV AH,08H
INT 10H
CMP AL,'=' ;如果不是空格则跳转到ERR
JE ERR
CMP AL,'-'
JE ERR
MOV CL,AL
DEC DL ;如果是空格就改变蛇头
MOV AH,2
INT 10H
MOV DL,'='
MOV AH,2
INT 21H
MOV DL,'#'
MOV AH,2
INT 21H
CMP CL,'*'
JNE GOON
ADD SUM,2
ADD SUM1,1
MOV BX,OFFSET HEAD ;改变蛇身位置坐标
MOV SI,24
ADD SI,SUM
MOV CX,13
ADD CX,SUM1
XUNHUANR:
MOV AL,[BX+SI]
MOV [BX+SI+2],AL
MOV AL,[BX+SI+1]
MOV [BX+SI+3],AL
SUB SI,2
LOOP XUNHUANR
CALL MAKE
JMP XCHAN
GOON:
CALL CHANGE
XCHAN:
MOV AL,[HEAD+1]
INC AL
MOV [HEAD+1],AL
JMP RRR
L:
CMP DIREC,1
JZ RRR
MOV DIREC,2
MOV DH,HEAD ;判断头所要前进的方向上有没有字符
MOV AL,[HEAD+1]
CMP AL,0 ;如果撞壁就输出err
JE ERR
DEC AL
MOV DL,AL
MOV BH,0
MOV AH,2
INT 10H
MOV AH,08H
INT 10H
CMP AL,'-' ;如果不是空格则跳转到ERR
JE ERR
CMP AL,'='
JE ERR
MOV CL,AL
MOV AH,2 ;如果是空格就改变蛇头
INT 10H
MOV DL,'#'
MOV AH,2
INT 21H
MOV DL,'='
MOV AH,2
INT 21H
CMP CL,'*'
JNE GOONL
ADD SUM,2
ADD SUM1,1
MOV BX,OFFSET HEAD ;改变蛇身位置坐标
MOV SI,24
ADD SI,SUM
MOV CX,13
ADD CX,SUM1
XUNHUANL:
MOV AL,[BX+SI]
MOV [BX+SI+2],AL
MOV AL,[BX+SI+1]
MOV [BX+SI+3],AL
SUB SI,2
LOOP XUNHUANL
CALL MAKE
JMP XCHANL
GOONL:
CALL CHANGE
XCHANL:
MOV AL,[HEAD+1]
DEC AL
MOV [HEAD+1],AL
JMP RRR
U:
CMP DIREC,4
JZ RRR
MOV DIREC,3
MOV AL,[HEAD+1] ;判断头所要前进的方向上有没有字符
MOV DL,AL
MOV AL,HEAD
CMP AL,0 ;如果撞壁就输出err
JE ERR
DEC AL
MOV DH,AL
MOV BH,0
MOV AH,2
INT 10H
MOV AH,08H
INT 10H
CMP AL,'=' ;如果不是空格则跳转到ERR
JE ERR
CMP AL,'-'
JE ERR
MOV CL,AL
MOV DL,'#' ;如果是空格就改变蛇头
MOV AH,2
INT 21H
MOV DH,HEAD
MOV DL,[HEAD+1]
MOV BH,0
MOV AH,2
INT 10H
MOV DL,'='
MOV AH,2
INT 21H
CMP CL,'*'
JNE GOONU
ADD SUM,2
ADD SUM1,1
MOV BX,OFFSET HEAD ;改变蛇身位置坐标
MOV SI,24
ADD SI,SUM
MOV CX,13
ADD CX,SUM1
XUNHUANU:
MOV AL,[BX+SI]
MOV [BX+SI+2],AL
MOV AL,[BX+SI+1]
MOV [BX+SI+3],AL
SUB SI,2
LOOP XUNHUANU
CALL MAKE
JMP XCHANU
GOONU:
CALL CHANGE
XCHANU:
MOV AL,HEAD
DEC AL
MOV HEAD,AL
JMP RRR
D:
CMP DIREC,3
JZ RRR
MOV DIREC,4
MOV AL,[HEAD+1] ;判断头所要前进的方向上有没有字符
MOV DL,AL
MOV AL,HEAD
CMP AL,24 ;如果撞壁就输出err
JE ERR
INC AL
MOV DH,AL
MOV BH,0
MOV AH,2
INT 10H
MOV AH,08H
INT 10H
CMP AL,'-' ;如果不是空格则跳转到ERR
JE ERR
CMP AL,'='
JE ERR
MOV CL,AL
MOV DL,'#' ;如果是空格就改变蛇头
MOV AH,2
INT 21H
MOV DH,HEAD
MOV DL,[HEAD+1]
MOV BH,0
MOV AH,2
INT 10H
MOV DL,'='
MOV AH,2
INT 21H
CMP CL,'*'
JNE GOOND
ADD SUM,2
ADD SUM1,1
MOV BX,OFFSET HEAD ;改变蛇身位置坐标
MOV SI,24
ADD SI,SUM
MOV CX,13
ADD CX,SUM1
XUNHUAND:
MOV AL,[BX+SI]
MOV [BX+SI+2],AL
MOV AL,[BX+SI+1]
MOV [BX+SI+3],AL
SUB SI,2
LOOP XUNHUAND
CALL MAKE
JMP XCHAND
GOOND:
CALL CHANGE
XCHAND:
MOV AL,HEAD
INC AL
MOV HEAD,AL
JMP RRR
MAKE PROC
MOV BX,OFFSET HEAD
MOV AL,[BX+16]
MOV CL,[BX+23]
MOV BL,24
SUB BL,AL
MOV DH,BL
MOV BL,79
SUB BL,CL
MOV DL,BL
INC DL
DEC DH
MOV BH,0
MOV AH,2
INT 10H
MOV DL,'*'
MOV AH,2
INT 21H
RET
MAKE ENDP
CHANGE PROC
MOV BX,OFFSET HEAD ;改变蛇尾
MOV SI,SUM
MOV AL,[BX+SI+26]
MOV DH,AL
MOV AL,[BX+SI+27]
MOV DL,AL
MOV AH,2
MOV BH,0
INT 10H
MOV DL,32 ;将原来的蛇尾改写成空格
MOV AH,2
INT 21H
MOV BX,OFFSET HEAD ;改变蛇尾前一个位置
MOV AL,[BX+SI+24]
MOV DH,AL
MOV AL,[BX+SI+25]
MOV DL,AL
MOV AH,2
MOV BH,0
INT 10H
MOV DL,'-'
MOV AH,2
INT 21H
MOV BX,OFFSET HEAD ;改变蛇身位置坐标
MOV SI,24
ADD SI,SUM
MOV CX,13
ADD CX,SUM1
XUNHUAN:
MOV AL,[BX+SI] ;循环把蛇身加长
MOV [BX+SI+2],AL
MOV AL,[BX+SI+1]
MOV [BX+SI+3],AL
SUB SI,2
LOOP XUNHUAN
RET
CHANGE ENDP
ERR:
mov dh,12
mov dl,33
mov bh, 0
mov ah ,2
int 10h
MOV DX,OFFSET ERROR
MOV AH,9
INT 21H
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -