Netlogo 蛇类游戏:如何根据吃的食物量增加蛇体的长度?
我正在尝试重现蛇的游戏,蛇吃食物,身体增加1个单位。然而,我已经多次尝试增加身体的长度,但都没有达到我想要的效果。我试着创造另一种叫尾巴的海龟,然后在蛇后面孵化。但由于我使用了蜱,尾巴繁殖得非常快,而且它们不会产生蛇一样的效果。取而代之的是,尾巴在蛇后面的一块地方聚集在一起 我试着给蛇身上的斑点涂上颜色,但我不知道如何根据吃的食物只涂上一定量的斑点,然后逐渐添加到上面。所以现在,我尝试使用品种的尾巴,但它没有创造一个蛇的形状 这是我的密码:Netlogo 蛇类游戏:如何根据吃的食物量增加蛇体的长度?,netlogo,Netlogo,我正在尝试重现蛇的游戏,蛇吃食物,身体增加1个单位。然而,我已经多次尝试增加身体的长度,但都没有达到我想要的效果。我试着创造另一种叫尾巴的海龟,然后在蛇后面孵化。但由于我使用了蜱,尾巴繁殖得非常快,而且它们不会产生蛇一样的效果。取而代之的是,尾巴在蛇后面的一块地方聚集在一起 我试着给蛇身上的斑点涂上颜色,但我不知道如何根据吃的食物只涂上一定量的斑点,然后逐渐添加到上面。所以现在,我尝试使用品种的尾巴,但它没有创造一个蛇的形状 这是我的密码: breed [snakes snake] breed
breed [snakes snake]
breed [foods food]
breed [tails tail]
tails-own [age]
to game2-setup
create-snakes 1 [
set shape "snake"
set color green
]
create-foods 10 [
setxy random-xcor random-ycor
if [pcolor] of patch-here != black [move-to one-of patches with [pcolor =
black]]
set shape "plant"
set color red]
end
to game2-go
;moves the snake
ask snakes [
if ticks mod 350 = 0 [fd 1]
]
;to kill snake if it bumps into a wall/itself
ask snakes
[if [pcolor] of patch-ahead 1 != black [
user-message "Game over" ]
]
;if the snake and food is on the same patch the food is eaten
ask patches [ if any? snakes-here and any? foods-here
[ask foods-here [die]
set points points + 1
set energy energy + 1
]]
;grows the tail of the turtle based on the amount of food eaten
ask tails
[set age age + 1
if age = 10 [die]
]
;regrows the food
if count foods < 10
[create-foods 1
[setxy random-xcor random-ycor
if [pcolor] of patch-here != black [move-to one-of patches with [pcolor =
black]]
set shape "plant"
set color red]
]
tick
end
我认为蛇的尾巴会跟在蛇头后面,并根据吃的食物量增加。解决这类问题的一个方便方法是使用链接连接构成蛇的部分 下面的代码应该可以帮助您开始。我不会带您了解整个过程,但一般的方法是使用定向链接将每个尾部段连接到前面的段 当添加一个新的尾段时,我们递归地查找一个尚未具有in链接的段,从那里填充一个新的尾段,并将其连接到其父段 移动时,每个尾部线段都面向其连接的线段,并在其一个面片内移动。请注意,我们如何使用foreach排序尾部而不仅仅是询问尾部,以确保分段按其创建顺序移动
breed [snakes snake]
breed [tails tail]
breed [foods food]
to setup
clear-all
create-snakes 1 [ set color green ]
ask n-of 10 patches [ sprout-foods 1 [ set shape "plant" ] ]
reset-ticks
end
to go
ask snakes [
right random 45
left random 45
forward 1
if any? foods-here [
ask one-of foods-here [ die ]
add-tail
]
]
foreach sort tails [ t ->
ask t [
let segment-ahead one-of out-link-neighbors
face segment-ahead
forward max list 0 (distance segment-ahead - 1)
]
]
tick
end
to add-tail
ifelse any? in-link-neighbors [
ask one-of in-link-neighbors [ add-tail ]
] [
hatch-tails 1 [ create-link-to myself ]
]
end
解决这类问题的一种方便方法是使用链接来连接构成蛇的各个部分 下面的代码应该可以帮助您开始。我不会带您了解整个过程,但一般的方法是使用定向链接将每个尾部段连接到前面的段 当添加一个新的尾段时,我们递归地查找一个尚未具有in链接的段,从那里填充一个新的尾段,并将其连接到其父段 移动时,每个尾部线段都面向其连接的线段,并在其一个面片内移动。请注意,我们如何使用foreach排序尾部而不仅仅是询问尾部,以确保分段按其创建顺序移动
breed [snakes snake]
breed [tails tail]
breed [foods food]
to setup
clear-all
create-snakes 1 [ set color green ]
ask n-of 10 patches [ sprout-foods 1 [ set shape "plant" ] ]
reset-ticks
end
to go
ask snakes [
right random 45
left random 45
forward 1
if any? foods-here [
ask one-of foods-here [ die ]
add-tail
]
]
foreach sort tails [ t ->
ask t [
let segment-ahead one-of out-link-neighbors
face segment-ahead
forward max list 0 (distance segment-ahead - 1)
]
]
tick
end
to add-tail
ifelse any? in-link-neighbors [
ask one-of in-link-neighbors [ add-tail ]
] [
hatch-tails 1 [ create-link-to myself ]
]
end
在你想要的和你拥有的之间有很多工作需要做。似乎最好的方法是模拟你的蛇已经吃掉了5种植物。如果是这样的话,这条蛇是如何移动的?然后,如果蛇吃了一种植物,就在尾巴原来所在的地方产卵。为此,您可能需要跟踪蛇的尾巴以及之前的xcor/ycor尾巴。在您想要的和您拥有的之间需要做很多工作。似乎最好的方法是模拟你的蛇已经吃掉了5种植物。如果是这样的话,这条蛇是如何移动的?然后,如果蛇吃了一种植物,就在尾巴原来所在的地方产卵。为此,您可能需要跟踪蛇的尾巴以及之前的xcor/ycor尾巴。