Loops 循环到Netlogo中的修补程序编号

Loops 循环到Netlogo中的修补程序编号,loops,while-loop,netlogo,Loops,While Loop,Netlogo,我试图在Netlogo上模拟空间模式。我已经编写了一个代码,根据用户设置的行数和列数,将景观分成相等的部分。例如,在本例中,3 X 3景观由9个“营地”组成: 我试图为每个营地设置一个不同的plabel,在本例中编号为0到8,以确定这是哪个营地。我尝试过使用循环来设置,但意外的问题正在发生 to set-camp-number let startcol max-pxcor / no-of-cols let startrow max-pycor / no-of-rows let

我试图在Netlogo上模拟空间模式。我已经编写了一个代码,根据用户设置的行数和列数,将景观分成相等的部分。例如,在本例中,3 X 3景观由9个“营地”组成:

我试图为每个营地设置一个不同的plabel,在本例中编号为0到8,以确定这是哪个营地。我尝试过使用循环来设置,但意外的问题正在发生

to set-camp-number

  let startcol max-pxcor / no-of-cols 
  let startrow max-pycor / no-of-rows
  let t 1
  set camp-number 0
  while [ t <= no-of-cols ] [
    set a startcol * t
    ask patches with [ pxcor <= a and pxcor >= a - startcol ] [ 
      let k 1
      loop [
        if k > no-of-rows [ stop ]
        set b startrow * k
        ask patches with [ pxcor <= a and pxcor >= a - startcol and pycor <= b and pycor >= b - startrow ] [
          set plabel camp-number ]
          set camp-number camp-number + 1
          set k k + 1 ]]
   set t t + 1 ]

end
设置营地编号
让startcol最大pxcor/cols数量
让startrow max pycor/行数
让t 1
设置营地编号0
而[t行数[停止]
设置b startrow*k
使用[pxcor=a-startcol和pycor=b-startrow]询问补丁程序[
设置plabel营地编号]
设置营地编号营地编号+1
设置k+1]]
设置t+1]
结束
而不是得到我想要的(在这个场景中,每个营地的补丁都将自己标记为0到8),营地编号似乎自己在一个循环中运行,结果是plabel的值非常大


我尝试过其他方法,但这似乎是最容易理解的,但我知道在Netlogo中循环有时会很困难。我尝试实现foreach命令,因为循环似乎是标记补丁的一种非常麻烦的方法(必须有另一种方法吗?),但我被卡住了。我非常感谢你的帮助。谢谢大家!

为什么不直接说let_x pxcor-min pxcor?y型也一样。我认为没有必要传递对自身的引用。这是一个更有效的代码!我对最后一行后面的逻辑有点纠结,但现在这更有意义了!谢谢你,艾伦@马特萨:是的,你可以在这里做。我倾向于编写没有副作用的程序,即使在NetLogo中也是如此。
globals [n-rows n-cols] ; to be set by user in your code

to setup
  ca
  set n-rows 3 
  set n-cols 3
  ask patches [set plabel category self]
end

to-report category [#patch]
  let _colstep world-width / n-cols
  let _rowstep int (world-height / n-rows)
  let _x [pxcor] of #patch - min-pxcor
  let _y [pycor] of #patch - min-pycor
  let _rownum int (_y / _rowstep)
  let _colnum int (_x / _colstep)
  report _rownum * n-cols + _colnum
end