宣布tic tac趾板冠军

宣布tic tac趾板冠军,c,C,我为一个tic-tac-toe问题编写了一个代码,在这个问题中,您将数字输入数组,然后电路板将被打印出来。还有一个函数声明赢家,但似乎不起作用,该函数应该声明任何大小的tic-tac趾板的赢家(现在是5x5) 我用它做了一个双for循环,检查数组中的字符是否与它旁边的字符相同,因此它沿着行移动,还有一个用于列,一个是对角线,另一个是对角线。出于某种原因,它没有显示任何赢家,总是没有赢家出现。感谢您的帮助 #include <stdio.h> #define TRUE 1 #defi

我为一个tic-tac-toe问题编写了一个代码,在这个问题中,您将数字输入数组,然后电路板将被打印出来。还有一个函数声明赢家,但似乎不起作用,该函数应该声明任何大小的tic-tac趾板的赢家(现在是5x5)

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

#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;
}
#包括
#定义真1
#定义FALSE 0
#定义尺寸3
#定义无-1
#定义零0
#定义交叉点1
#定义空2
空心扫描板(内板[尺寸][尺寸]);
空白印刷板(内板[尺寸][尺寸]);
int getWinner(int board[SIZE][SIZE]);
内部主(空){
集成电路板[尺寸][尺寸];
int优胜者;
printf(“请输入板:\n”);
扫描板;
printf(“这是电路板:\n”);
印刷板;
printf(“获胜者是:”);
赢家=获得赢家(董事会);
如果(获胜者==交叉){
printf(“交叉”);
}
否则如果(获胜者==零){
printf(“零”);
}
否则{
printf(“无人”);
}
返回0;
}
空心扫描板(内板[尺寸][尺寸]){
int i;
int j;

对于(i=0;i我没有完全检查您的检查逻辑,但这里直接在
getWinner
中,您触发了未定义的行为:

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

for(j=0;j我没有完全检查您的检查逻辑,但是在这里直接在
getWinner
中,您触发了未定义的行为:

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

for(j=0;j正如Giorgi所指出的,在开始测试其值之前,您必须初始化
检查
。您还需要在
getWinner()开始时将
winner
初始化为
函数,否则如果没有赢家,您的函数将返回一些不可预测的垃圾值,并且您的
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... **/
int-getWinner(int-board[SIZE][SIZE]){
int i;
int j;
整数检查;

int winner=EMPTY/*正如Giorgi所指出的,在开始测试其值之前,您必须初始化
check
。您还需要在
getWinner()开始时将
winner
初始化为
EMPTY
函数,否则如果没有赢家,您的函数将返回一些不可预测的垃圾值,并且您的
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... **/
int-getWinner(int-board[SIZE][SIZE]){
int i;
int j;
整数检查;

int winner=EMPTY/*感谢您的帮助,在第二个for循环工作之前,它似乎是初始化check=true。我现在要查看对角线,但我想我现在得到了。感谢您的帮助,在第二个for循环工作之前,它似乎是初始化check=true。我现在要查看对角线,但我想我现在得到了。谢谢s、 只需要多做一点检查就行了。1)感谢您发布了真正干净编译的代码。2)为了便于我们人类阅读/理解代码,请始终缩进。建议在每个左大括号“{”后加4个空格,在每个右大括号“}前取消缩进'切勿使用制表符,因为每个文字处理器/编辑器的制表位/制表符宽度设置都不同。注意:4个空格足够宽,因此使用可变宽度字体时缩进仍然可见。类似于:
check==TRUE
的比较几乎总是一个坏主意。(在这种情况下,我们知道TRUE等于什么)通常情况下,任何不是0的都是真的。所以通常最好说这样的话:
if(check)
if(check!=FALSE)
谢谢,只是需要额外的一点,让check=TRUE就行了。1)感谢您发布的代码确实编译得很干净。2)为了便于我们人类阅读/理解代码,请始终缩进。建议在每个左大括号“{”后使用4个空格,在每个右大括号“}前取消缩进'切勿使用制表符,因为每个文字处理器/编辑器的制表位/制表符宽度设置都不同。注意:4个空格足够宽,因此使用可变宽度字体时缩进仍然可见。类似于:
check==TRUE
的比较几乎总是一个坏主意。(在这种情况下,我们知道TRUE等于什么)通常,任何不是0的都是真的。所以通常最好说这样的话:
if(check)
if(check!=FALSE)