【问题标题】:Snake Game: how to know if it bites itself蛇游戏:如何知道它是否咬自己
【发布时间】:2023-04-05 03:41:01
【问题描述】:

我有一个代码,它在其中移动、生长、生成食物,最后一个问题是如果蛇咬自己怎么办。

;蛇游戏无国界 .model 小 。数据 行 db 0FEh 重复 (?) col db 0FEh 重复 (?) temp_row 数据库? temp_col 数据库? ;食物变量 rand_food_col 数据库? rand_food_row 数据库? ;蛇移动延迟 延迟时间 db 1 ; 使用这个延迟时间来伪随机 col 和 row 获取食物 delay_food db 3 食物分贝'F','$' 头数据库'@','$' 蛇长分贝 5 蛇循环数据库? 颜色分贝 0Fh food_color db 0Fh 输入分贝? ;显示文本消息的变量: game_over db '游戏结束'; .stack 100h 。代码 ;///////////////////////////////////////// ///////////////////////////////// ;清除寄存器: clear_reg 过程 异或斧头,斧头 xor bx,bx xor cx,cx xor dx,dx clear_reg endp ;///////////////////////////////////////// ///////////////////////////////////// ;食物功能 random_coor_food 过程 ;col 的随机函数 mov 啊, 00h 诠释 1ah mov ax,dx xor dx,dx mov cx,20 div cx 移动,dl mov rand_food_col,al ; 行的随机函数 mov 啊, 00h 诠释 1ah mov ax,dx xor dx,dx mov cx, 71 div cx 移动,dl mov rand_food_row,al ret random_coor_food endp print_food 过程 mov dl, rand_food_row mov dh, rand_food_col 异或 bh, bh mov 啊, 02h 整数 10 小时 mov dx,抵消食品 mov 啊, 09h 整数 21 小时 ret print_food endp ;///////////////////////////////////////// ///////////////////////////////////// 左撇子 mov dl,col[0] cmp dl, 0 je resetposr 锡: 十二月 jmp 左撇子 重置位置: 电影 dl, 79 左撇子: mov col[0],dl ret 左撇子 正确的过程 mov dl,col[0] cmp dl,79 je resetposl 零: 公司dl jmp rightyie 重置位置: 移动 dl, 0 对了: mov col[0],dl ret 正确的endp upy过程 移动 dh,row[0] cmp dh,0 je resetposd 上零: 十二月 jmp uptie 重置位置: mov dh,24 上提: 移动行[0],dh ret upy endp 柔和的过程 移动 dh,row[0] cmp dh,24 jeresetposu 去零: 公司 jmp downty 重置位置: 移动 dh, 0 低调: 移动行[0],dh ret 柔软的endp 延迟过程 mov 啊, 00 整数 1Ah mov bx, dx jmp_delay: 整数 1Ah 子 dx, bx cmp dl,延迟时间 jl jmp_delay ret 延迟结束 清除附近的 proc 电影, 03h mov 啊, 00h 整数 10 小时 mov cx, 3200h ; 停止光标闪烁 mov 啊, 01h 整数 10 小时 ret 清除 endp ;///////////////////////////////////////// /////////////////////////// 游戏结束过程 呼叫清除 mov dh, 12 ; 行 mov dl, 35 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 game_over mov 啊, 09h 整数 21 小时 mov 斧头,4c00h 整数 21 小时 结束游戏结束 ;这个宏将打印整条蛇 ; r 代表行 c 代表列字符和颜色:检查 .data 的值 complete_print 宏 r,c,char,color mov dh, r mov dl, c 异或 bh mov 啊, 02h 整数 10 小时 移动,字符 移动 bh, 0 mov bl, 颜色 mov cx, 1 mov 啊, 09h 整数 10 小时 端 ;打印蛇身的功能 蛇进程 通话延迟 呼叫清除 mov bl,0 mov bh,0 打印蛇: mov dl,[col+bx] mov temp_col,dl mov dl,[行+bx] mov temp_row,dl mov snake_loop,bl 打印我: complete_print temp_row,temp_col,head,color 公司蛇循环 mov bl,snake_loop mov al,snake_loop cmp al,snake_length ;继续打印蛇的身体 jl print_snake mov bl,snake_length ;转移坐标 ;插入新坐标 转移: 十二月 bx 移动 dl ,[col+bx] mov [col + bx + 1],dl mov dl,[行 + bx] mov [行+bx+1],dl cmp bx,0 jg转移 ret 蛇尾 主进程 ;///////////////////////////////////////// /////////////////// 移动斧头,@data mov ds, ax 呼叫清除 ;初始化起始体蛇 :) 移动行[0],12 移动行[1],12 移动行[2],12 移动行[3],12 移动行[4],12 mov col[0],40 mov col[1],39 mov col[2],38 mov col[3],37 mov col[4],36 打印: 叫蛇 调用 random_coor_food 调用 print_food ;///////////////////////////////////////// /////////////////// ;移动蛇 ;初始化键盘输入: mov 啊,00h 整数 16 小时 mov 输入,'d' 获取输入: ;改变方向或继续前进 ;等待击键 ;如果未按下任何键,则输入值为 ;最后按下的键。 mov 啊, 01h 整数 16 小时 jz键 ;键被按下,输入的新值 mov 啊,00h 整数 16 小时 mov 输入,人 钥匙: ;向上 cmp 输入,'w' 犹太人 ;下 cmp 输入,'s' 杰斯 ;剩下 cmp 输入,'a' 杰阿 ;正确的 cmp 输入,'d' 杰德 jne 获取输入 ;让蛇上去 w: 打电话 jmp 拉克 ;让蛇上去 年代: 叫柔和 jmp 拉克 ;让蛇向左走 A: 叫左撇子 jmp 拉克 ;让蛇向右走 d: 打电话给正确的 jmp 拉克 拉克: ;////// 先检查蛇是否撞到身体 ;如果被击中,则游戏结束 mov bh,0 mov ah,08h ;扫描 整数 10 小时 cmp al, 头 je end_game 叫蛇 mov cl,row[0] cmp cl,rand_food_col 又来了 mov cl,col[0] cmp cl,rand_food_row 又来了 ;比较头部坐标和食物坐标 增加: ;如果 head row 和 col 等于食物的坐标。增加snake_length,然后再次生成食物。 公司蛇长度 调用 random_coor_food jmp 拉克 再次: 调用 print_food jmp 获取输入 结束游戏: 叫游戏结束 mov 斧头,4c00h 整数 21 小时 主要终端 结束主要

