C中的Tic tac toe程序,胜利条件不起作用

这个程序可以让你在电脑上玩5×5 tic tac toe游戏。 我将为计算机实施更智能的移动,但首先我需要修复获胜的检查。 如果你用柱子或对角线赢了就可以了,但是赢得一排只适用于第2 + 3行,而不是第4行或第5行。任何人都可以告诉我为什么? 我只用C.

#include  #include  char matrix[5][5]; /* the tic tac toe matrix */ char check(void); void init_matrix(void); void get_player_move(void); void get_computer_move(void); void disp_matrix(void); int main(void) { char done; printf("This is the game of Tic Tac Toe.\n"); printf("You will be playing against the computer.\n"); done = ' '; init_matrix(); do { disp_matrix(); get_player_move(); done = check(); /* see if winner */ if(done!= ' ') break; /* winner!*/ get_computer_move(); done = check(); /* see if winner */ } while(done== ' '); if(done=='X') printf("You won.\n"); else printf("Computer won.\n"); disp_matrix(); /* show final positions */ return 0; } /* Initialize the matrix. */ void init_matrix(void) { int i, j; for(i=0; i<5; i++) for(j=0; j<5; j++) matrix[i][j] = ' '; } /* Get a player's move. */ void get_player_move(void) { int x, y; printf("Enter X,Y coordinates for your move: "); scanf("%d%*c%d", &x, &y); x--; y--; if(matrix[x][y]!= ' '){ printf("Invalid move, try again.\n"); get_player_move(); } else matrix[x][y] = 'X'; } /* Get a move from the computer. */ void get_computer_move(void) { int i, j; for(i=0; i<5; i++){ for(j=0; j<5; j++) if(matrix[i][j]==' ') break; if(matrix[i][j]==' ') break; } if(i*j==25) { printf("Draw.\n"); exit(0); } else matrix[i][j] = 'O'; } /* Display the matrix on the screen. */ void disp_matrix(void) { int t; for(t=0; t<5; t++) { printf(" %c | %c | %c | %c | %c ",matrix[t][0], matrix[t][1], matrix [t][2], matrix[t][3], matrix[t][4]); if(t!=4) printf("\n---|---|---|---|---\n"); } printf("\n"); } /* See if there is a winner. */ char check(void) { int i; for(i=0; i<5; i++) /* check rows */ if(matrix[i][0]==matrix[i][1] && matrix[i][0]==matrix[i][2] && matrix[i][0]==matrix[i][3] && matrix[i][0]==matrix[i][4]) return matrix[i][0]; for(i=0; i<5; i++) /* check columns */ if(matrix[0][i]==matrix[1][i] && matrix[0][i]==matrix[2][i] && matrix[0][i]==matrix[3][i] && matrix[0][i]==matrix[4][i]) return matrix[0][i]; /* test diagonals */ if(matrix[0][0]==matrix[1][1] && matrix[1][1]==matrix[2][2] && matrix[2][2]==matrix[3][3] && matrix[3][3]==matrix[4][4]) return matrix[0][0]; if(matrix[0][4]==matrix[1][3] && matrix[1][3]==matrix[2][2] && matrix[2][2]==matrix[3][1] && matrix[3][1]==matrix[4][0]) return matrix[0][4]; return ' '; } 

它不起作用,因为它会在完全空行上返回”。 所以你必须实施一个额外的检查:

 if(matrix[i][0]==matrix[i][1] && matrix[i][0]==matrix[i][2] && matrix[i][0]==matrix[i][3] && matrix[i][0]==matrix[i][4] && matrix[i][0] != ' ') return matrix[i][0]; 

这也适用于其他检查。