Найдите пограничный участок, где случайно перемещенная частица ударила - PullRequest
0 голосов
/ 09 декабря 2018

У меня случайно синяя нарисованная граница и шар, который находится внутри границы и должен случайно перемещаться внутрь, когда он ударяется о стену, он должен поворачиваться в противоположном направлении и продолжать.Для этого я написал код

breed [ balls ball ]
ask balls
  [
    ifelse (pcolor = blue or [pcolor] of patch-at dx dy = blue)
    [  
     rt 180
    ]
    [
      jump 0.4
    ]
  ]

Этот код, кажется, работает, но теперь необходимо создать вспышку, когда мяч ударяется о стену.Я попробовал следующий код - безуспешно

breed [ flashes flash ]
flashes-own [ birthday ]

to apply-flash-visualization
  set size 2.5
  if (ticks - birthday > 0.4)  [ die ]
end

to go
  ask flashes [ apply-flash-visualization ]
  ask balls
  [
    ifelse (pcolor = blue or [pcolor] of patch-at dx dy = blue)
    [  
     rt 180
      if (pcolor = blue)
      [
        let bounce-patch patch-here
        let new-px [ pxcor ] of bounce-patch
        let new-py [ pycor ] of bounce-patch
        ask patch new-px new-py [
          sprout 1 [
            set breed flashes
            set color gray - 2
            set birthday ticks
          ]
        ]
      ]
    ]
    [
      jump 0.4
    ]
  ]

Как решить проблему?Спасибо

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, что именно линия if (pcolor = blue) вызывает проблему.Ваши ball агенты на самом деле никогда не находятся на синем патче, поскольку вы заставляете их оборачиваться, как только они оценивают патч перед ними (используя вашу линию patch-at dx dy).Таким образом, if (pcolor = blue) никогда не оценивается как истина, поэтому никаких вспышек не происходит.Это было бы хорошим местом для команды печати для отладки - если вы добавите что-то вроде:

...
     if (pcolor = blue)
      [
        print "making flash"
...

, вы увидите, что этот код на самом деле никогда не обрабатывается.Таким образом, чтобы исправить это, вы должны переоценить, когда вспышки действительно должны произойти - один простой пример, который может работать для вас:

breed [ flashes flash ]
breed [ balls ball ]

flashes-own [ birthday ]

to setup
  ca
  ask patches with [ 
    member? pxcor list max-pxcor min-pxcor or
    member? pycor list max-pycor min-pycor 
  ] [
    set pcolor blue
  ]

  create-balls 10 

  reset-ticks
end

to apply-flash-visualization
  set size size + 1
  if ticks - birthday > 2  [ die ]
end


to go
  ask flashes [ apply-flash-visualization ]
  ask balls [
    let next patch-ahead 1
    ifelse [pcolor] of next = blue [
      ask next [
        sprout-flashes 1 [
          set shape "square"
          set color white
          set birthday ticks
        ]
      ]
      rt 180
    ] [
      fd 1
    ]
  ]
  tick
end

Кроме того, вы можете захотеть взглянуть на модель «Bounce Example»в Библиотеке моделей, которая показывает, как заставить прыгать под углом.

...