netlogo 2 中的动态海龟创建 [续..]

Dynamic turtle creation in netlogo 2 [contd..]

在界面选项卡中,我有一个滑块,其值介于 2 和 10 之间。根据用户使用此滑块定义的值,应该创建那么多的海龟。

我尝试使用多个 if 语句,但在后续步骤中出现问题。

if (slider-value = 2) [create2] 
if (slider-value = 3) [create3] 
if (slider-value = 4) [create4] 
if (slider-value = 5) [create5]

使用上述 if 条件创建海龟后,我必须为每只海龟分配额外的规则,如坐标位置、它们应该如何移动的规则等,我再次尝试使用多个 if 语句。但是好像不行。

例如create的子查询如下

to create2
  create-challengers 2
  ask turtle 0 [set color blue set label-color blue set size 2 
                set xcor party1-left-right ]
  ask turtle 1 [set color red set label-color red set size 2 
                set xcor party2-left-right ]

  ask turtles [ update-rule set old-mysize 0 set shape "default"]

end

创建 3 只海龟:

to create3
  create-challengers 3
  ask turtle 0 [set color blue set label-color blue set size 2 
                set xcor party1-left-right ]
  ask turtle 1 [set color red set label-color red set size 2 
                set xcor party2-left-right ]
  ask turtle 2 [set color green set label-color green set size 2 
               set xcor party3-left-right ]

  ask turtles [ update-rule set old-mysize 0 set shape "default"]

end

等等等等。

主要问题是,即使程序工作,无论用户定义了多少海龟,所有 10 个都被创建,但只有用户定义的海龟数量移动,即如果用户已经 assined 3 那么当我 运行 程序创建了 10 只海龟,但只移动了 3 次。

有没有一种方法可以像在其他编程语言中那样简单地使用 if-else 语句。

谁能提出一个方法,非常感谢帮助。

提前致谢!

创建海龟后,我为它们指定了特定的移动规则:

to update-rule  
  if (slider-values = 2) [update2]
  if (slider-values = 3) [update3]
  if (slider-values = 4) [update4]
  if (slider-values = 5) [update5]
end

我再次为 update2、update3 创建了多个子规则,这些子规则基本上针对每只乌龟,具体取决于用户定义的数量:

如果有2只海龟:

to update2 
  ask turtle 0 [set my-rule party1-rule] 
  ask turtle 1 [set my-rule party2-rule]
end

如果是 3 只乌龟:

to update3
  ask turtle 0 [set my-rule party1-rule] 
  ask turtle 1 [set my-rule party2-rule]
  ask turtle 2 [set my-rule party3-rule] 
end

移动规则如下

to adapt
  if (my-rule = "hunter") [hunt]
  ;;NB stickers do nothing
  if (my-rule = "aggregator") [aggregate]

end


to hunt                 
  ifelse (mysize > old-mysize) [jump 1] [set heading heading + 90 + random-float 180 jump 1]
  set old-mysize mysize 
end

to run-general
  create2 create3 create4 create5 create-voters update-support
  ask challengers [adapt] update-support

end

to go
  run-general

  tick

end

正如 Seth 所指出的,问题很可能出在代码的 move 部分,因为正在创建海龟。正如一般评论,看起来您创建 3 只海龟的代码与创建 2 只海龟的代码相同,除了额外的海龟。如果这通常是正确的,那么如果您使用如下格式,您的代码会容易得多:

to setup-challengers
  create-challengers 1 [set color blue set label-color blue set size 2 
                set xcor party1-left-right ]
  create-challengers 1 [set color red set label-color red set size 2 
                set xcor party2-left-right ]
  if slider-value >= 3
    [ create-challengers 1 [ set color green set label-color green set size 2
                           set xcor party3-left-right ] ]
  if slider-value >= 4
    [ create-challengers 1 [ <whatever you want number 4 to look like> ] ]

  ask challengers [<do stuff>]
end

这样你只需要为每只海龟编写一次代码,所以如果你改变了对颜色或其他东西的想法,改变起来会容易得多。

好的,尝试将您的代码编辑成如下所示:

to adapt
  type "Hunters: " print count turtles with [my-rule = "hunter"]
  type "Aggregators: " print count turtles with [my-rule = "aggregator"]
  if (my-rule = "hunter") [hunt]
  if (my-rule = "aggregator") [aggregate]
end

这是标准的调试技巧。它会将猎人和聚合器的数量打印到命令中心(界面选项卡的底部)。这使您可以找出代码出错的地方。例如,在你的情况下,它会让你知道问题是出在移动代码上还是出在给海龟分配规则的代码上。

另一个技巧是,如果您不确定是否达到某个程序,可以使用 print "Got to hunt procedure" 之类的东西。

这个 if-else 基于滑块的设置非常难看。

另一种方法是为每个人单独设置的所有属性设置一组(全局)列表。 那么你可以使用下面的代码

;assuming global_list1 and global_list2 exist

to setup
  let index 0
  create-turtles slidervalue [
                               set turtle_value1 item index global_list1
                               set turtle_value2 item index global_list2
                               set index index + 1
                             ]
end

那么你只需要确保每只海龟在被要求做某事时都知道该做什么

格尔腾