Dynamic netlogo 2中的动态海龟创建[contd..]
在界面选项卡中,我有一个滑块,其值范围在2到10之间。根据用户使用此滑块定义的值,应该创建多个海龟 我尝试使用多个if语句,但在后续步骤中出现问题Dynamic netlogo 2中的动态海龟创建[contd..],dynamic,netlogo,Dynamic,Netlogo,在界面选项卡中,我有一个滑块,其值范围在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 (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只海龟,但只有用户定义的海龟数量会移动,也就是说,如果用户分配了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
正如赛斯所指出的,问题很可能出现在代码的
移动部分,因为海龟是被创造出来的。正如一般评论一样,看起来您创建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
设置挑战者
创建挑战者1[设置颜色蓝色设置标签颜色蓝色设置尺寸2
设置xcor party1左/右]
创建挑战者1[设置颜色红色设置标签颜色红色设置尺寸2
设置xcor party2左/右]
如果滑块值>=3
[创建挑战者1[设置颜色绿色设置标签颜色绿色设置大小2
设置xcor party3左/右]]
如果滑块值>=4
[创建挑战者1[]
询问挑战者[]
结束
这样,你只需要为每只海龟编写一次代码,因此如果你改变了对颜色或其他东西的想法,那么更改就容易多了。正如赛斯所指出的,问题可能在于代码的移动部分,因为海龟是被创造出来的。正如一般评论一样,看起来您创建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
设置挑战者
创建挑战者1[设置颜色蓝色设置标签颜色蓝色设置尺寸2
设置xcor party1左/右]
创建挑战者1[设置颜色红色设置标签颜色红色设置尺寸2
设置xcor party2左/右]
如果滑块值>=3
[创建挑战者1[设置颜色绿色设置标签颜色绿色设置大小2
设置xcor party3左/右]]
如果滑块值>=4
[创建挑战者1[]
询问挑战者[]
结束
这样,您只需要为每只海龟编写一次代码,因此,如果您改变了对颜色或其他内容的想法,那么更改就容易多了。好的,请尝试编辑代码,使其看起来像这样:
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
这是一个标准的调试技巧。它会将猎人和聚合器的数量打印到命令中心(界面选项卡的底部)。这允许您找出代码哪里出了问题。例如,在您的案例中,它会让您知道问题是出在移动代码上还是出在为海龟分配规则的代码上
另一个诀窍是,如果您不确定是否已到达某个过程,请使用类似于打印“Got to hunt procedure”的方法。好的,请尝试编辑代码,使其看起来像这样:
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
这是一个标准的调试技巧。它会将猎人和聚合器的数量打印到命令中心(界面选项卡的底部)。这允许您找出代码哪里出了问题。例如,在您的案例中,它会让您知道问题是出在移动代码上还是出在为海龟分配规则的代码上
另一个诀窍是,如果你不确定是否达到某个过程,就使用类似于打印“Got to hunt procedure”的东西。对于基于滑块的设置来说,这是一个非常讨厌的东西
另一种方法是为每个单独设置的所有属性创建一组(全局)列表。
然后可以使用以下代码
;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
然后你只需要确保每只海龟在被要求做某事时都知道该做什么
Geerten对于基于滑块的设置来说,这个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
然后你只需要确保每只海龟在被要求做某事时都知道该做什么
Geertennetlogo有一个ifelse“如果用户使用了3,那么当我运行程序时,创建了10只海龟,但只移动了3次”-你能给我们看一下让海龟移动的代码吗?在我看来,问题就在那里,而不是在您向我们展示的代码中。到目前为止,我没有看到我们所看到的任何错误。@SethTisue:我已经将代码包含到问题中。是否有一种方法可以嵌套if-else语句。从我目前在netlogo字典中查看的情况来看,if-else语句只允许两种可能的操作,是否有编码的方法(如果条件=True,则执行此操作;如果条件=False,则执行此操作,则执行此操作)