寻找拉克:

在 rak 之后有一部分代码用于扫描光标位置处的字符。当蛇的头撞到食物时,它就是这个代码。游戏结束了。我想知道为什么,

此代码中的坐标始终存储在数组中,可以检查头部坐标是否等于存储在数组中的坐标。循环的限制应该在snake_length左右

试着做这个循环,但我失败了

mov bl,0 hit_me_baby: mov dl,[col+bx+1] cmp col[0],dl 又来了 下一个 下一个: mov dl,[行+bx+1] cmp 行[0],dl 又来了 游戏结束 公司 cmp bl,snake_length jl hit_me_baby

另一个代码[编辑]

;贪吃蛇无国界 .model 小

.数据

行 db 0FEh 重复 (?) col db 0FEh 重复 (?)

temp_row 数据库? temp_col 数据库?

;食物变量 rand_food_col 数据库? rand_food_row 数据库?

;蛇移动延迟 延迟时间 db 1

;使用这个延迟时间来伪随机排列食物的列和行 delay_food db 3

食物数据库'O','$'

头数据库'@','$' 身体数据库'#','$' 蛇长分贝 5 蛇循环数据库?

颜色数据库 0Eh color_body 数据库 02h food_color db 0Fh

输入数据库? ;显示文本消息的变量: game_over db '游戏结束','$' start_game db 'SNAKE EATER III', '$' 消息数据库'蛇的复仇','$' press_key db '按任意键开始......', '$' rjbc db 'RJBC GAMES INC.', '$' 控制数据库'控制键:','$' go_up db'W TO GO UP','$' go_down db 'S TO GO DOWN ','$' go_left db 'A TO GO LEFT','$' go_right db 'D 向右走','$' go_otherkey db '其他要暂停的键','$' go_exit db '按 Q 退出', '$' .stack 100h 。代码 ;///////////////////////////////////////// ///////////////////////////////// ;清除寄存器: clear_reg 过程 异或斧头,斧头 xor bx,bx xor cx,cx xor dx,dx clear_reg endp ;///////////////////////////////////////// ///////////////////////////////////// ;食物功能

