2013-06-04 64 views
0

我一直在做一個任務,需要我在matlab中重新創建reversi。Reversi有效移動檢查器

我已經達到了一個突破點,我無法弄清楚如何做一段代碼而不把它變成線性索引。

本質上我需要做的是找出一種方法來添加一個方向向量(即[-1; 0]垂直走向),我已經存在的game_state向量爲了找到它上面的數據。

function legal = legalMove() 
d_l = [0, -1]; 
d_r = [0, 1]; 
d_u = [-1, 0]; 
d_d = [1, 0]; 
d_ul = [-1, -1]; 
d_ur = [-1, 1]; 
d_dl = [1, -1]; 
d_dr = [1, 1]; 
directions = [d_l d_ul d_u d_ur d_r d_dr d_d d_dl]; 
valid_moves = zeros(8,8); 

for ci = 1:8 
    for cj = 1:8 
     if game_state(ci,cj) == 0 %check element = 0 before continuing 
       for count = 1:8 
        d = directions(count); 
        selected = 
        while selected == player_number * -1 %while the selected piece is of enemy type 

          %move as long as you find your opponents stones 
         if you found at least 1 opponent stone and you end up on your own stone 

         else 
         end 
        end 
       end 

     else 
     end 
    end 
end 
    end 

我的第二個問題之後,是實際的循環本身。 雖然我認爲可以使用while循環來確定是否保持當前的方向,但我似乎無法找到一種方法來自己做。

任何援助將不勝感激。

謝謝你的時間!

+0

如果我理解這你只需要做一些像'sel_i = ci + directions(1,count);',然後類似於'sel_j',並檢查'​​sel_i'和'sel_j'是否在邊界內的董事會。 – wakjah

回答

0

變化directions細胞陣列包含字符串:(!填空)

... 
directions = { 'd_l' 'd_ul' 'd_u' 'd_ur' 'd_r' 'd_dr' 'd_d' 'd_dl' }; 
... 

代碼會去這樣的事情。然後下一部分:

for count = 1:8 
    d = eval(directions{count}); 
    ti = ci+d(1); 
    tj = cj+d(2); 

    % Check if out of the board 
    ... 

    % Number of enemy pieces you went over 
    cnt = 0; 
    selected = gamestate(ti, tj) 

    % Move while going over enemy pieces 
    while selected == player_number * -1 
     ti = ti + d(1); 
     tj = tj + d(2); 
     selected = gamestate(ti, tj); 

     % Check if out of the board 
     ... 

     % Count pieces you went over 
     cnt = cnt + 1; 
    end 

    % Check if you moved over enemy pieces & whether you landed on your piece 
    ... 

end 
+0

當OP已經在'count'索引的矩陣中有方向時,爲什麼要使用'eval'和一個單元陣列呢?另外,你的代碼在檢查'ti'和'tj'是否在邊界之前訪問'gamestate'。 – wakjah

+0

@wakjah ** 1)**當OP執行'directions = [d_l d_ul d_d d_ur d_r d_dr d_d d_dl]; ',他得到1x16大小的矢量。當然,可以在沒有'eval'的情況下對這個向量進行索引,但不是沒有丟失OP隱式保證的語義。我想保留他的'd_l','d_ul'等變量的含義。如果我想寫更清潔的解決方案,我會徹底刪除這些,但會混淆OP,我想。 ** 2)**我認爲在檢查'ti'和'tj'之前解決方案不會訪問'gamestate'。在上面的代碼中有兩個檢查點。你可能錯過了第一個? – plesiv

+0

實際上,當我嘗試使用此,一旦完成了它返回輸入型‘細胞’的 參數的誤差 「未定義函數‘EVAL’。 錯誤裁判員/ legalMove(線204) d =的eval(方向(計數)); 錯誤裁判員/ buttonPress(線85) 法律= legalMove(); 錯誤而評估uicontrol回調」 任何想法? –