Correction du morpion en c

Fermé
dr_melik Messages postés 43 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 16 octobre 2009 - 17 févr. 2008 à 13:09
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 17 févr. 2008 à 15:17
Bonjour,
svp j'ai fait un programme du morpion en c mais i y a eu des fautes que je n'ai pas pu les corriger,
donc svp qui peut m'aider à trouver la solution est me donner la correction.
cé urgent

#include<stdio.h>
#include<conio.h>
#define Lmax 3
#define Cmax 3
typedef int tab[Lmax][Cmax];
tab t;
void Miseazero(tab t)
{
int i,j ;
for(i=0;i<Lmax;i++)
for(j=0;j<Cmax;j++)
t[i][j]=0;
}
void affichetableau(tab t)
{
int i,j;
for(i=0;i<Lmax;i++){
for(j=0;j<Cmax;j++)
printf("%d ",t[i][j]);
printf("\n\n\n");
}
}
int coupvalide(tab t,int a,int b)
{
int trouve=0;
if(t[a][b]==0)
trouve=1;
else trouve=0;
return(trouve);
}
int ver(tab t)
{
int i,j,cond=0;
do
{
j=0;
for(i=0;i<Lmax;i++)
if (t[i][j]==1||t[i][j]==2)
cond=1;
j++;
}
while(j<3);
return(cond);
}
int lignehor(tab t)
{
int i,j,cond=0;
do
{
i=0;
for(j=0;j<Cmax;j++)
if(t[i][j]==1||t[i][j]==2)
cond=1;
i++;
}
while(i<3);
return(cond);
}
int lignediagD(tab t)
{
int i,cond=0;
for(i=0;i<Lmax;i++)
if(t[i][i]==1||t[i][i]==2)
cond=1;
return(cond);
}
int lignediagG(tab t)
{
int i,j,cond=0;
for(i=0;i<Lmax;i++)
for(j=2;j<1;j--)
if(t[i][j]==1||t[i][j]==2)
cond=1;
return(cond);
}
int saisieval(tab t,int a,int b,int numjoueur)
{
int cond=0;
if(coupvalide(t,a,b)==1)
{
t[a][b]=numjoueur;
cond=1;
}
else
cond=0;
return(cond);
}
void main()
{
int l,c,a,b,i=1;
clrscr();
Miseazero(t);
affichetableau(t);
getch();
do
{
if(i%2==1)
{
do{
printf("le joueur1 joue");
printf("\n taper l :");
scanf("%d",&l);
printf("\n taper c :");
scanf("%d",&c);
}
while((saisieval(t,l,c,1)==0)||((l>3)&&(c>3)));
affichetableau(t);
}else
{
do{
printf("le joueur2 joue");
printf("\n taper a :");
scanf("%d",&a);
printf("\n taper b :");
scanf("%d",&b);
}while((saisieval(t,a,b,2)==0)||((a>3)&&(b>3)));
affichetableau(t);
}
i++;
}
while((i<10)&&(ver(t)==0)&&(lignehor(t)==0)&&(lignediagD(t)==0)&&(lignediagG(t)==0));
if(i==9) printf("execo");
else if((i-1)%2==1) printf("le joueur1 a gagner");
else if((i-1)%2==0) printf("le joueur2 a gagner");
getch();
}
A voir également:

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
17 févr. 2008 à 13:36
Salut,

Qu'est-ce qui ne va pas dans ton programme ? Erreur de compilation ? Ou erreur de fonctionnement (si oui, précise laquelle)

Cordialement
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
17 févr. 2008 à 13:46
Re,
En fait, j'ai vu des choses bizarres dans ton code. Tu as mis i=0, dans la boucle do while(i<3). Je pense donc que ton programme devait rester indéfiniment dans une fonction. Je te corrige la fonction, je te laisse rectifier les autres fonctions qui ont la même erreur.
De plus, ta condition pour voir si trois pièces d'une même couleur sont alignées, sont fausses. Je te laisse y réfléchir dessus, si tu trouves vraiment pas, repasse sur le forum, on t'aidera ;)

int lignehor(tab t)
{
  int i,j,cond=0;
  i=0;
  do
    {
      for(j=0;j<Cmax;j++)
	if(t[i][j]==1||t[i][j]==2)
	  cond=1;
      i++;
    }
  while(i<3);
  return(cond);
}
0
dr_melik Messages postés 43 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 16 octobre 2009 6
17 févr. 2008 à 13:56
salut,mais désolé je n'ai pas compris la faute
(i=0) c'est une initialisation et tu vois qu'après je l'ai incrémenté :

for(j=0;j<Cmax;j++)
if(t[i][j]==1||t[i][j]==2)
cond=1;
i++;
et j'espère que tu me donne la correction le plus tot que possible et merci d'avance.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
17 févr. 2008 à 14:01
Je sais bien que c'est l'initialisation.
Mais regarde ton code de plus près.
int ver(tab t)
{
    int i,j,cond=0;
    do
    {
         j=0;
        for(i=0;i<Lmax;i++)
        if (t[i][j]==1||t[i][j]==2)
            cond=1;
        j++;
    }
    while(j<3);
    return(cond);
} 

Tu définis j=0, dans la boucle do while. Donc ton code va incrémenter j, puis mettre j à 0, puis incrémenter j, puis mettre j à 0.
Il faut donc que tu sortes j de la boucle do while. Regarde mon post précédent, je t'ai apporté la correction.
Sinon je t'ai demandé quelles étaient tes erreurs ? Compilation, erreur de fonctionnement, ...
Et je te maintiens toujours que tes fonctions pour vérifier s'il y a un gagnant sont fausses.

Et enfin, lorsque tu postes un code, utilise la touche "conservation automatique du code" à droite du bouton "souligné". Et indente ton code, car c'est illisible. Merci

Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dr_melik Messages postés 43 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 16 octobre 2009 6
17 févr. 2008 à 14:50
merci mais j'ai un problème au niveau de cette ligne
void main()
{
int l,c,a,b,i=1;
clrscr();
Miseazero(t);
affichetableau(t);
getch();
ainsi que pour le test du gagnant.et merci d'avance.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
17 févr. 2008 à 15:17
Salut,
Tu as un problème, c'est vague. Erreur de compilation ? Et mets ton message d'erreur. Si tu mets pas ça, on pourra pas trop t'aider.
Le test du gagnant, tu dois vérifier si trois cases sont alignées. Par exemple : if( t[0][0]==t[0][1] && t[0][0]==t[0][2] && t[0][0]!=0) printf("aligné");

Cordialement
0