Progtwig Tic tac toe en C, condiciones ganadoras que no funcionan.

Este es un progtwig que te permite jugar un juego de 5×5 tic tac toe con la computadora. Voy a implementar movimientos más inteligentes para la computadora, pero primero necesito arreglar el cheque para ganar. Si ganas con una columna o diagonal, funciona, pero ganar con una fila solo funciona en la fila 2 + 3, no en la fila 4 o 5. ¿Alguien puede decirme por qué? Estoy usando únicamente 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 ' '; } 

No funciona porque regresará “prematuramente en líneas completamente vacías. Así que tienes que implementar una verificación adicional:

 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]; 

Esto vale también para los otros controles.