2014-02-22 84 views
4

我想要做一些非常簡單的事情,但由於某種原因,我只是無法讓它工作。防止NetLogo龜撞牆

我的設置功能創建了一個從(-20,20)到(20,20)的方形牆,並在牆內生成一個大小爲3的圓形龜。方形牆壁只是由藍色的補丁製成。

現在我有一個go功能,它告訴烏龜從-90度到90度的任何地方旋轉,並向前移動0.5步。不允許「走進」牆壁;當它撞擊牆壁時,它會簡單地選擇另一個方向移動。烏龜不能「感知」牆壁,直到它真正進入牆壁。

我一直在使用的代碼如下:

ask turtle 0 [ 
    let invalid true 
    let turn-degree (random(180) - 90) 
    rt turn-degree 

    let next-patch patch-ahead 1 ;; Declare next-patch before moving 

    while [invalid] [ ;; While invalid condition 
    ask next-patch [ 
     ;; Neighbors of the next patch are counted, because turtle is size 3 
     if (count neighbors with [pcolor = blue] = 0) [ 
     set invalid false 
     ] 
    ] 

    if (invalid) [ 
     lt turn-degree ;; Turn the turtle back to the original direction 
     set turn-degree (random(180) - 90) ;; Randomize turn degree again 
     set next-patch patch-ahead 1 ;; Declare next-patch before moving again 
    ] 
    ] 

    ;; Finally, jump 0.5 steps ahead in the chosen direction 
    jump 0.5 
] 

我很傷心地說,上面的代碼不起作用,因爲龜仍然以某種方式設法本身就帶有藍色的牆重疊,這不應該發生。我懷疑這是因爲兩個原因:

1)0.5步是擰「補丁提前」的條件。不過,我已經嘗試了patch-ahead 0.5而沒有任何效果。 2)隨機轉彎程度是導致藍色牆距離烏龜略高於0.5,但我沒有解決這個問題...

有什麼建議嗎?

+0

什麼模式試圖實現?我正在處理與此非常相似的事情,但使用連續的力量模型。 –

回答

2

問題是,當烏龜移動到靠近貼着牆的貼片的邊緣時,烏龜貼片的neighbors不是牆的一部分,但烏龜仍然是距離牆不到1.5米。試試這個:

ask turtle 0 [ 
    rt (random 180) - 90 

    fd .5 
    while [ any? patches in-radius 2 with [ pcolor = blue ] ] [ 
    bk .5 
    rt (random 180) - 90 
    fd .5 
    ] 
] 
1

我並沒有完全嘗試布萊恩的方法,但是我也爲我做了些什麼。我結束了使用以下內容:

if (any? patches in-cone 3 60 with [pcolor = blue]) 

作爲我的牆檢測條件。它工作得很好。 :)