【问题标题】:Using patch color and while loop to command turtle movement in netlogo在 netlogo 中使用补丁颜色和 while 循环命令海龟移动
【发布时间】:2015-10-14 14:17:32
【问题描述】:

我对 netlogo 很陌生,所以这可能是一个非常基本的问题,但我被困住了。我想使用 while 循环(因此命令在整个运行过程中不断出现)和补丁颜色来指示海龟将如何移动。

如果海龟不在红斑上,我希望它继续向最近的红斑移动。

如果它在红色补丁上,我希望它留在补丁上

 while [pcolor] of patch-here != red
     [
       face min-one-of patches with [pcolor = red ] [ distance myself ]
       forward 1
     ]

 while [pcolor] of patch-here = red
     [
        stop
     ]

当我运行这个时,我收到一个错误('[pcolor] of patch-here != red' 突出显示)说“虽然预期这个输入是一个 TRUE/False 块,但得到了一个 TRUE/FALSE 。”

谁能帮帮我?

【问题讨论】:

  • 您可能还会有一些概念上的混淆。您声明您正在使用 while 循环“因此命令在整个运行过程中不断出现”。 while 循环意味着 NetLogo 将运行这组命令,直到海龟到达红色补丁为止。如果你有多只海龟,并且你在一只问海龟里面有这个……那么一只海龟会一直移动到一个红色的补丁,然后是下一个。在 NetLogo 中更典型的是使用滴答计数器并让每只海龟在每个滴答时移动一次,因此它们都在同时移动。如果同步是您想要的,请说出来,我们会回答。
  • @JenB 我确实有多只海龟,这是在一只问海龟里面,我正在尝试像你说的那样完成同步运动!

标签: wait patch netlogo turtle-graphics continue


【解决方案1】:

你只需要在while循环的条件周围抛出[],就像这样:

 while [[pcolor] of patch-here != red]
     [
       face min-one-of patches with [pcolor = red ] [ distance myself ]
       forward 1
     ]

另外,我认为您的第二个 while 循环不正确。首先,它只能运行一次(因为它只是stops)所以它也可以是if。其次,你知道你只是第一个while循环,所以你知道补丁是红色的。因此,条件将始终为真。

【讨论】:

  • 抛出括号有效,谢谢!我尝试在 while 循环中实现 if 语句 if [[p color] of patch-here = red] [ stop ],但它无法正常工作
【解决方案2】:

这是一个最小但完整的示例,它允许同时移动(按照 OP 的 cmets 中的要求)。如果您创建一个新的 NetLogo 模型并将其复制进去,那么您可以看到它正在工作。您需要在界面中添加setupgo 按钮,或者您可以在命令中心输入 setup(一次)然后输入 go(多次)让海龟移动。

to setup
  clear-all
  ask n-of 20 patches [ set pcolor red ]
  create-turtles 20 [ setxy random-xcor random-ycor ]
  reset-ticks
end

to go
  ask turtles with [ [pcolor] of patch-here != red ]
  [ face min-one-of patches with [pcolor = red ] [ distance myself ]
    forward 1
  ]
  tick
end

这里的基本概念是每个tick 都是一个时间步长。您的 go 代码包含在同一滴答中发生的所有事情的说明,然后有 tick 命令(在末尾)来推进时钟。这对于理解如何以 NetLogo 的方式思考至关重要,我建议您查看模型库中的一些示例。

向最近的红色补丁移动的实际代码是 Bryan 给你的。

【讨论】:

    【解决方案3】:

    整个代码都带有 while 条件(对于像我这样的虚拟用户;))

    to setup
      clear-all
      ask n-of 20 patches [ set pcolor red ]
      create-turtles 20 [ setxy random-xcor random-ycor ]
      reset-ticks
    end
    
    to go
      ask turtles 
      [while [[pcolor] of patch-here != red]
         [
           face min-one-of patches with [pcolor = red ] [ distance myself ]
           forward 1
         ]
      ]  
    tick
    end
    

    【讨论】: