Tres en raya en C
Resuelto
Abby14
Mensajes publicados
2
Estado
Miembro
-
Collraoul -
Collraoul -
Hola,
He creado un programa en lenguaje C para el juego de tres en raya. Pero cuando lo ejecuto, siempre dice que la casilla ya ha sido ocupada. ¿Alguien ve qué he hecho mal?
Muchas gracias de antemano por sus respuestas
Aquí está mi programa:
#include <stdio.h>
#define nblignes 3
#define nbcolonnes 3
char grille[nblignes][nbcolonnes];
/*Inicialización de la cuadrícula de tres en raya vacía : */
void initialisergrille(char grille[nblignes][nbcolonnes])
{
int i, j ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<nbcolonnes ; j++)
{
grille[i][j] = ' ' ;
}
}
}
/*Visualización de la cuadrícula de tres en raya : */
void affichergrille(char grille[nblignes][nbcolonnes])
{
int i, j ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<(nbcolonnes) ; j++)
{
printf("%c", grille[i][j]) ;
printf("|") ;
}
printf("\n") ;
printf("- - -\n") ;
}
return ;
}
/*Ingreso de las coordenadas del símbolo a colocar en la cuadrícula. Si las coordenadas
están fuera de la cuadrícula o si la casilla ya ha sido ocupada, la entrada es
rechazada, se muestra un mensaje de error y el jugador debe volver a jugar. */
void mettresymbole(char symbole, char grille[nblignes][nbcolonnes])
{
int ligne, colonne ;
printf("Por favor, ingrese los números de la línea y de la columna :") ;
do
{
scanf_s("%i %i", &ligne, &colonne) ;
if ((ligne>0) && (ligne<=nblignes) && (colonne>0) && (colonne<=nbcolonnes))
{
ligne-- ; /*para ser compatible con los índices del arreglo*/
colonne-- ;
if (grille[ligne][colonne]!=' ')
printf("La casilla ya ha sido ocupada. Por favor elija otra :") ;
else { grille[ligne][colonne]=symbole ;
if (symbole=='X') {symbole='O' ; }
else {symbole='X' ; }
}
}
else printf("Índice de línea o columna incorrecto. Por favor reingrese :") ;
} while(grille[ligne][colonne]!=' ') ;
}
/*Prueba para ver si alguno de los jugadores ha ganado : */
int testgagnant(char grille[nblignes][nbcolonnes], char symbole)
{
int i, j, somme, gagne ;
somme = 0 ;
gagne = 0 ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<nbcolonnes ; j++)
{
somme+=grille[i][j] ;
}
if((somme==237) || (somme==264))
{ gagne = 1 ; }
}
for(j=0 ; j<nbcolonnes ; j++)
{
for(i=0 ; i<nblignes ; i++)
{
somme+=grille[i][j] ;
}
if((somme==237) || (somme==264))
{ gagne = 1 ; }
}
if(grille[0][0] + grille[1][1] + grille[2][2] == 237 || grille[0][0] + grille[1][1] + grille[2][2] == 264)
{ gagne = 1 ; }
if(grille[0][2] + grille[1][1] + grille[2][0] == 237 || grille[0][2] + grille[1][1] + grille[2][0] == 264)
{ gagne = 1 ; }
if (gagne==1)
{ printf("Felicitaciones al jugador que tiene el ") ;
if(symbole=='X')
printf("X") ;
else
printf("O") ;
printf("que ha ganado.\n") ;
}
/* Prueba si la cuadrícula está llena :*/
if(gagne==0){
for(i=0 ; i<nblignes ; i++)
{
for(j=0 ; j<= nbcolonnes ; j++)
{
if(grille[i][j] != ' ')
gagne=2 ;
printf("Ninguno de los 2 jugadores ha ganado") ;
}
}
}
return gagne ;
}
void main()
{
char grille[nblignes][nbcolonnes] ;
char symbole ;
int gagne ;
initialisergrille(grille) ;
affichergrille(grille) ;
printf("Por favor, elija su símbolo, O o X :") ;
scanf("%c", &symbole) ;
do
{ mettresymbole(symbole, grille) ;
affichergrille(grille);
testgagnant(grille, symbole) ;
}
while(gagne=0) ;
}
He creado un programa en lenguaje C para el juego de tres en raya. Pero cuando lo ejecuto, siempre dice que la casilla ya ha sido ocupada. ¿Alguien ve qué he hecho mal?
Muchas gracias de antemano por sus respuestas
Aquí está mi programa:
#include <stdio.h>
#define nblignes 3
#define nbcolonnes 3
char grille[nblignes][nbcolonnes];
/*Inicialización de la cuadrícula de tres en raya vacía : */
void initialisergrille(char grille[nblignes][nbcolonnes])
{
int i, j ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<nbcolonnes ; j++)
{
grille[i][j] = ' ' ;
}
}
}
/*Visualización de la cuadrícula de tres en raya : */
void affichergrille(char grille[nblignes][nbcolonnes])
{
int i, j ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<(nbcolonnes) ; j++)
{
printf("%c", grille[i][j]) ;
printf("|") ;
}
printf("\n") ;
printf("- - -\n") ;
}
return ;
}
/*Ingreso de las coordenadas del símbolo a colocar en la cuadrícula. Si las coordenadas
están fuera de la cuadrícula o si la casilla ya ha sido ocupada, la entrada es
rechazada, se muestra un mensaje de error y el jugador debe volver a jugar. */
void mettresymbole(char symbole, char grille[nblignes][nbcolonnes])
{
int ligne, colonne ;
printf("Por favor, ingrese los números de la línea y de la columna :") ;
do
{
scanf_s("%i %i", &ligne, &colonne) ;
if ((ligne>0) && (ligne<=nblignes) && (colonne>0) && (colonne<=nbcolonnes))
{
ligne-- ; /*para ser compatible con los índices del arreglo*/
colonne-- ;
if (grille[ligne][colonne]!=' ')
printf("La casilla ya ha sido ocupada. Por favor elija otra :") ;
else { grille[ligne][colonne]=symbole ;
if (symbole=='X') {symbole='O' ; }
else {symbole='X' ; }
}
}
else printf("Índice de línea o columna incorrecto. Por favor reingrese :") ;
} while(grille[ligne][colonne]!=' ') ;
}
/*Prueba para ver si alguno de los jugadores ha ganado : */
int testgagnant(char grille[nblignes][nbcolonnes], char symbole)
{
int i, j, somme, gagne ;
somme = 0 ;
gagne = 0 ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<nbcolonnes ; j++)
{
somme+=grille[i][j] ;
}
if((somme==237) || (somme==264))
{ gagne = 1 ; }
}
for(j=0 ; j<nbcolonnes ; j++)
{
for(i=0 ; i<nblignes ; i++)
{
somme+=grille[i][j] ;
}
if((somme==237) || (somme==264))
{ gagne = 1 ; }
}
if(grille[0][0] + grille[1][1] + grille[2][2] == 237 || grille[0][0] + grille[1][1] + grille[2][2] == 264)
{ gagne = 1 ; }
if(grille[0][2] + grille[1][1] + grille[2][0] == 237 || grille[0][2] + grille[1][1] + grille[2][0] == 264)
{ gagne = 1 ; }
if (gagne==1)
{ printf("Felicitaciones al jugador que tiene el ") ;
if(symbole=='X')
printf("X") ;
else
printf("O") ;
printf("que ha ganado.\n") ;
}
/* Prueba si la cuadrícula está llena :*/
if(gagne==0){
for(i=0 ; i<nblignes ; i++)
{
for(j=0 ; j<= nbcolonnes ; j++)
{
if(grille[i][j] != ' ')
gagne=2 ;
printf("Ninguno de los 2 jugadores ha ganado") ;
}
}
}
return gagne ;
}
void main()
{
char grille[nblignes][nbcolonnes] ;
char symbole ;
int gagne ;
initialisergrille(grille) ;
affichergrille(grille) ;
printf("Por favor, elija su símbolo, O o X :") ;
scanf("%c", &symbole) ;
do
{ mettresymbole(symbole, grille) ;
affichergrille(grille);
testgagnant(grille, symbole) ;
}
while(gagne=0) ;
}
4 respuestas
```c
#include <stdio.h>
#define nblignes 3
#define nbcolonnes 3
//char grille[nblignes][nbcolonnes];
/*Initialisation de la grille du morpion a vide : */
void initialisergrille(char grille[nblignes][nbcolonnes]) {
int i, j;
for (i = 0; i < nblignes; i++)
for (j = 0; j < nbcolonnes; j++)
grille[i][j] = ' ';
}
/*Affichage de la grille du morpion : */
void affichergrille(char grille[nblignes][nbcolonnes]) {
int i, j;
for (i = 0; i < nblignes; i++) {
for (j = 0; j < nbcolonnes; j++)
printf("%c|", grille[i][j]);
printf("\n- - -\n");
}
return;
}
/*Saisie des coordonnees du symbole a mettre sur la grille. Si les coordonnees sont en dehors de la grille ou si la case a deja ete remplie, la saisie est refusee, un message d'erreur s'affiche et le joueur doit rejouer. */
void mettresymbole(char symbole, char grille[nblignes][nbcolonnes]) {
int ligne, colonne;
printf("Veuillez donner les numeros de la ligne et de la colonne :");
do {
scanf("%i %i", &ligne, &colonne);
if ((ligne > 0) && (ligne <= nblignes) && (colonne > 0) && (colonne <= nbcolonnes)) {
ligne--; /*pour etre compatible avec les indices du tableau*/
colonne--;
if (grille[ligne][colonne] != ' ')
printf("La case a deja ete remplie. Veuillez en choisir une autre :");
else {
grille[ligne][colonne] = symbole;
if (symbole == 'X')
symbole = 'O';
else
symbole = 'X';
}
} else
printf("Indice de ligne ou colonne incorrect. Veuillez resaisir :");
} while (grille[ligne][colonne] == ' ');
}
/*Test pour voir si l'un des joueurs a gagne : */
int testgagnant(char grille[nblignes][nbcolonnes], char symbole) {
int i, j, somme, gagne = 0;
for (i = 0; i < nblignes; i++, somme = 0) {
for (j = 0; j < nbcolonnes; j++)
somme += grille[i][j];
if ((somme == 237) || (somme == 264))
gagne = 1;
}
for (j = 0; j < nbcolonnes; j++, somme = 0) {
for (i = 0; i < nblignes; i++)
somme += grille[i][j];
if ((somme == 237) || (somme == 264))
gagne = 1;
}
if ((grille[0][0] + grille[1][1] + grille[2][2] == 237) ||
(grille[0][0] + grille[1][1] + grille[2][2] == 264) ||
(grille[0][2] + grille[1][1] + grille[2][0] == 237) ||
(grille[0][2] + grille[1][1] + grille[2][0] == 264))
gagne = 1;
if (gagne) {
printf("Felicitations au joueur ayant les %c qui a gagne\n", symbole);
return 1;
}
/* Test si la grille est pleine :*/
for (i = 0; i < nblignes; i++)
for (j = 0; j < nbcolonnes; j++)
if (grille[i][j] == ' ')
return 0;
printf("Aucun des 2 joueurs n'a gagne");
return 2;
}
int main() {
char grille[nblignes][nbcolonnes];
char symbole;
initialisergrille(grille);
affichergrille(grille);
printf("Veuillez choisir votre symbole, O ou X :");
scanf(" %c", &symbole);
do {
mettresymbole(symbole, grille);
affichergrille(grille);
} while (!testgagnant(grille, symbole));
return 0;
}
```</stdio.h>
#include <stdio.h>
#define nblignes 3
#define nbcolonnes 3
//char grille[nblignes][nbcolonnes];
/*Initialisation de la grille du morpion a vide : */
void initialisergrille(char grille[nblignes][nbcolonnes]) {
int i, j;
for (i = 0; i < nblignes; i++)
for (j = 0; j < nbcolonnes; j++)
grille[i][j] = ' ';
}
/*Affichage de la grille du morpion : */
void affichergrille(char grille[nblignes][nbcolonnes]) {
int i, j;
for (i = 0; i < nblignes; i++) {
for (j = 0; j < nbcolonnes; j++)
printf("%c|", grille[i][j]);
printf("\n- - -\n");
}
return;
}
/*Saisie des coordonnees du symbole a mettre sur la grille. Si les coordonnees sont en dehors de la grille ou si la case a deja ete remplie, la saisie est refusee, un message d'erreur s'affiche et le joueur doit rejouer. */
void mettresymbole(char symbole, char grille[nblignes][nbcolonnes]) {
int ligne, colonne;
printf("Veuillez donner les numeros de la ligne et de la colonne :");
do {
scanf("%i %i", &ligne, &colonne);
if ((ligne > 0) && (ligne <= nblignes) && (colonne > 0) && (colonne <= nbcolonnes)) {
ligne--; /*pour etre compatible avec les indices du tableau*/
colonne--;
if (grille[ligne][colonne] != ' ')
printf("La case a deja ete remplie. Veuillez en choisir une autre :");
else {
grille[ligne][colonne] = symbole;
if (symbole == 'X')
symbole = 'O';
else
symbole = 'X';
}
} else
printf("Indice de ligne ou colonne incorrect. Veuillez resaisir :");
} while (grille[ligne][colonne] == ' ');
}
/*Test pour voir si l'un des joueurs a gagne : */
int testgagnant(char grille[nblignes][nbcolonnes], char symbole) {
int i, j, somme, gagne = 0;
for (i = 0; i < nblignes; i++, somme = 0) {
for (j = 0; j < nbcolonnes; j++)
somme += grille[i][j];
if ((somme == 237) || (somme == 264))
gagne = 1;
}
for (j = 0; j < nbcolonnes; j++, somme = 0) {
for (i = 0; i < nblignes; i++)
somme += grille[i][j];
if ((somme == 237) || (somme == 264))
gagne = 1;
}
if ((grille[0][0] + grille[1][1] + grille[2][2] == 237) ||
(grille[0][0] + grille[1][1] + grille[2][2] == 264) ||
(grille[0][2] + grille[1][1] + grille[2][0] == 237) ||
(grille[0][2] + grille[1][1] + grille[2][0] == 264))
gagne = 1;
if (gagne) {
printf("Felicitations au joueur ayant les %c qui a gagne\n", symbole);
return 1;
}
/* Test si la grille est pleine :*/
for (i = 0; i < nblignes; i++)
for (j = 0; j < nbcolonnes; j++)
if (grille[i][j] == ' ')
return 0;
printf("Aucun des 2 joueurs n'a gagne");
return 2;
}
int main() {
char grille[nblignes][nbcolonnes];
char symbole;
initialisergrille(grille);
affichergrille(grille);
printf("Veuillez choisir votre symbole, O ou X :");
scanf(" %c", &symbole);
do {
mettresymbole(symbole, grille);
affichergrille(grille);
} while (!testgagnant(grille, symbole));
return 0;
}
```</stdio.h>
Creo que la mayoría de tus problemas provienen de tu función mettresymbole().
La condición de tu bucle do...while() siempre es verdadera si introduces coordenadas correctas (ya que en ese caso, habrás colocado el símbolo en lugar del espacio, por lo tanto, la condición de tu while es verdadera porque símbolo != ' ').
Los %i no los conozco, pero si funcionan para ti y quieres usarlos, mejor para ti, yo uso %d para los int.
Por otro lado, en tu función main(), es while(gagne==0); de lo contrario, no es una prueba sino una asignación (que en principio siempre funciona y devuelve el valor asignado, así que en el estado actual es como un while(0); por lo tanto no hay do...while();).
Y una última cosa: una función main() devuelve un int (no void).
Espero que esto te ayude, no sé si solo eso es lo que "estropea" tu programa ;-).
La condición de tu bucle do...while() siempre es verdadera si introduces coordenadas correctas (ya que en ese caso, habrás colocado el símbolo en lugar del espacio, por lo tanto, la condición de tu while es verdadera porque símbolo != ' ').
Los %i no los conozco, pero si funcionan para ti y quieres usarlos, mejor para ti, yo uso %d para los int.
Por otro lado, en tu función main(), es while(gagne==0); de lo contrario, no es una prueba sino una asignación (que en principio siempre funciona y devuelve el valor asignado, así que en el estado actual es como un while(0); por lo tanto no hay do...while();).
Y una última cosa: una función main() devuelve un int (no void).
Espero que esto te ayude, no sé si solo eso es lo que "estropea" tu programa ;-).
Muchas gracias a los dos por sus respuestas.
Loupius, con las modificaciones que hiciste, el programa funciona. Mil gracias. Solo queda un problema, y es que no cambia de O o de X.
Loupius, con las modificaciones que hiciste, el programa funciona. Mil gracias. Solo queda un problema, y es que no cambia de O o de X.
Gracias