📄 snake.asm
字号:
pop bx
pop ax
ret
Check_die endp;******************************************************************************************
;函数名: Check_eat
;功能: 处理吃到食物的响应
;传递参数: SI,DI为当前蛇头部的坐标
;
;函数返回: 蛇参数的值
;******************************************************************************************
Check_eat proc
push ax
push bx
push cx
push dx
push si
push di
mov ax , foodx
mov bx , foody
cmp ax , si
jz ok1
jmp check_eat_out
ok1: ;横坐标相等
cmp bx , di
jz ok2
jmp check_eat_out
ok2: ;纵坐标也相等
mov al , point
add al , 1
mov point , al ;加分
mov bx , offset Body ;增加蛇长
xor ax , ax
mov al , Len
add bx , ax
add bx , ax ;取到蛇尾
sub bx , 2
mov ax , [bx]
mov dx , Direction
sub ah , dh ;坐标减方向
sub al , dl ;坐标减方向
add bx , 2 ;新格的存储位置
mov [bx] , ax
mov al , Len ;LEN+1
add al , 1
mov Len , al
call getfood ;得到新食物
check_eat_out:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
Check_eat endp
;******************************************************************************************
;函数名: Show_point
;功能: 打印分数(进制转换)
;传递参数:
;
;函数返回:
;******************************************************************************************
Show_point proc
push ax
push bx
push cx
push dx
push si
push di
mov al, point ;二进制数
shr al, 4
mov ah, al ;AH中放高4位
mov al, point
and al, 0fh ;AL中放低4位
mov bx, offset Score ;取得目标字符串地址
add bx, 7 ;更改的末位在字串中的位置(后面保留2个0)
B1:
cmp al,09h ;低4位大于9跳往B2
ja B2
add al,30h ;低4位不大于9则加48
mov [bx],al
jmp B3
B2:
mov dl,al
add al,26h ;大于9则加38
mov [bx],al
add ah,1
B3:
mov al,ah
xor ah,ah
dec bx ;存储地址-1
cmp ax,0
jnz B1 ;不为0继续转换
push dx
push bx
mov dx , 1810h
call SetGb ;设置光标
mov bl , green
lea bp , Score ;显示分数
mov cx , 10
call Msg ;显示字符串
pop bx
pop dx
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
Show_point endp
;******************************************************************************************
;函数名: Run_snake
;功能: 蛇运动
;传递参数:
;
;函数返回:
;******************************************************************************************
run_snake proc
push ax
push bx
push cx
push dx
push si
push di
loop1:
xor cx,cx
mov cl,speed
call Delay
;call Delay
xor ax,ax
mov al,1
cmp al,gameover
jz stop
mov bx , offset Body
xor ax , ax
mov al , Len
add bx , ax ;取到蛇尾
add bx , ax
sub bx , 2
mov ax , [bx]
mov dl , ah
mov si , dx
mov dl , al
mov di , dx
call clearcut
loop2:
cmp bx , offset Body
je addhead
mov ax,[bx-2] ;循环取前一格的坐标
mov [bx],ax
sub bx,2
jmp loop2
addhead: ;增加新头部并改写数据
mov ax , [bx]
mov dx , Direction
add ah , dh ;坐标加方向
add al , dl ;坐标加方向
mov [bx] , ax ;存入头部
xor dx , dx ;为check_die准备参数si,di
mov ax , [bx]
mov dl , ah
mov si , dx
mov dl , al
mov di , dx
call check_die ;检查死亡
mov ax,[bx]
mov dl , ah
mov si , dx
mov dl , al
mov di , dx
xor ax,ax
mov al,1
cmp al,gameover
jz stop ;gameover则停止蛇运动并跳出
call check_eat ;检查吃
call show_point
call cutsnake ;画新头部
call check_key ;检查按键
jmp loop1 ;蛇运动循环
stop:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
run_snake endp
;******************************************************************************************
;函数名: Init_snake
;功能: 蛇初始化
;传递参数:
;
;函数返回:
;******************************************************************************************
Init_snake proc
push ax
push bx
push cx
push dx
push si
push di
xor ax,ax
mov al , 4
mov Len, al ;蛇的初始大小为4
mov ax,256 ;初始方向为右
mov Direction,ax
mov al,0 ;初始gameover值为0
mov gameover,al
mov al,0 ;设point为0
mov point,al
mov bx , offset Body
mov ch , 25 ;蛇的初始位置设为25,25
mov cl , 25
mov [bx] , cx
mov cx , 1
init_first: ;生成第一个蛇
mov ax , [bx]
mov dx , Direction
sub ah , dh ;坐标x减方向
sub al , dl ;坐标y减方向
add bx , 2
mov [bx] , ax ;保存一格蛇的信息
inc cl
cmp cl , Len ;循环LEN次
je init_print
jmp init_first
init_print: ;开始画第一个蛇
xor cx , cx
mov cl , Len
xor dx , dx
mov bx , offset Body
init_print_loop:
mov ax , [bx]
mov dl , ah
mov si , dx
mov dl , al
mov di , dx
call cutsnake ;画一格
dec cl
jz Init_over ;循环LEN次
add bx , 2
jmp init_print_loop
Init_over:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
Init_snake endp
;******************************************************************************************
;函数名: clear_area
;功能: 清空游戏区域
;传递参数:
;
;函数返回:
;******************************************************************************************
clear_area proc
push ax
push bx
push cx
push dx
push si
push di
xor ax,ax
xor dx,dx
smash_loop1: ;填充一遍蛇颜色(纯粹效果)
cmp ax,50
jz smash_loop1_over
smash_loop2:
cmp dx,50
jz smash_loop2_over
mov si,ax
mov di,dx
call cutsnake
inc dx
jmp smash_loop2
smash_loop2_over:
xor dx,dx
inc ax
jmp smash_loop1
smash_loop1_over:
xor ax,ax
xor dx,dx
clear_loop1: ;填充一遍黑颜色
cmp ax,50
jz clear_loop1_over
clear_loop2:
cmp dx,50
jz clear_loop2_over
mov si,ax
mov di,dx
call clearcut
inc dx
jmp clear_loop2
clear_loop2_over:
xor dx,dx
inc ax
jmp clear_loop1
clear_loop1_over:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
clear_area endp
;******************************************************************************************
;函数名: show_title
;功能: 打印游戏标题
;传递参数: 标题存在TIT1开始的串中
;
;函数返回:
;******************************************************************************************
show_title proc
push ax
push bx
push cx
push dx
push si
push di
mov ax , 0210h ;打印左上角位置
mov dx , 17 ;行数
lea bp , tit1 ;得到串
mov bl , flash
show_title_loop:
cmp dx,0
jz show_title_over
push dx
mov dx , ax
call SetGb ;设置光标
mov cx , 47 ;显示字符串,每行47个字符
call Msg
pop dx
add ah,1 ;光标位置加100H
add bp,46 ;串移动46个位置
dec dx ;循环开始的dx次数
;inc bl ;改变颜色
jmp show_title_loop
show_title_over:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
show_title endp
;******************************************************************************************
;函数名: HLine
;功能: 画横线
;传递参数:
; ah 0ch
; si 起点
; di 终点
; al 颜色号
; dx 行号
;函数返回: 空
;******************************************************************************************
HLine proc near
push ax
push bx
push cx
push dx
push si
push di
mov bx , 1 ;默认终点大于起点
push si
clc
sub si , di
jnc M1_1 ;负数
jmp M1_2 ;正数
M1_1: neg bx
M1_2: pop si
M1_3: ;循环画线
mov cx , si
int 10h
add si , bx
cmp si , di
je M1_4
jmp M1_3
M1_4:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
HLine endp
;******************************************************************************************
;函数名: VLine
;功能: 画竖线
;传递参数:
; ah 0ch
; si 起点
; di 终点
; al 颜色号
; cx 列号
;函数返回: 空
;******************************************************************************************
VLine proc near
push ax
push bx
push cx
push dx
push si
push di
mov bx , 1 ;默认终点大于起点
push si
clc
sub si , di
jnc M2_1 ;负数
jmp M2_2 ;正数
M2_1: neg bx
M2_2: pop si
M2_3: ;循环画线
mov dx , si
int 10h
add si , bx
cmp si , di
je M2_4
jmp M2_3
M2_4:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
VLine endp
;******************************************************************************************
;函数名: Rec
;功能: 画矩形
;传递参数:
; cl 颜色
; si 左边
; bx 上边
; di 右边
; dx 下边
;函数返回: 空
;******************************************************************************************
Rec proc near
push ax
push bx
push cx
push dx
push si
push di
mov ah , 0ch
mov al , cl
push dx
mov dx , bx
call HLine ;画上边线
pop dx
call HLine ;画下边线
mov cx , si
mov si , bx
push di
mov di , dx
call VLine ;画左边线
pop cx
inc di ;补右下角一点
call VLine ;画右边线
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
Rec endp
;******************************************************************************************
;函数名: Msg
;功能: 输出字符串
;传递参数:
; bl 颜色号(BL RGB IRGB)
; bp 字符串偏移地址
; cx 字符串长度
; dh/dl 行/列
;函数返回: 空
;******************************************************************************************
Msg proc near
push ax
push bx
push cx
push dx
push si
push di
push es
push ds
pop es ;将数据段ds送es , 相当于 ES : BP
mov al , 0
mov ah , 13h
mov bh , 0 ;页号?
;mov bx , 2
int 10h
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
Msg endp
;******************************************************************************************
;函数名: SetGb
;功能: 设置光标位置
;传递参数:
; dh/dl 行/列
;函数返回: 空
;******************************************************************************************
SetGb proc near
push ax
push bx
push cx
push dx
push si
push di
mov bh , 0
mov ah , 02h
int 10h
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
SetGb endp
;******************************************************************************************
qiu proc near
push cx
q0: mov ah, 0ch
int 10h
inc cx
dec num1
cmp num1, 0
jne q0
pop cx
push cx
mov num1, 4
inc dx
dec num3
cmp num3, 0
jne q0
mov num3, 3
mov num1, 4
pop cx
ret
qiu endp
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -