Bonjour !
Je suis en premier année en école d'ingénieur, et nous devons réaliser un morpion en langage C à l'aide du logiciel code blocks.
Mon programme semble fini, compile, mais ne marche pas !
Il s'arrête à différents endroits...
Que faire ?
Code:
//TP5-6
//24/11/2009
//Céline THIS
//Programme : morpion
#include <stdio.h>
#include <stdlib.h>
#define DIM 5
//---------------------------déclaration des types structurés------------------------
struct joueur {//définition de la structure contenant le nom et la marque de chaque joueur
char nom[25];
char marque;
};
typedef struct joueur s_joueur;
struct cellule {//définition de la structure représentant chaque case du tableau, contenant 2 marques : case libre ou non, case piégée ou non
int permutation;//si=1 : piège, si=0 : affichage de la marque du joueur
int libre;//si=-1 : cellule libre
};
typedef struct cellule s_cellule ;
//---------------------------déclaration des sous-programmes-----------------
void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[]);
void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int joueur, int permutation);
int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM]);
void Changement_joueur(int joueur,int resultat,int libre);
//-----------------------------programme principal----------------------------
int main()
{
int cases_vides_restantes=25;
int joueur=0;
int libre;
int alignement_par_colonne=0;
int alignement_par_ligne=0;
int permutation;
int ligne,colonne;
int resultat;
s_joueur tab_j[2];
s_cellule grille[DIM][DIM]=
{{{0,-1},{0,-1},{0,-1},{0,-1},{1,-1}},
{{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
{{0,-1},{0,-1},{1,-1},{0,-1},{0,-1}},
{{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
{{1,-1},{0,-1},{0,-1},{0,-1},{0,-1}}};
printf("BIENVENUE SUR LE MORPION PIEGE\n\n\nLE PREMIER QUI ALIGNE 3 PIONS HORIZONTALEMENT OU VERTICALEMENT A GAGNE !!!\n\n\nATTENTION : Certaines cases transformeront le pion joue en pion adverse.\n\n");
printf("Entrez le nom du joueur 1 : ");
scanf("%s",tab_j[0].nom);
printf("Entrez la marque du joueur 1 : ");
scanf("%s",&tab_j[0].marque);
printf("Entrez le nom du joueur 2 : ");
scanf("%s",tab_j[1].nom);
printf("Entrez la marque du joueur 2 : ");
scanf("%s",&tab_j[1].marque);
Affichage_grille (grille,tab_j);
do
{ Pose_pion (tab_j,grille,joueur,permutation);
printf("GNiark");
Affichage_grille (grille,tab_j);
cases_vides_restantes--;
printf("GNiark2");
Verification_fin(ligne,colonne,grille);
printf("GNiark3");
Changement_joueur(joueur, resultat, libre);
}
while(resultat==0&&cases_vides_restantes!=0);
return 0;
}
void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int permutation, int joueur)
{
int ligne, colonne;
int j;
j=joueur;
printf ("C'est a %s de jouer.\n", tab_j[j].nom);
printf ("Entrer la ligne : ");
scanf("%d",&ligne);
ligne=ligne-1;
printf("Entrer la colonne : ");
scanf("%d",&colonne);
colonne=colonne-1;
if (permutation==0)
printf("_%c_|",tab_j[j].marque);
if (permutation==1)
printf("_%c_|",tab_j[j+1].marque);
}
void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[])
{
int ligne,colonne;
for(ligne=0;ligne<DIM;ligne++)
{ printf("\n");
for(colonne=0;colonne<DIM;colonne++)
{if(tab[ligne][colonne].libre==-1)
{printf("_%c_|",tab_j[tab[ligne][colonne].libre].marque);
}
printf(" |");
}
}
printf("\n");
}
int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM])
{
int resultat=0;
if ((tab[ligne-1][0].libre==tab[ligne-1][1].libre)&&(tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre!=-1))
resultat=1;
if ((tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre!=-1))
resultat=1;
if ((tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre==tab[ligne-1][4].libre)&&(tab[ligne-1][4].libre!=-1))
resultat=1;
if ((tab[0][colonne-1].libre==tab[1][colonne-1].libre)&&(tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre!=-1))
resultat=1;
if ((tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre!=-1))
resultat=1;
if ((tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre==tab[4][colonne-1].libre)&&(tab[4][colonne-1].libre!=-1))
resultat=1;
return resultat;
}
void Changement_joueur(int joueur,int resultat,int libre)
{
if (resultat==0&&libre==0)
{
if (joueur==0)
joueur==1;
else
joueur==0;
}
}
Dernière modification par yoda1234 ; 07/01/2010 à 18h01.
Il n'affiche pas le nom du joueur qui doit jouer, affiche la grille mais sans la marque du joueur qui vient de jouer... :/
Et l'exécution s'arrête dans la boucle do while, juste avant l'exécution du sous programme "vérification_fin"
07/01/2010 - 12h03
PA5CAL
Date d'inscription
décembre 2005
Localisation
Paris
Âge
46
Messages
7 677
Re : Langage C-morpion
Bonjour
Le sujet aurait plutôt sa place dans la rubrique informatique. Ici, c'est le forum électronique. Par ailleurs, afin que le code garde un semblant de lisibilité, il faut l'inclure dans le message à l'aides des balises [CODE] (bouton "#" au-dessus de la zone d'édition).
Envoyé par ceeline
Il n'affiche pas le nom du joueur qui doit jouer,
Peut-être est-ce dû au fait que la saisie de l'information "marque" est erronée (il s'agit d'un simple caractère, et non d'une chaîne à zéro terminal) et écrase les données de la pile (je n'ai pas le même compilateur, alors je ne peux pas reproduire le problème et je vois le nom du joueur chez moi, mais je pense que ça vient de là).
Envoyé par ceeline
affiche la grille mais sans la marque du joueur qui vient de jouer... :/
D'un autre côté, je ne vois pas que la grille a été modifiée après que le joueur a joué.
Envoyé par ceeline
Et l'exécution s'arrête dans la boucle do while, juste avant l'exécution du sous programme "vérification_fin"
Chez moi, le programme quitte normalement la boucle do...while parce que la variable n'a été initialisée nulle part, et contient la même valeur non nulle depuis le départ.
Je pense qu'il va falloir revoir les cours de langages C...
07/01/2010 - 13h24
Seb.26
Date d'inscription
juin 2005
Âge
35
Messages
1 696
Re : Langage C-morpion
Je me permet de remettre ton code en forme :
( comme disais PASCAL5, utilise la balise [C0DE] : c'est le bouton avec le # )
Code:
//TP5-6
//24/11/2009
//Céline THIS
//Programme : morpion
#include <stdio.h>
#include <stdlib.h>
#define DIM 5
//---------------------------déclaration des types structurés------------------------
struct joueur {//définition de la structure contenant le nom et la marque de chaque joueur
char nom[25];
char marque;
};
typedef struct joueur s_joueur;
struct cellule {//définition de la structure représentant chaque case du tableau, contenant 2 marques : case libre ou non, case piégée ou non
int permutation;//si=1 : piège, si=0 : affichage de la marque du joueur
int libre;//si=-1 : cellule libre
};
typedef struct cellule s_cellule ;
//---------------------------déclaration des sous-programmes-----------------
void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[]);
void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int joueur, int permutation);
int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM]);
void Changement_joueur(int joueur,int resultat,int libre);
//-----------------------------programme principal----------------------------
int main()
{
int cases_vides_restantes=25;
int joueur=0;
int libre;
int alignement_par_colonne=0;
int alignement_par_ligne=0;
int permutation;
int ligne,colonne;
int resultat;
s_joueur tab_j[2];
s_cellule grille[DIM][DIM]=
{{{0,-1},{0,-1},{0,-1},{0,-1},{1,-1}},
{{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
{{0,-1},{0,-1},{1,-1},{0,-1},{0,-1}},
{{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
{{1,-1},{0,-1},{0,-1},{0,-1},{0,-1}}};
printf("BIENVENUE SUR LE MORPION PIEGE\n\n\nLE PREMIER QUI ALIGNE 3 PIONS HORIZONTALEMENT OU VERTICALEMENT A GAGNE !!!\n\n\nATTENTION : Certaines cases transformeront le pion joue en pion adverse.\n\n");
printf("Entrez le nom du joueur 1 : ");
scanf("%s",tab_j[0].nom);
printf("Entrez la marque du joueur 1 : ");
scanf("%s",&tab_j[0].marque);
printf("Entrez le nom du joueur 2 : ");
scanf("%s",tab_j[1].nom);
printf("Entrez la marque du joueur 2 : ");
scanf("%s",&tab_j[1].marque);
Affichage_grille (grille,tab_j);
do
{ Pose_pion (tab_j,grille,joueur,permutati on);
printf("GNiark");
Affichage_grille (grille,tab_j);
cases_vides_restantes--;
printf("GNiark2");
Verification_fin(ligne,colonne ,grille);
printf("GNiark3");
Changement_joueur(joueur, resultat, libre);
}
while(resultat==0&&cases_vides _restantes!=0);
return 0;
}
void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int permutation, int joueur)
{
int ligne, colonne;
int j;
j=joueur;
printf ("C'est a %s de jouer.\n", tab_j[j].nom);
printf ("Entrer la ligne : ");
scanf("%d",&ligne);
ligne=ligne-1;
printf("Entrer la colonne : ");
scanf("%d",&colonne);
colonne=colonne-1;
if (permutation==0)
printf("_%c_|",tab_j[j].marque);
if (permutation==1)
printf("_%c_|",tab_j[j+1].marque);
}
void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[])
{
int ligne,colonne;
for(ligne=0;ligne<DIM;ligne++)
{ printf("\n");
for(colonne=0;colonne<DIM;colo nne++)
{if(tab[ligne][colonne].libre==-1)
{printf("_%c_|",tab_j[tab[ligne][colonne].libre].marque);
}
printf(" |");
}
}
printf("\n");
}
int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM])
{
int resultat=0;
if ((tab[ligne-1][0].libre==tab[ligne-1][1].libre)&&(tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre!=-1))
resultat=1;
if ((tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre!=-1))
resultat=1;
if ((tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre==tab[ligne-1][4].libre)&&(tab[ligne-1][4].libre!=-1))
resultat=1;
if ((tab[0][colonne-1].libre==tab[1][colonne-1].libre)&&(tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre!=-1))
resultat=1;
if ((tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre!=-1))
resultat=1;
if ((tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre==tab[4][colonne-1].libre)&&(tab[4][colonne-1].libre!=-1))
resultat=1;
return resultat;
}
void Changement_joueur(int joueur,int resultat,int libre)
{
if (resultat==0&&libre==0)
{
if (joueur==0)
joueur==1;
else
joueur==0;
}
}
* de plus :
> Où écris tu le pion dans ton tableau ? (voir Pose_pion )
> On ne gagne pas en alignant sur les diagonales ?
> Pourquoi pas simplement un 'X' et un 'O' pour les pions des joueurs ?
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
07/01/2010 - 15h43
freepicbasic
Date d'inscription
août 2006
Localisation
France
Âge
56
Messages
2 737
Re : Langage C-morpion
if (joueur==0)
joueur==1;
else
joueur==0;
le == est une comparaison booléenne
joueur=1; est une assignation
pose_pion
le paramètre tab n'est jamais utilisé pourquoi?
des variables pas initialisées
permutation
ligne
colonne
resultat
libre
ça c'est bloquant, comment les variables changent elles ?
while(resultat==0 && cases_vides _restantes!=0);
alignement_par_ligne n'est pas utilisé
alignement_par_colonne n'est pas utilisé