【发布时间】: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