2015-10-17 56 views
1

我正在爲我的第一個完整程序進行兩週的編程下我的腰帶,並遇到了我似乎無法弄清楚的路障。我正在做一個連接4遊戲,並且已經開始在推送到DOM之前在JavaScript中構建邏輯。我已經開始使用構造函數創建的單元對象,然後將它們以二維數組的形式推送到遊戲對象中。我設法創建了一個函數,每次都進行播放,並用2天的數組更改該列最低點處的單元格值。但是,我不知道如何讓我的支票贏得功能操作。連接四個遊戲檢查勝利JS

到目前爲止,我的邏輯是,對於2D數組中的每個點,您可以按行,按列和對角線進行檢查。我理解如何檢查win的邏輯,但我不明白如何按行和列遍歷數組。在下面的示例中,this.cellsArray是Board構造函數中的一組單元對象。該陣列有7列數組,每行6列,因爲我翻轉了典型的行列邏輯,以說明Connect Four的基於列的特性。但是我不能像this.cellsArray [col] [row]那樣訪問數組,因爲col和row沒有定義,我不知道如何定義一個索引值?任何幫助,將不勝感激!

Connect 4

實施例:

//array location is equal to an instance of this.cellsArray[col][row] 
Board.prototype.checkRowRight = function (arrayLocation) { 

    if ((arrayLocation[i+1][i].value === arrayLocation.value) && (arrayLocation[i+2][i]=== arrayLocation.value) && (arrayLocation[i+3][i].value === arraylocation.value)){ 
     this.winner = this.currentPlayer; 
     this.winnerFound = true; 
     console.log('Winner has been found!') 
    } 
}; 
+0

[四個連續的邏輯]可能的重複(http://stackoverflow.com/questions/15457796/four-in-a-row-logic) - 雖然該特定的問題是爲C,代碼是標準程序風格和輕鬆適應JS。 – paxdiablo

+0

這有幫助,但我想我的問題是更少的邏輯和更多的語法,已編輯更新。 –

+0

C.Kearns,請參閱下面的答案,它基本上是轉換成Javascript的邏輯。 – paxdiablo

回答

2

引用回我的邏輯發現here和重構出獲勝線檢測代碼,這可容易地轉化成JavaScript如下:

function chkLine(a,b,c,d) { 
    // Check first cell non-zero and all cells match 
    return ((a != 0) && (a ==b) && (a == c) && (a == d)); 
} 

function chkWinner(bd) { 
    // Check down 
    for (r = 0; r < 3; r++) 
     for (c = 0; c < 7; c++) 
      if (chkLine(bd[r][c], bd[r+1][c], bd[r+2][c], bd[r+3][c])) 
       return bd[r][c]; 

    // Check right 
    for (r = 0; r < 6; r++) 
     for (c = 0; c < 4; c++) 
      if (chkLine(bd[r][c], bd[r][c+1], bd[r][c+2], bd[r][c+3])) 
       return bd[r][c]; 

    // Check down-right 
    for (r = 0; r < 3; r++) 
     for (c = 0; c < 4; c++) 
      if (chkLine(bd[r][c], bd[r+1][c+1], bd[r+2][c+2], bd[r+3][c+3])) 
       return bd[r][c]; 

    // Check down-left 
    for (r = 3; r < 6; r++) 
     for (c = 0; c < 4; c++) 
      if (chkLine(bd[r][c], bd[r-1][c+1], bd[r-2][c+2], bd[r-3][c+3])) 
       return bd[r][c]; 

    return 0; 
} 

和測試電話:

x =[ [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 1, 1, 0, 0], 
    [0, 0, 0, 1, 1, 0, 0], 
    [0, 0, 1, 2, 2, 2, 0], 
    [0, 1, 2, 2, 1, 2, 0] ]; 
alert(chkWinner(x)); 

chkWinner函數在棋盤上調用時會返回第一個(也是唯一的,假設每次移動只改變一個單元格,並且您在每次移動後檢查)獲勝的玩家。

這個想法基本上將檢查限制在那些有意義的檢查上。例如,在右側檢查單元格時(請參閱第二個循環),您只需檢查從最左邊四列0-3的每一列開始的每行0-6

這是因爲在找到可能的勝利之前,從其他地方開始會跑到棋盤的右側。換句話說,列集{0,1,2,3}{1,2,3,4},{2,3,4,5}{3,4,5,6}將是有效的,但{4,5,6,7}不會(七個有效列是0-6)。

+0

謝謝!這非常有幫助!仍然試圖弄清楚參數如何在控制檯中工作,但我更好地理解如何循環訪問數組! –