距离上一次做这个都有一周了,可见我平常是真的忙到没时间做。
废话就不多说了,之前那个贪吃蛇(【汇编语言】贪吃蛇游戏(一))使用的是阻塞式的16号中断。所以产生的现象就是,按键盘蛇才走,不按键盘蛇不走。就像魂斗罗那样子。这显然是不行的,贪吃蛇应该是键盘不按他也能走,按键盘只起到了改变方向的作用。应该是使用9号中断才对。
今天我对旧版本的贪吃蛇做的改进就是使用九号中断,使贪吃蛇不按键盘都能走,键盘只改变方向。并且加入一定的逻辑判断,让蛇撞到围墙或者自身就会退出游戏。输掉。
但是还有不足的地方,因为食物并没有加入到游戏中。输掉后也就只是退出,没有加入显示分数的部分。应该设置一个随机位置出现的食物,蛇吃了才能变长。输掉游戏后就会显示分数,并且应该再加入一个暂停功能。
上代码:
assume cs : code, ds : data, ss : stack
data segment
pos dw 0, 0
dire dw 0, 2
score dw 0
data ends
stack segment
db 256 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 256
push cs
pop ds
mov ax, 0
mov es, ax
mov si, offset int9
mov di, 204H
mov cx, offset int9end - offset int9
cld
rep movsb
push es : [9 * 4]
pop es : [200H]
push es : [9 * 4 + 2]
pop es : [202H]
cli
mov word ptr es : [9 * 4], 204H
mov word ptr es : [9 * 4 +2], 0
sti
mov ax, data
mov ds, ax
mov ax, 0b800H
mov es, ax
call init
s0:
call delay
mov ax, pos[0]
add ax, dire[0]
mov pos[0], ax
mov ax, pos[2]
add ax, dire[2]
mov pos[2], ax
; mov word ptr es : [bx + di], 0001000000000000B
mov bx, pos[0]
mov di, pos[2]
cmp word ptr es : [bx + di], 0001000000000000B
jne e0
cmp word ptr pos[2], 0
jl e0
cmp word ptr pos[2], 160
jge e0
mov word ptr es : [bx + di], 0000000000000000B
jmp s0
e0:
call lose
mov ax, 4c00H
int 21H
lose:
ret
food:
ret
delay:
push cx
mov cx, 0ffffH
s2:
nop
nop
nop
nop
nop
nop
nop
nop
loop s2
pop cx
ret
init:
push bx
push es
push cx
mov cx, 2000
mov bx, 0
s1:
mov word ptr es : [bx], 0001000000000000B
add bx, 2
loop s1
pop cx
pop es
pop bx
ret
int9:
push ax
in al, 60H
pushf
call dword ptr cs : [200H]
cmp al, 11H
je w
cmp al, 1eH
je a
cmp al, 1fH
je s
cmp al, 20H
je d
jmp int9ret
w:
mov dire[0], -160
mov dire[2], 0
jmp int9ret
a:
mov dire[0], 0
mov dire[2], -2
jmp int9ret
s:
mov dire[0], 160
mov dire[2], 0
jmp int9ret
d:
mov dire[0], 0
mov dire[2], 2
int9ret:
pop ax
iret
int9end: nop
code ends
end start