2015-09-04 78 views
1

我爲井字問題編寫了一個代碼,在這個輸入框中輸入數字並打印出棋盤。還有一個功能是宣佈獲勝者,但似乎沒有工作,該功能應該宣佈任何規模的井字棋板(現在是5x5)的贏家。聲明井字棋贏家

我做了一個double for循環,它檢查字符是否與數組相同,因此它沿着行移動,另一個是列,一個對角線和另一個。由於某種原因,它沒有顯示任何獲勝者,總是沒有贏家出現。任何幫助表示讚賞。通過閱讀check變量尚未初始化的這個(結果

for(j=0; j<SIZE-1 && check == TRUE; j++){ 

#include <stdio.h> 

#define TRUE 1 
#define FALSE 0 

#define SIZE 3 

#define NONE -1 
#define NOUGHTS 0 
#define CROSSES 1 
#define EMPTY 2 

void scanBoard(int board[SIZE][SIZE]); 
void printBoard(int board[SIZE][SIZE]); 
int getWinner(int board[SIZE][SIZE]); 

int main(void){ 

    int board[SIZE][SIZE]; 
    int winner; 

    printf("Please enter the board:\n"); 
    scanBoard(board); 

    printf("Here is the board:\n"); 
    printBoard(board); 

    printf("The winner is: "); 

    winner = getWinner(board); 

    if(winner == CROSSES){ 
printf("Crosses"); 
} 
    else if(winner == NOUGHTS){ 
printf("Noughts"); 
} 
    else{ 
printf("No one"); 
} 
return 0; 
} 

void scanBoard(int board[SIZE][SIZE]){ 

int i; 
int j; 

for(i=0; i<SIZE; i++){ 
    for(j=0; j<SIZE; j++){ 
     scanf("%d", &board[i][j]); 
    } 
} 
} 

void printBoard(int board[SIZE][SIZE]){ 

int i; 
int j; 

for(i=0; i<SIZE; i++){ 
    for(j=0; j<SIZE; j++){ 
     if(board[i][j] == EMPTY){ 
      printf(". "); 
     } 
     else if(board[i][j] == CROSSES){ 
      printf("X "); 
     } 
     else if(board[i][j] == NOUGHTS){ 
      printf("O "); 
     } 
    } 
    printf("\n"); 
} 

} 

int getWinner(int board[SIZE][SIZE]){ 

int i; 
int j; 
int check; 
int winner; 

for(i=0; i<SIZE; i++){ 
    for(j=0; j<SIZE-1 && check == TRUE; j++){ 
     if(board[i][j] != board[i][j+1]){ 
      check = FALSE; 
     } 
    } 
    if(check == TRUE && j == SIZE-1){ 
     winner=board[i][0]; 
    } 
} 
for(j=0; j<SIZE; j++){ 
    for(i=0; i<SIZE-1 && check == TRUE; i++){ 
     if(board[i][j] != board[i+1][j]){ 
      check = FALSE; 
     } 
    } 
    if(check == TRUE && i == SIZE-1){ 
     winner=board[0][j]; 
    } 
} 
for(i=0; i<SIZE-1 && check == TRUE; i++){ 
    if(board[i][i] != board[i+1][i+1]){ 
     check = FALSE; 
    } 
    if(check == TRUE && i == SIZE-1){ 
     winner=(board[i][i]); 
    } 
} 
for(i=SIZE; i>0 && check == TRUE; i--){ 
    if(board[i][i] != board[i-1][i-1]) 
     check = FALSE; 
} 
    if(check == TRUE && i == SIZE-1){ 
    winner=(board[i][i]); 
} 
return winner; 
} 

回答

0

我沒有直接在getWinner完全通過你的檢查邏輯,但在這裏,你trigerring未定義行爲是任何一種行爲都可能發生)。所以你可能要先將它初始化爲默認值。

這個遊戲有一些實現,我建議你看看一些similar的實現,並比較你的贏家檢查邏輯。

+0

謝謝,只是需要額外的一點,使檢查= TRUE做到了。 – Dan

+0

1)感謝發佈代碼,實際上乾淨編譯。 2)請爲我們人類輕鬆閱讀/理解代碼,始終縮進。在每個開頭大括號之後建議4個空格'{'並在每個大括號之前取消縮進'}'不要使用製表符,因爲每個文字處理器/編輯器的製表位/製表符寬度設置不同。注意:4個空格足夠寬,所以縮進仍然可見,可變寬度字體 – user3629249

+0

比較如下:'check == TRUE'幾乎總是一個壞主意。 (在這種情況下,我們知道TRUE等於什麼)通常,任何不爲0的值都是TRUE。所以通常最好是說:'if(check)'或'if(check!= FALSE)' – user3629249

0

正如Giorgi指出的那樣,在開始測試其值之前,您必須初始化check。您還需要在getWinner()函數開始時初始化winnerEMPTY,否則如果沒有贏家,您的函數將返回一些不可預知的垃圾值,並且您的main()函數可能會打印出錯誤的結果。

int getWinner(int board[SIZE][SIZE]){ 
    int i; 
    int j; 
    int check; 
    int winner=EMPTY /* <<< */; 

    for(i=0; i<SIZE; i++){ 
    for(j=0, check=TRUE /* <<< */; j<SIZE-1 && check == TRUE; j++){ 
     if(board[i][j] != board[i][j+1]){ 
     check = FALSE; 
     } 
    } 
    if(check == TRUE && j == SIZE-1){ 
     winner=board[i][0]; 
    } 
    } 
    for(j=0; j<SIZE; j++){ 
    for(i=0, check=TRUE /* <<< */; i<SIZE-1 && check == TRUE; i++){ 
     if(board[i][j] != board[i+1][j]){ 
     /** etc... **/ 

(注:還有沒有必要繼續檢查,一旦你發現了一個冠軍,所以也許代替winner=board[i][j];你可能只是沒什麼大不了return board[i][j];,雖然。)

你也檢查兩個對角線之一(在兩個不同的方向)。另一個對角線根本沒有被檢查。

+0

感謝您的幫助,它似乎是在第二個循環工作之前初始化check = true。我現在要去看對角線,但我認爲我現在明白了。 – Dan