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

时间:2014-12-18 15:39:15

标签: collision netlogo billiards

我们是两名视频游戏设计和开发专业的学生,​​我们必须使用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 

我们知道这可能不是更好的方法,但它有效!你需要的按钮是设置,拍摄,去,一个名为点的监视器和两个名为angle(0-360)和power(0-100)的拖鞋。

我们已经做了很多研究,而且我们几乎什么都没有。我们从NetLogo库中查看了一个名为的示例:它对我们来说并不是非常有用。我们还查看了https://gamedev.stackexchange.com/questions/7862/is-there-an-algorithm-for-a-pool-game/7901#7901Mass Ball-to-Ball Collision Handling (as in, lots of balls)等链接,但我们可以全力以赴。就像我说的,我们只需要海龟二维碰撞,谢谢阅读!

1 个答案:

答案 0 :(得分:1)

在NetLogo模型库的GasLab Circular Particles模型中,样本模型下的代码具有正确的物理特性 - &gt;化学与化学物理。

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