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

📄 snake.asm

📁 汇编贪吃蛇游戏  图形界面下的
💻 ASM
📖 第 1 页 / 共 2 页
字号:
 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 + -