这是我学习8086汇编的时候做得一个练习,代码写得比较长,可能有BUG,没认真去测试了,不过结构化做得还算好,应该容易看懂,这是目前这止写得最长的汇编程序,有好几百行代码,汇编语言的基本知识都用到了。
下面是源代码,MASM编译通过:
assume cs:code,ss:stack,ds:data
data segment
db 16 dup(0) ;第0字节保存颜色,1字节保存方向(1左2右3上4下),2、3字节保存食物所在行和列,4蛇的节数,5级数,67得分数
db 160 dup(0) ;食蛇尾的每一节所在的行和列,食蛇尾最大节数80
db 'game over!',0,'level: 1',0,'scores: 0',0,'wtan',0,'v1.0',0
data ends
stack segment
dw 32 dup(0)
stack ends
code segment
start:
mov ax,3
int 10h
mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
call show_wall
call show_level_score
mov al,2
mov bx,1
mov [bx],al ;初始方向向右
call show_init_snake
call randrow
s_move:
call show_rand_star
call hide_snake_tail
call show_snake_head
call sleep
mov al,0
mov ah,0bh
int 21h
cmp al,0ffh
jz s_next
jmp s_move
s_next:
mov al,0
mov ah,07
int 21h
cmp al,4bh ;按键为左箭头
jz s_left
cmp al,4dh ;按键为右箭头
jz s_right
cmp al,48h ;按键为上箭头
jz s_up
cmp al,50h ;按键为下箭头
jz s_down
cmp al,39h ;按键为空格
jz s_exit
jmp s_move
s_left:
mov al,1
mov bx,1
mov [bx],al ;方向改为向左
jmp s_move
s_right:
mov al,2
mov bx,1
mov [bx],al ;方向改为向右
jmp s_move
s_up:
mov al,3
mov bx,1
mov [bx],al ;方向改为向上
jmp s_move
s_down:
mov al,4
mov bx,1
mov [bx],al ;方向改为向下
jmp s_move
s_exit:
mov ax,4c00h
int 21h
;------------------------------------睡眼
sleep:
push bx
push cx
mov bx,500
s7: mov cx,65535
s6: loop s6
dec bx
jnz s7
pop cx
pop bx
ret
;------------------------------------得到随机行和列
;参数:无
;返回:无
randrow:
push ax
push bx
push dx
call srand
mov ax,dx
and ah,00001111b
mov dl,22
div dl
inc ah
mov bx,2
mov [bx],ah
call srand
mov ax,dx
and ah,00001111b
mov dl,58
div dl
inc ah
mov bx,3
mov [bx],ah
pop dx
pop bx