首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使两个品种的海龟在同一个巢穴中交替

如何使两个品种的海龟在同一个巢穴中交替
EN

Stack Overflow用户
提问于 2019-05-09 15:12:14
回答 1查看 89关注 0票数 1

在这个蚂蚁模型中,我有两个品种的海龟:未成年人和觅食者。现在,所有的觅食者都会出来一个文件,后面跟着所有的未成年人(这是通过延迟初始离开来完成的)。我希望他们出来的时候轮流出来,直到我没有觅食者或没有未成年人。

我试着把问海龟(如果谁的>=停止了)作为围棋程序的第一步,但这使得所有的海龟都从巢中爆炸,而不是留下一个文件。

代码语言:javascript
复制
to go 
  ask foragers
  [ if who >= ticks [ stop ]  ;; delay initial departure
    wiggle
    fd 1 ]
  ask minors
  [ if who >= ticks [ stop ]  ;; delay initial departure
    ifelse color = white
    [ look-for-transporter ]
    [ hitchhike ]]
  tick
end

我想让觅食者和未成年人在离开巢穴时交替觅食。现在,所有的觅食者都在未成年人之前离开了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-09 23:25:29

who编号分配给每个海龟,因为它是创建的,并且独立于品种。因此,如果您创建了10个觅食器,然后创建了10个未成年人,则您的觅食者的who值将从0到9,而您的未成年人的who值将从10到19。因此,无论您首先创建哪个品种(因此具有最低的who编号范围),都将根据您的if who >= ticks...代码开始移动。为了使基于who的代码能够满足您的需要,您必须交替创建您的觅食者和未成年人。

但是,通常使用who数字有点限制--您可能会发现使用自己的变量或以其他方式控制这些变量会更容易。例如,下面的设置在世界最左边创建了一个nest-patch,并将一些觅食者和未成年人移动到该修补程序中。海龟有一个名为at-nest?的布尔变量,您可以使用它来控制哪些海龟可以移动:

代码语言:javascript
复制
breed [ foragers forager ]
breed [ minors minor ]

globals [ last-left nest-patch ]
turtles-own [ at-nest? ]

to setup
  ca
  create-foragers 10 [ set color red ]
  create-minors 20 [ set color blue ]
  set nest-patch patch min-pxcor 0
  ask nest-patch [ set pcolor yellow ]
  ask turtles [
    move-to nest-patch
    set heading 90
    set at-nest? true
    pd
  ]
  set last-left minors
  reset-ticks
end

最初,所有海龟的at-nest?设置为真。然后,您可以在您要求将其at-nest?设置为true的每个品种的个体之间进行交替。请看下面的示例,它在注释中有一些更详细的内容:

代码语言:javascript
复制
to go
  ; If there are any turtles on the nest patch with at-nest? set to true
  if any? ( turtles-on nest-patch ) with [ at-nest? ] [
    ; If both breeds are present on the nest patch, alternate back and forth
    ; between breeds to set at-nest? to false
    ifelse ( length remove-duplicates [breed] of turtles-on nest-patch = 2 ) [
      set last-left ifelse-value ( last-left = minors ) [ foragers ] [ minors ]
      ask one-of last-left with [ at-nest? ] [
        set at-nest? false
      ]
    ] [
      ; Otherwise, just ask one-of whichever breed is left to set at-nest? to false
      ask one-of turtles-on nest-patch [
        set at-nest? false
      ]   
    ]
  ]

  ; Ask any turtles who have at-nest? set to false to move
  ask turtles with [ not at-nest? ] [
    if heading != 90 [
      rt ifelse-value ( breed = minors ) [ 12 ] [ -12 ]
    ]
    if xcor > 0 and heading = 90 [
      rt ifelse-value ( breed = minors ) [ 12 ] [ -12 ]
    ]
    fd 1
  ]      
  tick
end

该代码输出的内容如下:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56062546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档