random_coor_food 过程 ;col的随机函数

mov 啊,00h 诠释 1ah

mov ax,dx xor dx,dx mov cx,20 div cx

mov al,dl mov rand_food_col,al

;行的随机函数

mov 啊,00h 诠释 1ah

mov ax,dx xor dx,dx mov cx, 71 div cx

mov al,dl mov rand_food_row,al

ret random_coor_food endp

print_food 过程 mov dl, rand_food_row mov dh, rand_food_col 异或 bh, bh mov 啊, 02h 整数 10 小时

mov dx,抵消食物 mov 啊, 09h 整数 21 小时 ret print_food endp

;////////////////////////////////////// //////////////////////////////////////// 左撇子 mov dl,col[0] cmp dl, 0 je resetposr

sn:
dec dl
jmp leftyie

resetposr:
mov dl, 79


leftyie:
mov col[0],dl
ret 
lefty endp

正确的过程 mov dl,col[0] cmp dl,79 je resetposl

zero: 
inc dl
jmp rightyie


resetposl:
mov dl, 0

rightyie:
mov col[0],dl
ret 

正确的结束p

upy 进程 移动 dh,row[0] cmp dh,0 je resetposd

upzero:
dec dh
jmp uptie

resetposd:
mov dh,24


uptie:
mov row[0],dh
ret

结束

柔和的过程 移动 dh,row[0] cmp dh,24 jeresetposu

去零: 公司 jmp downty

重置位置: mov dh, 0

低调: 移动行[0],dh ret 毛茸茸的结局

延迟处理 mov 啊, 00 整数 1Ah mov bx, dx

jmp_delay: 整数 1Ah 子 dx, bx cmp dl,延迟时间 jl jmp_delay

ret

延迟结束

清除附近的 proc 电影, 03h mov 啊, 00h 整数 10 小时

mov cx, 3200h  ;stop cursor blinking
mov ah, 01h
int 10h
ret

清除结束p

;////////////////////////////////////// ////////////////////////////// 游戏结束过程 呼叫清除 mov dh, 12 ; 行 mov dl, 35 ;列 异或 bh mov 啊, 02h 整数 10 小时

     mov dx, offset game_over
    mov ah, 09h
    int 21h


    mov ax, 4c00h
    int 21h

    ret

游戏结束p

start_snake_game 进程 呼叫清除 mov dh, 8 ; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时

     mov dx, offset start_game
    mov ah, 09h
    int 21h

    mov dh, 9 ;row
    mov dl, 29 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset message
    mov ah, 09h
    int 21h


    mov dh, 22 ;row
    mov dl, 27 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

         mov dx, offset press_key
    mov ah, 09h
    int 21h


    mov dh, 24 ;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

         mov dx, offset rjbc
    mov ah, 09h
    int 21h


    mov dh, 12 ;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset control
    mov ah, 09h
    int 21h

    mov dh, 13;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset go_up
    mov ah, 09h
    int 21h

    mov dh, 14;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset go_down
    mov ah, 09h
    int 21h


    mov dh, 15;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset go_left
    mov ah, 09h
    int 21h

    mov dh, 16;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset go_right
    mov ah, 09h
    int 21h

    mov dh, 17;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset go_otherkey
    mov ah, 09h
    int 21h

    mov dh, 18;row
    mov dl, 31 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset go_exit
    mov ah, 09h
    int 21h
    ret

start_snake_game 结束 ;这个宏将打印整条蛇 ; r 代表行 c 代表列字符和颜色:检查 .data 的值 complete_print 宏 r,c,char,color mov dh, r mov dl, c 异或 bh mov 啊, 02h 整数 10 小时

mov al, char
mov bh, 0
mov bl, color
mov cx, 1
mov ah, 09h
int 10h 

结束 ;打印蛇身的功能 蛇进程

call delay
call clear





mov bl,0
mov bh,0
print_snake:

mov dl,[col+bx]
mov temp_col,dl

