我们如何在NetLogo台球上实现二维碰撞



我们是两个视频游戏设计和开发专业的学生,我们必须使用NetLogo制作一些程序。我们的想法是台球,我们已经尽我们所能做到了,但我们无法想象我们如何实现游戏的16个球之间的二维碰撞,它们何时碰撞以及我们需要写什么来实现它。我们不希望您完成我们的工作,但如果您能或多或少地告诉我们如何轻松完成,我们将不胜感激,因为这对我们来说是新的,我们需要一些不难的东西,这样我们将能够更好地理解它(如果解决方案很复杂,好吧,我们不在乎, 我们需要知道它,所以继续!

这是我们到目前为止的NetLogo代码:

breed [BALLS ball]
balls-own [speed velocity x-vel y-vel] 
globals [points]

to setup
  clear-all
  setup-patches
  setup-balls
  set-default-shape balls "circle"
  ask ball 0 [hatch 1
  [
  set breed turtles
  fd 3
  set color red - 1
  ask myself [create-link-to myself [tie hide-link]]
  ]
  ]
  reset-ticks
end
to setup-patches
  ask patches [ set pcolor green ]
  ask patches [if (pxcor > -25) and (pycor > 12)
[ set pcolor brown ]
  ]
  ask patches [if (pxcor < 25) and (pycor < -12)
[ set pcolor brown ]
  ]
  ask patches [if (pxcor < -21)
[ set pcolor brown ]
  ]
  ask patches [if (pxcor > 21)
[ set pcolor brown ]
  ]
  ;Up left corner
  ask patches [if (pxcor = -22) and (pycor = 13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = -21) and (pycor = 13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = -22) and (pycor = 12)
    [set pcolor black]
  ]
  ;Up right hole
  ask patches [if (pxcor = 22) and (pycor = 13)
    [set pcolor black]
  ]
   ask patches [if (pxcor = 21) and (pycor = 13)
    [set pcolor black]
  ]
    ask patches [if (pxcor = 22) and (pycor = 12)
    [set pcolor black]
  ]
  ;Down left hole
  ask patches [if (pxcor = -22) and (pycor = -13)
    [set pcolor black]
  ]
   ask patches [if (pxcor = -21) and (pycor = -13)
    [set pcolor black]
  ]
    ask patches [if (pxcor = -22) and (pycor = -12)
    [set pcolor black]
  ]
  ;Down right hole
  ask patches [if (pxcor = 22) and (pycor = -13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = 21) and (pycor = -13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = 22) and (pycor = -12)
    [set pcolor black]
  ]
  ;Up hole
  ask patches [if (pxcor = -1) and (pycor = 13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = 0) and (pycor = 13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = 1) and (pycor = 13)
    [set pcolor black]
  ]
  ;Down hole
  ask patches [if (pxcor = -1) and (pycor = -13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = 0) and (pycor = -13)
    [set pcolor black]
  ]
  ask patches [if (pxcor = 1) and (pycor = -13)
    [set pcolor black]
  ]
end
to setup-balls
  create-balls 16
  ask ball 0 [setxy 10 0]
  ask ball 0 [set color white]
  ask ball 0 [set heading angle]
  ask ball 1 [setxy -10 0]
  ask ball 1 [set color blue]
  ask ball 2 [setxy -11 0.5]
  ask ball 2 [set color blue]
  ask ball 3 [setxy -11 -0.5]
  ask ball 3 [set color blue]
  ask ball 4 [setxy -12 1]
  ask ball 4 [set color blue]
  ask ball 5 [setxy -12 0]
  ask ball 5 [set color black]
  ask ball 6 [setxy -12 -1]
  ask ball 6 [set color blue]
  ask ball 7 [setxy -13 1.5]
  ask ball 7 [set color blue]
  ask ball 8 [setxy -13 0.5]
  ask ball 8 [set color blue]
  ask ball 9 [setxy -13 -0.5]
  ask ball 9 [set color blue]
  ask ball 10 [setxy -13 -1.5]
  ask ball 10 [set color blue]
  ask ball 11 [setxy -14 2]
  ask ball 11 [set color blue]
  ask ball 12 [setxy -14 1]
  ask ball 12 [set color blue]
  ask ball 13 [setxy -14 0]
  ask ball 13 [set color blue]
  ask ball 14 [setxy -14 -1]
  ask ball 14 [set color blue]
  ask ball 15 [setxy -14 -2]
  ask ball 15 [set color blue]
end
to go
    ask balls [setxy (xcor + x-vel)(ycor + y-vel)
      set velocity 1.01
    if(velocity > 1)[
    set x-vel x-vel / velocity
    set y-vel y-vel / velocity
    ]
  ]
  ask ball 0 [set heading angle]
  ask balls [
    if pcolor = black [ 
    setxy 10 0
    set x-vel 0
    set y-vel 0
    set points points - 1
    ]
  ]

  ask balls [
    if pcolor = brown [
      if pxcor > 21 [
        set y-vel y-vel - 2 * y-vel
      ]
      if pxcor > -21 [
        set y-vel y-vel - 2 * y-vel
      ]
      if pycor > 12 [
        set x-vel x-vel - 2 * x-vel
      ]
      if pycor > -12 [
        set x-vel x-vel - 2 * x-vel
      ]
    ]
  ]
tick
end
to shoot
  ask ball 0 [set x-vel (sin angle * (power / 100))
    set y-vel (cos angle * (power / 100))
    set speed power / 100
  ]
end 

我们知道这可能不是更好的方法,但它有效!您需要的按钮是设置,拍摄,开始,名为点的显示器和两只名为角度(0-360(和电源(0-100(的拖鞋。

我们做了很多研究,但几乎一无所获。我们已经查看了NetLogo库中名为的示例:它对我们不是很有用。此外,我们已经查看了一些链接,例如 https://gamedev.stackexchange.com/questions/7862/is-there-an-algorithm-for-a-pool-game/7901#7901 或质量球对球碰撞处理(例如,很多球(,但我们可以通过所有这些来解决问题。就像我说的,我们只需要海龟的二维碰撞,谢谢阅读!

NetLogo模型库的GasLab圆形粒子模型中,在示例模型->化学与物理下,有正确的物理代码。

所涉及的数学和逻辑相当复杂,但在"信息"和"代码"选项卡中有相当多的解释。

最新更新