📄 snake.asm
字号:
up equ 48h
down equ 50h
right equ 4dh
left equ 4bh
data segment
speed dw 5000
sx db 200 dup(0)
sy db 200 dup(0)
fx db 0
fy db 0
x db 20
y db 20
d db right
dtemp db right
ls db 4
lord db 1
N1 DB 29
N2 DB 217
N3 DB 40
SEED DB 0
data ends
code segment
assume cs:code,ds:data
go:
;prepare for drawing
mov ax,data
mov ds,ax
mov ah,0
mov al,4
int 10h
mov ah,0bh
mov bh,1
mov bl,0
int 10h
mov bh,0
int 10h
mov sx[1],20
mov sy[1],17
mov sx[2],20
mov sy[2],18
mov sx[3],20
mov sy[3],19
mov sx[4],20
mov sy[4],20
;draw a red background
mov dx,4
mov cx,4
ground:
mov ah,0ch
mov al,2
int 10h
inc cx
cmp cx,164
jne ground
mov cx,4
inc dx
cmp dx,164
jne ground
;create new food
newfood:
mov ah,0
int 1ah
mov seed,dl
call food
direct:
call direction
;live or die
call liveordie
cmp lord,0
je quit
draw:
mov bl,4
mov al,x
mul bl
push ax
mov al,y
mul bl
push ax
call pix
;eat food
mov ah,0
mov al,fx
cmp x,al
jne tail
mov al,fy
cmp y,al
je inclength
tail:
call newsnake
call delay
jmp direct
inclength:
inc ls
lea si,sx
lea di,sy
mov ah,0
mov al,ls
add si,ax
add di,ax
mov al,x
mov [si],al
mov al,y
mov [di],al
in al,61h
or al,3
out 61h,al
mov al,0b6h
out 43h,al
mov ax,1500
out 42h,al
mov al,ah
out 42h,al
call delay
in al,61h
and al,0fch
out 61h,al
jmp newfood
quit:
mov ah,0
mov al,3
int 10h
mov ah,4ch
int 21h
pix proc near
push bp
push ax
push bx
push cx
push dx
mov bp,sp
mov dx,[bp+14]
mov cx,[bp+12]
line1:
mov ah,0ch
mov al,1
int 10h
inc cx
mov ax,[bp+12]
add ax,4
cmp cx,ax
jne line1
mov cx,[bp+12]
inc dx
mov ax,[bp+14]
add ax,4
cmp dx,ax
jne line1
pop dx
pop cx
pop bx
pop ax
pop bp
ret 4
pix endp
erase proc near
push bp
push ax
push bx
push cx
push dx
mov bp,sp
mov dx,[bp+14]
mov cx,[bp+12]
line2:
mov ah,0ch
mov al,2
int 10h
inc cx
mov ax,[bp+12]
add ax,4
cmp cx,ax
jne line2
mov cx,[bp+12]
inc dx
mov ax,[bp+14]
add ax,4
cmp dx,ax
jne line2
pop dx
pop cx
pop bx
pop ax
pop bp
ret 4
erase endp
delay proc near
push ax
push cx
mov ax,speed
mov cx,28010
dly: loop dly
mov cx,28010
dec ax
cmp ax,0
jne dly
pop cx
pop ax
ret
delay endp
rand proc near
push ax
push bx
push cx
MOV CX,10
MOV AL,SEED
MOV BL,N1
MUL BL
MOV BL,N2
MOV BH,0
ADD AX,BX
DIV N3
MOV SEED,AH
pop cx
pop bx
pop ax
ret
rand endp
food proc near
push ax
push bx
push cx
push si
push di
food1:
call rand
mov al,seed
mov fx,al
inc fx
call rand
mov al,seed
mov fy,al
inc fy
mov bx,1
lea si,sx
lea di,sy
effect:
mov al,[si+bx]
cmp al,fx
jne next1
mov al,[di+bx]
cmp al,fy
je food1
next1:
inc bl
cmp bl,ls
jle effect
drawfood:
mov bl,4
mov al,fx
mul bl
push ax
mov al,fy
mul bl
push ax
call pix
pop di
pop si
pop cx
pop bx
pop ax
ret
food endp
direction proc near
push ax
push si
push di
lea si,sx
lea di,sy
mov ah,0
mov al,ls
add si,ax
add di,ax
mov al,[si]
mov x,al
mov al,[di]
mov y,al
mov ah,1
int 16h
jz kup
mov al,d
mov dtemp,al
mov d,ah
cmp dtemp,up
jne ndown
cmp d,down
je back
ndown:
cmp dtemp,down
jne nleft
cmp d,up
je back
nleft:
cmp dtemp,left
jne nright
cmp d,right
je back
nright:
cmp dtemp,right
jne kup
cmp d,left
jne kup
back:mov al,dtemp
mov d,al
kup: cmp d,up
jne kdown
dec x
jmp dend
kdown:
cmp d,down
jne kleft
inc x
jmp dend
kleft:
cmp d,left
jne kright
dec y
jmp dend
kright:
cmp d,right
jne nodirection
inc y
jmp dend
nodirection:
mov d,0
dend:
mov ah,0ch
mov al,6
mov dl,0ffh
int 21h
pop di
pop si
pop ax
ret
direction endp
newsnake proc near
push ax
push bx
push si
push di
mov bl,4
mov al,sx[1]
mul bl
push ax
mov al,sy[1]
mul bl
push ax
call erase
mov bl,1
lea si,sx
lea di,sy
inc si
inc di
news:
cmp bl,ls
je newhead
mov al,[si+1]
mov [si],al
mov al,[di+1]
mov [di],al
inc bl
inc si
inc di
jmp news
newhead:
mov al,x
mov [si],al
mov al,y
mov [di],al
pop di
pop si
pop bx
pop ax
ret
newsnake endp
liveordie proc near
push ax
push bx
push si
push di
cmp d,0
je die
cmp x,0
je die
cmp x,41
je die
cmp y,0
je die
cmp y,41
je die
mov bx,1
lea si,sx
lea di,sy
itself:
mov al,[si+bx]
cmp al,x
jne next2
mov al,[di+bx]
cmp al,y
je die
next2:
inc bl
cmp bl,ls
jl itself
jmp ldend
die:
mov lord,0
ldend:
pop di
pop si
pop bx
pop ax
ret
liveordie endp
code ends
end go
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -