⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.asm

📁 微机原理实验 包括 口令识别 数制转换 计算三角函数 贪食蛇 扬声器控制
💻 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 + -