mov dl,[row+bx]
mov temp_row,dl



mov snake_loop,bl
cmp snake_loop, 0
je printhead
jne printbody

printhead:
complete_print temp_row,temp_col,head,color
jmp finish

printbody:
complete_print temp_row,temp_col,body,color_body

finish:
inc snake_loop
mov bl, snake_loop
mov al, snake_loop
cmp al, snake_length
;continue to print the body of the snake
jl print_snake



mov bl, snake_length

;transfer the coordinates   
;to insert new coordinates

transfer:
dec bx
mov dl ,[col+bx]
mov [col + bx + 1],dl

mov dl,[row + bx]
mov [row+bx+1],dl
cmp bx,0
jg transfer
jmp return_me


return_me:
ret

蛇尾p

主进程 ;///////////////////////////////////////// /////////////////// 移动斧头,@data mov ds, ax 调用 start_snake_game ;初始化键盘输入:

mov ah,00h
int 16h
mov input, 'd'
call clear
;initialize starting body snake :)
mov row[0],12

mov row[1],12
mov row[2],12
mov row[3],12
mov row[4],12

mov col[0],40

mov col[1],39
mov col[2],38
mov col[3],37
mov col[4],36

print:  
call snake
call random_coor_food
call print_food

;////////////////////////////////////// ////////////////////// ;移动蛇

getinput:
;to change direction or to keep going
; wait for keystroke
; if no key is pressed, value of input will be 
;last key pressed.
    mov ah, 01h
    int 16h
    jz key

;key is pressed, new value of input
    mov ah,00h
    int 16h
    mov input, al

key: 
;UP
cmp input, 'w'
je w 
;DOWN
cmp input, 's'
je s
;LEFT
cmp input, 'a'
je a 
;RIGHT
cmp input, 'd'
je d

cmp input, 'q'
je end_game

jne getinput

;make the snake go up
w:

call upy
jmp rak

;make the snake go up
s:

call downy
jmp rak

;make the snake go left
a:

call lefty
jmp rak

;make the snake go right
d:

call righty
jmp rak



rak:


 comment @
 mov bh,0
mov ah,08h ;scan
int 10h
cmp al, body
je end_game
cmp al, food
je increase
@


call snake  


;compare the coordinates of head to the coordinates of the food
;kinda made a mistake over here. 
;#houston, we got a problem 
mov cl,row[0]
cmp cl,rand_food_col
jne again

mov cl,col[0]
cmp cl,rand_food_row
jne again

;////// 先检查蛇是否撞到身体 ;如果被击中,则游戏结束 评论 @ mov bl,0 hit_me_baby: mov dl,[col+bx+1] cmp col[0],dl 又来了 mov dl,[行+bx+1] cmp 行[0],dl 又来了 je end_game 公司 cmp bl,snake_length jl hit_me_baby

@ increase: ;if the head row and col is equal to the coordinates of the food. increase snake_length then generate food again. inc snake_length call random_coor_food jmp rak again: call print_food jmp getinput end_game: call gameover call clear jmp end_game mov ax, 4c00h int 21h

主要终端 结束主要

