在NetLogo中嵌套ifelse的麻烦

时间:2016-08-11 10:22:27

标签: if-statement netlogo

我是NetLogo的新手。一般来说编程也是一个新手。我在这里读了很多有用的东西。现在我凭借自己的知识达到了最低点,并决定问我的第一个问题。无论我听起来多么愚蠢:

我尝试让一些海龟移动并避免NetLogo中的某些补丁。我尝试使用以下嵌套ifelse对此进行归档:

loop [
ifelse any? Movers with [steps > 0]
[     
 ask Movers with [steps > 0]
[
   ifelse patch-ahead 1 is-Patch? [
     ifelse not any? turtles-on patch-ahead 1 [
       ifelse [pcolor] of patch-ahead 1 != white [
         ifelse [pcolor] of patch-ahead 1 != brown [
fd 1 set steps steps - 1][turnTurtle]
]
       [turnTurtle]
]
     [turnTurtle]
]
   [turnTurtle]
]
]
[stop]
]

循环应该运行,直到每个Mover移动一次。这就是我跟踪使用“steps”变量的内容。如果任何条件为false,它将调用一个名为“turnTurtle”的过程。转动的海龟将在下一轮循环中尝试移动或再次转弯。

当我尝试运行代码时,出现“预期关键字”错误。为什么呢?

ProQuestion:有没有更好的方法来检查补丁和转龟?这种非常嵌套的设置可能是一个糟糕的选择?

1 个答案:

答案 0 :(得分:3)

  

当我尝试运行代码时,出现“预期关键字”错误。为什么呢?

我没有从您发布的代码段中收到该错误。 (一般来说,你应该尝试发布你的代码的简化但“完整”的例子,有人可以粘贴到NetLogo中并使用。很多时候,只是尝试创建这样的例子将帮助你解决问题。)

我得到的是“预期的常量”编译错误,因为patch-ahead 1 is-Patch?被反转。它应该是:

is-patch? patch-ahead 1 

也许这是你问题的根源?

  

有没有更好的方法来检查补丁和转龟?这种非常嵌套的设置可能是一个糟糕的选择?

正如您所看到的,深层嵌套代码是不受欢迎的,通常可以避免。在您的情况下,可以通过使用and

在单个表达式中组合条件来实现
ifelse is-patch? patch-ahead 1
  and not any? turtles-on patch-ahead 1
  and [ pcolor ] of patch-ahead 1 != white
  and [ pcolor ] of patch-ahead 1 != brown
[
  fd 1
  set steps steps - 1
] [ turnTurtle ]

更多评论:

您可以使用member?组合它们,而不是在两个单独的表达式中检查!= white!= brown

[ not member? pcolor [ white brown ] ] of patch-ahead 1

您可以只使用loop,而不是将whileif表达式和stop命令相结合:

while [ any? movers with [ steps > 0 ] ] [     
  ask movers with [ steps > 0 ] [
    ; rest of your code here
  ]
]

最后,我认为你不需要它,但是对于复杂的控制流代码,你可以使用cf extension向NetLogo添加类似“switch”的语句。