2013-03-18 18 views
0

我創建井字遊戲作爲一個2維數組的一個項目,我遇到了一些麻煩檢查點,以查看是否有一個的遊戲優勝者。有人可以幫我調試嗎?這是checkwinner功能和主要功能。如何檢查2維數組的贏家井字

char CheckWinner(char board[3][3]) 
{ 
    int i = 0; 
    int j = 0; 

        if (board[i][j] =='X' && board[i][j+1] == 'X' && board[i][j+2]== 'X') 
        { W = X;} 
        else if (board[i+1][j] && board[i+1][i+1] && board[i+1][j+2]== 'X') 
        { W = X;} 
        else if (board[i+2][j] && board[i+2][j+1] && board[i+2][j+2]== 'X') 
        { W = X;} 
        else if (board[i][j] && board[i+1][j] && board[i+2][j]== 'X') 
        { W = X;} 
        else if (board[i][j+1] && board[i+1][j+1] && board[i+2][j+1]== 'X') 
        { W = X;} 
        else if (board[i][j+2] && board[i+1][j+2] && board[i+2][j+2]== 'X') 
        { W =X;} 
        else if (board[i][j] && board[i+1][j+1] && board[i+2][j+2]=='X') 
        { W = X;} 
        else if (board[i+2][j] && board[i+1][j+1] && board[i][j+2]== 'X') 
        { W = X;} 

        else if (board[i][j] && board[i][j+1] && board[i][j+2]== 'O') 
        { W = O;} 
        else if (board[i+1][j] && board[i+1][j+1] && board[i+1][j+2]== 'O') 
        { W = O;} 
        else if (board[i+2][j] && board[i+2][j+1] && board[i+2][j+2]== 'O') 
        { W = O;} 
        else if (board[i][j] && board[i+1][j] && board[i+2][j]== 'O') 
        { W = O;} 
        else if (board[i][j+1] && board[i+1][j+1] && board[i+2][j+1]== 'O') 
        { W = O;} 
        else if (board[i][j+2] && board[i+1][j+2] && board[i+2][j+2]== 'O') 
        { W = O;} 
        else if (board[i][j] && board[i+1][j+1] && board[i+2][j+2]== 'O') 
        { W = O;} 
        else if (board[i+2][j] && board[i+1][j+1] && board[i][j+2]== 'O') 
        { W = O;} 



    return W; 
} 
int main() 
{ 
    char board[3][3]; 
    char Win = CheckWinner(board); 
    int r = 0; 


    InitializeBoard(board); 

    for (int r = 0; r < 4 ; r++) 
    { 
     PlayX(board); 
     PlayO(board); 
     PrintBoard(board); 
    } 
    CheckWinner(board); 
    cout << Win ; 

    if (Win == X) 
    { 
     cout << "The winner is Player 1."; 
    } 
    else if (Win == O) 
    { 
     cout << "The winner is Player 2."; 
    } 
    else if (Win == TIE) 
    { 
     cout << " IT'S A TIE"; 
    } 
    else; 


    system("PAUSE"); 
return 0; 
+2

調試,究竟是什麼?你得到的錯誤/錯誤是什麼? – Tushar 2013-03-18 19:33:34

+1

請包括確切的錯誤信息。 – rana 2013-03-18 19:34:02

+0

好吧,我停止了錯誤信息。這是另一個功能上面的小錯誤。 – 2013-03-18 19:45:42

回答

1

您立即CheckWinner結果分配給Win,然後出去玩的遊戲,然後再調用CheckWinner不分配其結果Win。因此,當你在下面一行檢查Win,你從當董事會甚至沒有初始化的原始結果。

+0

這是假設檢查8點不同的方式,你可以贏得X和O。 – 2013-03-18 19:42:43

+0

以問題結尾的答案?這應該是一個評論? – Shoe 2013-03-18 19:46:38

+0

無視這一點。你的第一個建議讓我感到非常愚蠢,我應該早一點意識到這一點。這讓我的遊戲有用,所以一切正常,我只是沒有將Win分配給CheckWinner在正確的位置。謝謝。 – 2013-03-18 19:53:48

0

大概有賦予文本O或X成被認爲是一個char返回值做。因此,而不是O或X應該是'O'或'X'。除非O或X被定義爲發佈代碼之外的char變量。

+0

爲const char X = 'X' 和爲const char O = 'O' 我已經嘗試了兩種方式。 – 2013-03-18 19:41:22

3

您可以用下面的優化條件代碼:

typedef char piece; 

piece iswin() const 
{ 
    piece ret = 'T'; 

    // Checks for horizontal win 
    for (int i = 0; i < 3; ++i) 
     if (*arr[i] == arr[i][1] && arr[i][1] == arr[i][2]) 
      if ((ret = *arr[i]) != 'T') 
       return ret; 

    // Checks for vertical win 
    for (int i = 0; i < 3; ++i) 
     if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i]) 
      if ((ret = arr[0][i]) != 'T') 
       return ret; 

    // Check for diagonal win (upper left to bottom right) 
    if (**arr == arr[1][1] && arr[1][1] == arr[2][2]) 
     if ((ret = **arr) != 'T') 
      return ret; 

    // Check for diagonal win (upper right to bottom left) 
    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]) 
     if ((ret = arr[0][2]) != 'T') 
      return ret; 

    return ret; 
} 

// checking the result: 
switch (winner) { 
    case 'T': /* tie */ break; 
    case 'X': /* X won */ break; 
    case 'O': /* O won */ break; 
} 

這一點清潔劑。而且它6個環,而不是9

+0

由於某些原因,這不起作用。 – 2013-03-19 08:46:21

+0

-1,使用雙重比較x == y == z是錯誤的 – 2013-04-15 16:42:23

+1

@Armin,是的謝謝。固定。我寫這篇文章時一定喝醉了。 – Shoe 2013-04-15 16:53:23