首页 > 解决方案 > 如何随机改变 NetLogo 补丁的颜色

问题描述

我的补丁初始为绿色 (65)、黑色 (0) 或随机基色。每 5 个刻度,我希望绿色变为随机基色,黑色保持黑色,随机颜色变为绿色(65)或变为另一种随机颜色(其中一个删除 55基色)。

实现这个最终功能(使用现有随机颜色补丁的子集)是我正在努力解决的问题。

我已经尝试过 ifelse 和不同的 if 语句,指定询问 n-of somenumber 补丁变成绿色,其余变成随机颜色。这没有用。

to setup-patches  ;;PATCHES
  ask n-of 400 patches [ set pcolor 65]
  ask n-of 600 patches [ set pcolor one-of remove 55 base-colors ]
end

……

to vary-patches
  if ticks > 0 and ticks mod 5 = 0 [ 
    ask patches [ 
      if pcolor = 65 [
        set pcolor one-of remove 55 base-colors ]
      if pcolor = black [
        set pcolor 0 ]
     if pcolor = one-of remove 65 base-colors [
        set pcolor ............................................. ]
end

标签: colorsnetlogo

解决方案


我认为你或多或少在那里,这只是if pcolor = one-of remove 65 base-colors有问题的。每次评估该语句时,pcolor都会将其与生成的随机one-of列表进行比较remove 65 base-colors- 它不检查是否pcolor在该组中找到。为此,您需要member?原语。例如,下面的轻微修改应该可以满足您的需要:

to setup-patches  ;;PATCHES
  ca
  ask n-of 400 patches [ set pcolor 65]
  ask n-of 600 patches [ set pcolor one-of remove 55 base-colors ]
  reset-ticks
end

to vary-patches
  if ticks > 0 and ticks mod 5 = 0 [ 
    ask patches [ 
      if pcolor = 65 [
        set pcolor one-of remove 55 base-colors ]
     if member? pcolor remove 65 base-colors [
        set pcolor one-of base-colors
      ]
    ]
  ]
  tick
end

编辑:

to vary-patches
  if ticks > 0 and ticks mod 5 = 0 [
    ask patches [
      ifelse pcolor = 65 [
        set pcolor one-of remove 55 base-colors 
      ] [
        if member? pcolor remove 65 base-colors [
          ifelse random-float 1 < ( 1 / 3 ) [
            set pcolor one-of base-colors
          ] [
            set pcolor 65
          ]
        ]
      ]
    ]
  ]
  tick
end

推荐阅读