【问题讨论】:

  • 尝试循环。这是一个错误:(((
  • 你在正确的轨道上:你可以得到光标位置的字符,或者你可以有一个数组,其中包含蛇身上每个字符的 X、Y 坐标。第一个更容易,但你不能将蛇的角色用于其他任何事情。另一方面,你可以忽略它,我的意思是,让蛇自己移动,毕竟,这就是蛇在现实生活中所做的。
  • 但这不是蛇游戏吧?哈哈哈。
  • 但这不是蛇游戏吧?哈哈哈。尝试用每个字符的坐标做数组。没有成功:(你能帮我吗?我删除了我的算法不记得我是怎么做到的。如果我可以再写一次,我会尝试在这里评论它。尝试使用光标位置的字符不起作用或者不知道它为什么会结束立即游戏。
  • 获取光标位置的字符,如果它是星号(或您用于蛇身体的任何字符),请忽略它。这样蛇就不会咬自己了。

标签: assembly


【解决方案1】:

这是您的代码的最后编辑版本,我做了两个小改动:首先,在标签 rak: 下方,我添加了另一个与跳跃增加的食物比较:,第二,在标签增加:下面,我将跳转注释为拉克,这里是:

;Snake Game without Borders
.model small

.data

row db 0FEh dup (?)
col db 0FEh dup (?)

temp_row db ?
temp_col db ?

;variables for food
rand_food_col db ?
rand_food_row db ?


;delay for snake movement
delaytime db 1

;use this delay time to pseudorandom the col and row for food
delay_food db 3


food db 'F' ,'$'


head db '@' ,'$'
snake_length db 5
snake_loop db ?

color db 0Fh
food_color db 0Fh

input db ?
;variables to display text messages:
game_over db 'GAME OVER';
.stack 100h
.code
;///////////////////////////////////////////////////////////////////////////////////////
;clear registers:
clear_reg proc
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
clear_reg endp
;//////////////////////////////////////////////////////////////////////////////////////////////
;food functions 

random_coor_food proc
;random function for col

mov ah, 00h
int 1ah

mov ax,dx
xor dx,dx
mov cx,20
div cx

mov al,dl
mov rand_food_col,al

;random function for row

mov ah, 00h
int 1ah

mov ax,dx
xor dx,dx
mov cx, 71
div cx

mov al,dl
mov rand_food_row,al

ret
random_coor_food endp


print_food proc
mov dl, rand_food_row
mov dh, rand_food_col
xor bh,bh
mov ah, 02h
int 10h

mov dx, offset food
mov ah, 09h
int 21h
ret
print_food endp

;//////////////////////////////////////////////////////////////////////////////////////////////
lefty proc
    mov dl,col[0]
    cmp dl, 0
    je resetposr

    sn:
    dec dl
    jmp leftyie

    resetposr:
    mov dl, 79


    leftyie:
    mov col[0],dl
    ret 
    lefty endp

righty proc
    mov dl,col[0]
    cmp dl,79
    je resetposl

    zero: 
    inc dl
    jmp rightyie


    resetposl:
    mov dl, 0

    rightyie:
    mov col[0],dl
    ret 
righty endp


upy proc
    mov dh,row[0]
    cmp dh,0
    je resetposd

    upzero:
    dec dh
    jmp uptie

    resetposd:
    mov dh,24


    uptie:
    mov row[0],dh
    ret


upy endp

downy proc
mov dh,row[0]
cmp dh,24
je resetposu

gozero:
inc dh
jmp downty

resetposu:
mov dh, 0

downty:
mov row[0],dh
ret 
downy endp

delay proc
    mov ah, 00
    int 1Ah
    mov bx, dx

jmp_delay:
    int 1Ah
    sub dx, bx
    cmp dl, delaytime
    jl jmp_delay

    ret
delay endp


clear proc near
    mov al, 03h 
    mov ah, 00h
    int 10h

    mov cx, 3200h  ;stop cursor blinking
    mov ah, 01h
    int 10h
    ret
clear endp

;////////////////////////////////////////////////////////////////////////////////
gameover proc
    call clear
    mov dh, 12 ;row
    mov dl, 35 ;column
    xor bh, bh
    mov ah, 02h
    int 10h 

     mov dx, offset game_over
    mov ah, 09h
    int 21h


    mov ax, 4c00h
    int 21h
gameover endp
;this macro will print the whole snake 
; r is for row c is for column char and color: check .data for values
complete_print macro r,c,char,color
    mov dh, r
    mov dl, c
    xor bh, bh
    mov ah, 02h
    int 10h 

    mov al, char
    mov bh, 0
    mov bl, color
    mov cx, 1
    mov ah, 09h
    int 10h 
endm
;function to print the snake body
snake proc

    call delay
    call clear


    mov bl,0
    mov bh,0
    print_snake:

    mov dl,[col+bx]
    mov temp_col,dl

    mov dl,[row+bx]
    mov temp_row,dl

    mov snake_loop,bl

    print_me:
    complete_print temp_row,temp_col,head,color
    inc snake_loop
    mov bl, snake_loop
    mov al, snake_loop
    cmp al, snake_length
    ;continue to print the body of the snake
    jl print_snake


    mov bl, snake_length

    ;transfer the coordinates   
    ;to insert new coordinates

    transfer:
    dec bx
    mov dl ,[col+bx]
    mov [col + bx + 1],dl

    mov dl,[row + bx]
    mov [row+bx+1],dl
    cmp bx,0
    jg transfer



    ret
snake endp

main proc
;//////////////////////////////////////////////////////////////////////
      mov ax, @data
    mov ds, ax
    call clear
    ;initialize starting body snake :)
    mov row[0],12

    mov row[1],12
    mov row[2],12
    mov row[3],12
    mov row[4],12

    mov col[0],40

    mov col[1],39
    mov col[2],38
    mov col[3],37
    mov col[4],36

    print:  
    call snake
    call random_coor_food
    call print_food

;//////////////////////////////////////////////////////////////////////
; moving the snake
    ;initialize the keyboard input:

    mov ah,00h
    int 16h
    mov input, 'd'

    getinput:
    ;to change direction or to keep going
    ; wait for keystroke
    ; if no key is pressed, value of input will be 
    ;last key pressed.
        mov ah, 01h
        int 16h
        jz key

    ;key is pressed, new value of input
        mov ah,00h
        int 16h
        mov input, al

    key: 
    ;UP
    cmp input, 'w'
    je w 
    ;DOWN
    cmp input, 's'
    je s
    ;LEFT
    cmp input, 'a'
    je a 
    ;RIGHT
    cmp input, 'd'
    je d

    jne getinput

    ;make the snake go up
    w:

    call upy
    jmp rak

    ;make the snake go up
    s:

    call downy
    jmp rak

    ;make the snake go left
    a:

    call lefty
    jmp rak

    ;make the snake go right
    d:

    call righty
    jmp rak



    rak:
    ;////// check first if snake hits the body
    ;if hit, then game over
    mov bh,0
    mov ah,08h ;scan
    int 10h
    cmp al, head
    je end_game
    cmp al, food
    je increase




    call snake  
    mov cl,row[0]
    cmp cl,rand_food_col
    jne again

    mov cl,col[0]
    cmp cl,rand_food_row
    jne again


    ;compare the coordinates of head to the coordinates of the food


    increase:       
    ;if the head row and col is equal to the coordinates of the food. increase snake_length then generate food again.
    inc snake_length
    call random_coor_food

;    jmp rak

    again:
    call print_food
    jmp getinput



    end_game:
    call gameover

    mov ax, 4c00h
    int 21h

main endp
end main

解释:in increase:,当它跳回rak时,光标位置的字符是'@',所以,我们要做的不是跳到rak而是getinput。

【讨论】:

  • 什么?这不会发生在我身上!检查。 . .
  • 我将在这里上传一个新代码。我做的那个,我改变了身体特征。试试看。
  • 你是对的。并非在所有情况下都会发生。让我们这样做吧,Doomy,我明天会修好它,因为在哥斯达黎加大约是下午 6 点,我必须马上离开。
  • 哈哈哈,我试试看,我必须在午夜之前提交,这里已经是早上 7:49 了 :) 谢谢你的时间 :)
  • 我想我知道问题出在哪里。它的光标位置。尝试使光标位置可见。它总是在食物旁边。不在头部
【解决方案2】:

这是代码,去试试吧。

;蛇游戏无国界 .model 小 。数据 行 db 0FEh 重复 (?) col db 0FEh 重复 (?) temp_row 数据库? temp_col 数据库? ;食物变量 rand_food_col 数据库? rand_food_row 数据库? ;蛇移动延迟 延迟时间 db 1 ; 使用这个延迟时间来伪随机 col 和 row 获取食物 delay_food db 3 食物分贝'O','$' 头数据库'@','$' 身体数据库'#','$' 蛇长分贝 5 蛇循环数据库? 颜色分贝 0Eh color_body 数据库 02h food_color db 0Fh 输入分贝? ;显示文本消息的变量: game_over db '游戏结束','$' start_game db 'SNAKE EATER III', '$' 消息数据库'蛇的复仇','$' press_cont db '按任意键查看控件', '$' press_key db '按任意键开始......', '$' rjbc db 'RJBC GAMES INC.', '$' 控制数据库'控制键:','$' go_up db'W TO GO UP','$' go_down db 'S TO GO DOWN ','$' go_left db 'A TO GO LEFT','$' go_right db 'D 向右走','$' go_otherkey db '其他要暂停的键','$' go_exit db '按 Q 退出', '$' go_warning db '祝你好运,SOLID SNAKE 速度非常快', '$' .stack 100h 。代码 ;///////////////////////////////////////// ///////////////////////////////// ;清除寄存器: clear_reg 过程 异或斧头,斧头 xor bx,bx xor cx,cx xor dx,dx clear_reg endp ;///////////////////////////////////////// ///////////////////////////////////// ;食物功能 random_coor_food 过程 ;col 的随机函数 mov 啊, 00h 诠释 1ah mov ax,dx xor dx,dx mov cx,20 div cx 移动,dl mov rand_food_col,al ; 行的随机函数 mov 啊, 00h 诠释 1ah mov ax,dx xor dx,dx mov cx, 71 div cx 移动,dl mov rand_food_row,al ret random_coor_food endp print_food 过程 mov dl, rand_food_row mov dh, rand_food_col 异或 bh, bh mov 啊, 02h 整数 10 小时 mov dx,抵消食品 mov 啊, 09h 整数 21 小时 ret print_food endp ;///////////////////////////////////////// ///////////////////////////////////// 左撇子 mov dl,col[0] cmp dl, 0 je resetposr 锡: 十二月 jmp 左撇子 重置位置: 电影 dl, 79 左撇子: mov col[0],dl ret 左撇子 正确的过程 mov dl,col[0] cmp dl,79 je resetposl 零: 公司dl jmp rightyie 重置位置: 移动 dl, 0 对了: mov col[0],dl ret 正确的endp upy过程 移动 dh,row[0] cmp dh,0 je resetposd 上零: 十二月 jmp uptie 重置位置: mov dh,24 上提: 移动行[0],dh ret upy endp 柔和的过程 移动 dh,row[0] cmp dh,24 jeresetposu 去零: 公司 jmp downty 重置位置: 移动 dh, 0 低调: 移动行[0],dh ret 柔软的endp 延迟过程 mov 啊, 00 整数 1Ah mov bx, dx jmp_delay: 整数 1Ah 子 dx, bx cmp dl,延迟时间 jl jmp_delay ret 延迟结束 清除附近的 proc 电影, 03h mov 啊, 00h 整数 10 小时 mov cx, 3200h ; 停止光标闪烁 mov 啊, 01h 整数 10 小时 ret 清除 endp ;///////////////////////////////////////// /////////////////////////// 游戏结束过程 呼叫清除 mov dh, 12 ; 行 mov dl, 35 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 game_over mov 啊, 09h 整数 21 小时 mov 斧头,4c00h 整数 21 小时 ret 结束游戏结束 start_snake_game 过程 呼叫清除 mov dh, 10 ; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 start_game mov 啊, 09h 整数 21 小时 mov dh, 11 ; 行 mov dl, 29 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移信息 mov 啊, 09h 整数 21 小时 mov dh, 20 ; 行 mov dl, 26 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, offset press_cont mov 啊, 09h 整数 21 小时 mov dh, 24 ; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 rjbc mov 啊, 09h 整数 21 小时 ret start_snake_game endp control_view 过程 呼叫清除 mov dh, 10 ; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx,偏移控制 mov 啊, 09h 整数 21 小时 mov dh, 11;行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 go_up mov 啊, 09h 整数 21 小时 mov dh, 12; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 go_down mov 啊, 09h 整数 21 小时 mov dh, 13; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 go_left mov 啊, 09h 整数 21 小时 mov dh, 14; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 go_right mov 啊, 09h 整数 21 小时 mov dh, 15; 行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 go_otherkey mov 啊, 09h 整数 21 小时 mov dh, 16;行 mov dl, 31 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 go_exit mov 啊, 09h 整数 21 小时 mov dh, 19 ; 行 mov dl, 20 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, 偏移 go_warning mov 啊, 09h 整数 21 小时 mov dh, 21 ; 行 mov dl, 25 ;列 异或 bh mov 啊, 02h 整数 10 小时 mov dx, offset press_key mov 啊, 09h 整数 21 小时 ret control_view endp ;这个宏将打印整条蛇 ; r 代表行 c 代表列字符和颜色:检查 .data 的值 complete_print 宏 r,c,char,color mov dh, r mov dl, c 异或 bh mov 啊, 02h 整数 10 小时 移动,字符 移动 bh, 0 mov bl, 颜色 mov cx, 1 mov 啊, 09h 整数 10 小时 端 ;打印蛇身的功能 蛇进程 通话延迟 呼叫清除 mov bl,0 mov bh,0 打印蛇: mov dl,[col+bx] mov temp_col,dl mov dl,[行+bx] mov temp_row,dl mov snake_loop,bl cmp 蛇循环,0 je 打印头 jne印刷体 打印头: complete_print temp_row,temp_col,head,color jmp 完成 印刷体: complete_print temp_row,temp_col,body,color_body 结束: 公司蛇循环 mov bl,snake_loop mov al,snake_loop cmp al,snake_length ;继续打印蛇的身体 jl print_snake mov bl,snake_length ;转移坐标 ;插入新坐标 转移: 十二月 bx 移动 dl ,[col+bx] mov [col + bx + 1],dl mov dl,[行 + bx] mov [行+bx+1],dl cmp bx,0 jg转移 jmp return_me 返回我: ret 蛇尾 主进程 ;///////////////////////////////////////// /////////////////// 移动斧头,@data mov ds, ax 调用 start_snake_game mov 啊,00h 整数 16 小时 调用 control_view ;初始化键盘输入: mov 啊,00h 整数 16 小时 mov 输入,'d' 呼叫清除 ;初始化起始体蛇 :) 移动行[0],12 移动行[1],12 移动行[2],12 移动行[3],12 移动行[4],12 mov col[0],40 mov col[1],39 mov col[2],38 mov col[3],37 mov col[4],36 打印: 叫蛇 调用 random_coor_food 调用 print_food ;///////////////////////////////////////// /////////////////// ;移动蛇 获取输入: ;改变方向或继续前进 ;等待击键 ;如果未按下任何键,则输入值为 ;最后按下的键。 mov 啊, 01h 整数 16 小时 jz键 ;键被按下,输入的新值 mov 啊,00h 整数 16 小时 mov 输入,人 钥匙: ;向上 cmp 输入,'w' 犹太人 ;下 cmp 输入,'s' 杰斯 ;剩下 cmp 输入,'a' 杰阿 ;正确的 cmp 输入,'d' 杰德 cmp 输入,'q' je end_game jne 获取输入 ;让蛇上去 w: 打电话 jmp 拉克 ;让蛇上去 年代: 叫柔和 jmp 拉克 ;让蛇向左走 A: 叫左撇子 jmp 拉克 ;让蛇向右走 d: 打电话给正确的 jmp 拉克 拉克: ;////// 扫描 ;当前位置有一个字符 ;如果有,跳转到end_game mov bh,0 mov ah,08h ;扫描 整数 10 小时 cmp al, 身体 je end_game 继续: 叫蛇 ;比较头部坐标和食物坐标 ; 有点在这里犯了错误。 ;#休斯顿,我们遇到了问题 mov cl,row[0] cmp cl,rand_food_col 又来了 mov cl,col[0] cmp cl,rand_food_row 又来了 ;////// 先检查蛇是否撞到身体 ;如果被击中,则游戏结束 评论 @ mov bl,0 hit_me_baby: mov dl,[col+bx+1] cmp col[0],dl 又来了 mov dl,[行+bx+1] cmp 行[0],dl 又来了 je end_game 公司 cmp bl,snake_length jl hit_me_baby @ 增加: ;如果 head row 和 col 等于食物的坐标。增加snake_length,然后再次生成食物。 公司蛇长度 调用 random_coor_food 再次: 调用 print_food ; 将光标位置设置在头部 移动 dh,行 [0] mov dl, col[0] 异或 bh, bh mov 啊,02h 整数 10 小时 jmp 获取输入 结束游戏: 呼叫清除 叫游戏结束 mov 斧头,4c00h 整数 21 小时 主要终端 结束主要

顺便说一句,如果你按相反的方向游戏结束:) 说你的最后一个键是 d 然后你按 a,它将结束游戏:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多