2015-09-04 84 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