2014-12-19 46 views
0

我的問題是當我的代理獲得0,0,0,9等我試圖阻止它去9,0或9,9等 這樣在這個例子中停止代理離開電網(RL的網格世界示例)

(0,0) N -1.0 (9,0) 
    (9,0) N -1.0 (8,0) 
    (8,0) W -1.0 (8,9) 

我希望它在兩者之間移動網格而不是去在網格後面短距起降。例如,代替goind形式(0,0)到(9,0)到(0,1)0r(1,0)等。

我試過一些簡單的代碼,檢查x和y值是比對於行和列或數x和y的值更大,如果x和y小於0

public boolean Notvalid(int x, int y) { 

    return (x > cr.NUM_ROWS || y > cr.NUM_COLUMNS || x < 0 || y < 0); 

    } 

和調用該方法設置x和y座標時

public GridState(int xpos, int ypos) { 

    if (!Notvalid(x, y)) { 

     x = xpos; 
     y = ypos; 

    } else { 
     x = cr.START_ROW; 
     y = cr.START_COL; 
    } 
} 

有人知道一個更簡單的方法來處理這樣的規則嗎?

+1

是'cr.NUM_ROWS' 9或10?看起來列索引是從0到9,所以'cr.NUM_ROWS'應該是10,但是你應該使用'x> = cr.NUM_ROWS'或'x> cr.NUM_ROWS - 1' –

+1

另外,它看起來像你正在檢查_current_ x/y位置是否有效('x'和'y'),而不是代理要去的位置('xpos','ypos')。另外,通過設置'x = cr.START_ROW',你不是正在做你不想做的事嗎,即當它進入'10'時將代理設置爲'0'?但是,所有這些僅僅是一個猜測而沒有看到更多的代碼。 –

+0

嗨@tobias_k感謝您指出我傳遞了錯誤的變量,您說得對,我正在做與我想做的事情相反的事情。我沒有注意到它。它現在按預期工作。謝謝, – DugD

回答

0

好像有三個問題與您的代碼:

  • 假設該行指數09cr.NUM_ROWS10,你應該使用x >= cr.NUM_ROWSx > cr.NUM_ROWS - 1代替x > cr.NUM_ROWS。 (同爲列)
  • 正在檢查的當前 X/Y位置是否有效(xy),而不是在代理即將前往的位置(xposypos)。
  • 通過設置x = cr.START_ROW,看起來您正在做您不想做的事情,即將代理人設置爲0,當它轉到10時。

試試這個:

public boolean notValid(int x, int y) { 
    return x >= cr.NUM_ROWS || y >= cr.NUM_COLUMNS || x < 0 || y < 0; 
} 

public gridState(int xpos, int ypos) { 
    if (! notvalid(xpos, ypos)) { 
     x = xpos; 
     y = ypos; 
    } else { 
     // new position not valid -> just stay where you are 
    } 
}