2015-09-27 43 views
1

讓我們考慮一個遊戲,其中玩家在x*y網格上有n件數。玩家也可以在任何方向移動棋子(north,south,north-east等)。我們假設唯一的規則是玩家(當他決定移動時)必須儘可能多地移動棋子。在迷宮邊緣的一件作品的優雅驗證

ooooo 
..... 
..... 
..... 
..... 

玩家移動的第一塊

.oooo 
..... 
..... 
..... 
o.... 

做出這樣的函數(忽略關於玩家可以移動他的作品的其他方向的力矩),我們有:

while(!AtEdge()){ 
    move() 
} 

但是,這個AtEdge必須配置爲根據行進方向檢查棋子是否處於邊緣。例如:

o..... 
...... 
...... 

第一部分是在邊緣如果方向是northwestnorth-west但最好在任何其他方向去走。

我現在的想法是,我需要一個switch語句,根據旅行方向檢查是否是AtEdge()。但是,我還需要一個move函數的switch語句。

switch(direction){ 
    case NORTH_EAST: //code to move north-east 
} 

這會導致16 Switch聲明,但是如果遊戲是3D,那麼數字就會乘以。有沒有更優雅的解決方案來實現我所描述的?根據旅行方向是否有更好的方法來檢查棋子是否可以進一步移動?

回答

0

網格中x*y中的位置可以用座標0 <= px < x0 <= py < y表示。 (也可以選擇1 <= px <= x1 <= py <= y,但開始索引/座標0是更常見的。)

單個移動到一個鄰近的字段可以由矢量(mx my)與具有值-1,0,1中的每一個mx, my來表示;排除組合(0 0)

現在移動只是意味着增加了移動矢量的位置讓

px_new = px + mx 
py_new = py + my 

檢查,如果新的位置是在板內可以簡單的這樣做:

inside = (0 <= px_new) and (px_new < x) and (0 <= py_new) and (py_new < y)