2016-02-13 91 views
1

我目前正在嘗試獲取二維數組的對角線行。Javascript:獲取對角線陣列

這是數組的樣子:

/* Array containing the playing field 8 x 8 

     C0 C1 C2 C3 C4 C5 C6 C7 
    R0[0][0][0][0][0][0][0][X] 
    R1[0][0][0][0][0][0][X][0] 
    R2[0][0][0][0][0][X][0][0] 
    R3[0][0][0][0][X][0][0][0] 
    R4[0][0][0][X][0][0][0][0] 
    R5[0][0][X][0][0][0][0][0] 
    R6[0][X][0][0][0][0][0][0] 
    R7[X][0][0][0][0][0][0][0] 
*/ 

    row0 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row1 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row2 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row3 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row4 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row5 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row6 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row7 = [0, 0, 0, 0, 0, 0, 0, 0]; 
    field = [row0, row1, row2, row3, row4, row5, row6, row7]; 

我想檢查遊戲的玩家在四連勝。目前正在處理的水平和垂直校驗功能得到了如下信息:

列ID和行ID的用戶點擊(X在功能上代表了玩家人數)

這是我使用檢查功能:

function checkVieropeenrij(id, rij, x) { 
    function contains(hooibaal, naalden) { 
     return hooibaal.join(",").indexOf(naalden.join(",")) != -1; 
    } 

    var horizontaal = field[0, rij]; 
    var verticaal = []; 
     for (g=7; g>=0; g--) { 

      verticaal[g] = field[g][id-1] 

     } 

    var diagonaal = [] 


    var needles = [x, x, x, x]; 

    if (contains(horizontaal, needles) || contains(verticaal, needles)) { 
     spelActief = false; 
     return true 
    } 

    else if (!contains(horizontaal, needles) || !contains(verticaal, needles)) { 
     return false 
    } 
} 

所以我想要做的就是保存[X,X,X,X,X,X,X,X]在一個新的數組(可變diagonaal_1)和我在尋找最有效的方法來做到這一點。

對角線的位置取決於玩家點擊的位置,所以如果他們點擊C6,R6應該從R7,C5到R0,C7和對角線R7,C7到R0,C0獲得對角線(兩個對角線都跨越運動場存儲在單獨的變量中)

回答

1

該建議將給定位置移動到數組的相對頂部並收集給定方向上的項目。

基本上它首先檢查是否有空間移動和收集,是收集空間。

var height = 8, 
 
    width = 8, 
 
    field = [ 
 
     [0, 1, 4, 0, 0, 0, 3, 0], 
 
     [0, 4, 1, 0, 0, 3, 0, 0], 
 
     [4, 0, 0, 1, 3, 0, 0, 0], 
 
     [0, 0, 0, 3, 1, 0, 0, 0], 
 
     [0, 0, 3, 0, 0, 1, 0, 0], 
 
     [2, 3, 0, 0, 0, 0, 1, 0], 
 
     [3, 2, 0, 0, 0, 0, 0, 1], 
 
     [0, 0, 2, 0, 0, 0, 0, 0] 
 
    ]; 
 

 
function getBackSlash(i, j) {    // direction \ 
 
    var result = []; 
 
    while (i > 0 && j > 0) {    // is space to move (top/left)? 
 
     i--; 
 
     j--; 
 
    } 
 
    while (i < height && j < width) {  // are items in the range to collect? 
 
     result.push(field[i][j]); 
 
     i++; 
 
     j++; 
 
    } 
 
    return result; 
 
} 
 

 
function getSlash(i, j) {     // direction/
 
    var result = []; 
 
    while (i > 0 && j + 1 < width) {  // is space to move (top/right)? 
 
     i--; 
 
     j++; 
 
    } 
 
    while (i < height && j >= 0) {  // are items in the range to collect? 
 
     result.push(field[i][j]); 
 
     i++; 
 
     j--; 
 
    } 
 
    return result; 
 
} 
 

 
document.write('<pre>1: [' + getBackSlash(3, 4).join(', ') + ']</pre>'); 
 
document.write('<pre>2: [' + getBackSlash(7, 2).join(', ') + ']</pre>'); 
 
document.write('<pre>3: [' + getSlash(3, 3).join(', ') + ']</pre>'); 
 
document.write('<pre>4: [' + getSlash(0, 2).join(', ') + ']</pre>');