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

📄 5.asm

📁 贪吃蛇汇编源代码
💻 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 + -