c - 在井字棋盘中宣布获胜者

标签 c

我写了一个井字游戏的代码,你把数字输入到数组中,棋盘就会被打印出来。还有一个宣布获胜者的函数,但似乎没有用,该函数应该为任何大小的井字棋盘(现在是 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;
}

最佳答案

我没有完全检查你的检查逻辑,而是直接在 getWinner 中,你触发了未定义的行为:

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

通过阅读 检查 未初始化的变量(这样做的结果是任何一种行为都可能发生)。因此,您可能希望先将其初始化为默认值。

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

关于c - 在井字棋盘中宣布获胜者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32393124/

相关文章:

c - 寄存器中的全局变量

c - linux 执行将某些内容回显到文件的 shell 脚本

C: JSON 处理器

c - 如果某些限制指针指向同一个对象,为什么编译器不生成警告或错误?

c - 如何使用宏中定义的字符串/将其转换为整数?

c - 返回C中的指针,在字符串中查找值

c - 制作一个函数来更新二维数组井字游戏表的 Action

objective-c - Objective C 语法查询

C - 代码表示头未声明 - 尝试将节点插入链表

c - Select() 监视 3 个或更多文件描述符