我是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:有没有更好的方法来检查补丁和转龟?这种非常嵌套的设置可能是一个糟糕的选择?
答案 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
,而不是将while
与if
表达式和stop
命令相结合:
while [ any? movers with [ steps > 0 ] ] [
ask movers with [ steps > 0 ] [
; rest of your code here
]
]
最后,我认为你不需要它,但是对于复杂的控制流代码,你可以使用cf
extension向NetLogo添加类似“switch”的语句。