Avis + aide sur code pour jeu du Morpion

Fermé
Alcooline - 10 mai 2010 à 14:35
 Alcooline - 10 mai 2010 à 20:31
Bonjour !
J'ai commencé un petit projet qui consiste a créer un jeu du morpion en console. J'ai cependant rencontré quelques petits problèmes de compilation. Je vous poste le code, commenté ; je signale en dessous du code la ligne et le type du problème. J'aimerais aussi par la suite recevoir vos avis sur mon code ! Merci d'avance.

<code type="c">
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void remplir(int tableau[]); /* Qui sert à remplir le tableau donc, avec les numéros correspondant aux nombres de 0 a 8 dans la table ASCII.
J'avais la flem de les écrire a la main :) Et je les mets sous cette forme car je vais devoir afficher des 'X' et des 'O', ça sera donc plus facil pour la suite */
int comparer(int tableau[][], int caractere); /* Fonction qui sert à vérifier que personne n'a encore gagné*/

void transformer(int choix); /* Transforme le choix de l'utilisateur en numéro correspondant à ceux de la table ASCII, encore une fois par souci de facilité, cette fois ci pour les comparaisons. En effet 8 est différent de 48*/

int main()
{
// Declaration des variables
int i = 0, choix = 0, nombreTour = 0, verifTabO, verifTabX;
int solutions[8][3] = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}}; // Tableau 2D qui correspond aux "groupes gagnants"
int grille[9] = {0};

remplir(grille);

//On donne à ces variables la valeur retournée par la fonction, pour éviter de rappeler celle-ci tout le temps
verifTabO = comparer(solutions, 79);
verifTabX = comparer(solutions, 88);

printf("0 | 1 | 2 |\n3 | 4 | 5 |\n6 | 7 | 8 |\n"); // Grille de départ
do
{
do
{
printf("Joueur 1, veuillez choisir une case : ");
scanf("%d", &choix);
} while(choix < 0 || choix > 8); // Ceci pour éviter que l'utilisateur ne choisisse un nombre qui ne figure pas dans la grille
transformer(choix);// On transforme le nombre tapé en nombre de la table ASCII pour comparer aisément ci-dessous

for(i = 0; i < 9 ; i++)
{
if(choix == grille[i])
grille[i] = 79;// 79 équivaut à la lettre 'O' dans la table ASCII
printf("%c | ", grille[i]);//On affiche les caractères équivalents aux nombres de la table ASCII
if(i == 2 || i == 5) // On revient à la ligne à ces valeurs pour que la grille ait une forme de grille :)
printf("\n");

}
nombreTour++; //Il y aura forcément 9 tours maximum, vu que la grille est composée de 9 cases
if(!verifTabO || !verifTabX || nombreTour != 9)//On refait la même chose pour le joueur 2, à condition que le jeu ne soit pas terminé...
{

do
{
printf("Joueur 2, veuillez choisir une case :");
scanf("%d", &choix);
} while(choix < 0 || choix > 8);

for(i = 0; i < 9 ; i++)
{
if(choix == grille[i])
grille[i] = 88;//... à l'exception qu'on met ici le nombre équivalent à la lettre 'X'
printf("%c | ", grille[i]);
if(i == 2 || i == 5)
printf("\n");
}
nombreTour++;
}
} while(verifTabO != 1 || verifTabX != 1 || nombreTour != 9);// Et tout ceci, tant qu'aucune de ces trois conditions n'est vérifiée

if(verifTabO)
printf("C'est le joueur 1 qui a gagné !\n");

else if(verifTabX)
printf("C'est le joueur 2 qui a gagné !\n");
else
printf("Il y a eu match nul !\n");

return 0;
}

void remplir(int tableau[])
{
int i, nombre = 48;
for(i = 0; i < 9 ; i++)
{
tableau[i] = nombre;
nombre++;
}
}

int comparer(int tableau[][], int caractere)
{
/* Ici, on parcourt chaque case du tableau 2D, et à chaque fois que tableau[i][j] == caractere (donc à 'X' ou 'O'), on incrémente le compteur. S'il est égal à 3, c'est que les trois cases d'un des membres i du tableau sont des 'X' ou des 'O' et donc il y a un gagnant */
int i, j, compteur = 0;
for(i = 0; i < 8 ; i++)
{
for(j = 0; j < 3; j++)
{
if(tableau[i][j] == caractere)
compteur++;
if(compteur == 3)
return 1;
}
compteur = 0;
}

return 0;
}

void transformer(int choix)
{
int i, tab[] = {48,49,50,51,52,53,54,55,56};
for(i = 0; i < 9 ; i++)
{
if(choix == i)
choix = tab[i];
}
}
</code>


Les problèmes :
<code type="console">
morpion.c:7: error: array type has incomplete element type
morpion.c: In function `main':
morpion.c:21: error: type of formal parameter 1 is incomplete
morpion.c:22: error: type of formal parameter 1 is incomplete
morpion.c: At top level:
morpion.c:86: error: array type has incomplete element type
</code>




A voir également:

1 réponse

Jaina_ Messages postés 78 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 1 juin 2010 9
10 mai 2010 à 18:03
Salut !

Je n'ai pas regardé toutes les erreurs mais j'ai flashé sur une en particulier :
int comparer(int tableau[][], int caractere)
{
/* Ici, on parcourt chaque case du tableau 2D, et à chaque fois que tableau[i][j] == caractere (donc à 'X' ou 'O'), on incrémente le compteur. S'il est égal à 3, c'est que les trois cases d'un des membres i du tableau sont des 'X' ou des 'O' et donc il y a un gagnant */
int i, j, compteur = 0;
for(i = 0; i < 8 ; i++)
{
for(j = 0; j < 3; j++)
{
if(tableau[i][j] == caractere)
compteur++;
if(compteur == 3)
return 1;
}
compteur = 0;
}

Tableau est à deux dimensions, alors qu'avant c'est 1
Et à voir tes boucles, tu as tableau[9][3] (Oo ??), alors que ça doit être tableau[3][3].
Après faut voir, sinon l'idée est là !
0
Non non, il y a un tableau a une dimension et un autre à deux (celui à un est la grille de numéros qui au fur et à mesure enlève les numéros indisponibles, tandis que celui à 2D représente les "groupes" gagnants lorsqu'ils sont tous en 'X' ou en 'O' , par exemple {1,2,3}). Oui le tableau 2D est tableau[8][3], je ne vois pas où est le problème ! Autrement j'ai trouvé l'erreur, elle venait du fait que lorsqu'on utilise un tableau 2D dans une fonction il faut déclarer sa deuxieme dimension :
int comparer(int tableau[][3], int caractere);
Merci énormément d'avoir jeté un coup d'oeil et pour ta réponse, en effet ça n'a pas du être très agréable vu la tête du code sans mise en page !
0