Netlogo 蛇类游戏:如何根据吃的食物量增加蛇体的长度?

Netlogo 蛇类游戏:如何根据吃的食物量增加蛇体的长度?,netlogo,Netlogo,我正在尝试重现蛇的游戏,蛇吃食物,身体增加1个单位。然而,我已经多次尝试增加身体的长度,但都没有达到我想要的效果。我试着创造另一种叫尾巴的海龟,然后在蛇后面孵化。但由于我使用了蜱,尾巴繁殖得非常快,而且它们不会产生蛇一样的效果。取而代之的是,尾巴在蛇后面的一块地方聚集在一起 我试着给蛇身上的斑点涂上颜色,但我不知道如何根据吃的食物只涂上一定量的斑点,然后逐渐添加到上面。所以现在,我尝试使用品种的尾巴,但它没有创造一个蛇的形状 这是我的密码: breed [snakes snake] breed

我正在尝试重现蛇的游戏,蛇吃食物,身体增加1个单位。然而,我已经多次尝试增加身体的长度,但都没有达到我想要的效果。我试着创造另一种叫尾巴的海龟,然后在蛇后面孵化。但由于我使用了蜱,尾巴繁殖得非常快,而且它们不会产生蛇一样的效果。取而代之的是,尾巴在蛇后面的一块地方聚集在一起

我试着给蛇身上的斑点涂上颜色,但我不知道如何根据吃的食物只涂上一定量的斑点,然后逐渐添加到上面。所以现在,我尝试使用品种的尾巴,但它没有创造一个蛇的形状

这是我的密码:

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尾巴。