在tic tac toe board宣布获胜者

时间:2015-09-04 08:06:54

标签: c

我为一个tic tac toe问题编写了一个代码,在这个问题中,您将数字输入到数组中,然后将打印出电路板。还有一个函数声明获胜者,但似乎没有工作,该函数应该声明任何大小的tic tac toe board的赢家(现在它是5x5)。

我做了一个双循环for it,它检查数组中的字符是否与旁边的相同,所以它沿着行移动,另一个用于列,一个对角线和另一个。由于某种原因,它没有显示任何赢家,也没有赢家总是出现。任何帮助表示赞赏。

#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;
}

2 个答案:

答案 0 :(得分:0)

我没有完全通过你的检查逻辑,但直接在getWinner,你正在试图未定义的行为:

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

通过读取尚未初始化的 check变量(结果是任何类型的行为都可能发生)。因此,您可能希望首先将其初始化为默认值。

该游戏有一些实现,我建议您查看一些similar实现,并与您的获胜者检查逻辑进行比较。

答案 1 :(得分:0)

正如Giorgi指出的那样,在开始测试其值之前,必须初始化check。您还需要在winner函数的开头将EMPTY初始化为getWinner(),否则如果没有获胜者,您的函数将返回一些不可预测的垃圾值和您的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];。但不是很重要。但

您还要检查其中一个对角线(两个不同的方向)。另一条对角线根本没有被检查。

相关问题