Bonsoir,

Après avoir réfléchi pendant tout un week-end, je fais appel à ce forum afin de trouver de l'aide...

J'ai un petit programme tout bête qui dois créer des joueurs dans un jeu de dada, tout le monde connais ça.

De 1 à 4 joueurs... lorsque je sélectionne 4, il me demande le prénom du 1er, du second, du troisième et LA, il plante sans AUCUN message d'erreur, la fenêtre DOS se ferme seule. Aucune erreur lors de la compilatio, aucun warning...

Qu'en pensez-vous ?


Contenu du fichier main.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
 
#include "cheval.h"
#include "constantes.h"
 
int main()
{
	srand(time(NULL));
 
	// Déclarations des variables
	int nbJoueurs = 0;
	int typeJoueur = -1;
	char *nomJoueur;
 
	joueur joueur_1, joueur_2, joueur_3, joueur_4;
 
	int i = 1;
 
	// Liste des joueurs
	joueur *listeJoueurs = NULL;
 
	// Initialisation des escaliers
	cheval matriceEscaliers[4][6];
 
	// Demande du nombre de joueur total
	while(nbJoueurs > 4 || nbJoueurs < 2){
		system("cls");
		printf("Combien de joueurs total (2-4) ?\n");
		scanf("%d", &nbJoueurs);
	}
 
	while(i <= nbJoueurs){
		if(i == 1){
				// Création du 1er joueur (humain obligatoire)
				printf("\n\nPrenom du joueur 1 (humain):\n");
				scanf("%s", &nomJoueur);
				joueur_1 = creationJoueur((char *)&nomJoueur, 0);
				printf("Bienvenue %s !\n", joueur_1->nom);
        }
 
		if(i == 2){
            // Création du 2ème joueur
            printf("\n\nJoueur 2 ?\n1 : Humain\n2 : Ordinateur\n");
            scanf("%d", &typeJoueur);
            if(typeJoueur == 1){
                printf("Quel est le prenom du joueur 2 ?\n");
                scanf("%s", &nomJoueur);
                joueur_2 = creationJoueur((char *)nomJoueur, 0);
            }else{
                joueur_2 = creationJoueur(NOM_JOUEUR_2, 1);
            }
            printf("Bienvenue %s !\n", joueur_2->nom);
		}
 
		if(i == 3){
            // Création du 3ème joueur
            printf("\n\nJoueur 3 ?\n1 : Humain\n2 : Ordinateur\n");
            scanf("%d", &typeJoueur);
            if(typeJoueur == 1){
                printf("Quel est le prenom du joueur 3 ?\n");
                scanf("%s", &nomJoueur);
                joueur_3 = creationJoueur((char *)nomJoueur, 0);
            }else{
                joueur_3 = creationJoueur(NOM_JOUEUR_3, 1);
            }
            printf("Bienvenue %s !\n", joueur_3->nom);
		}
 
		if(i == 4){
            // Création du 4ème joueur
            printf("\n\nJoueur 4 ?\n1 : Humain\n2 : Ordinateur\n");
            scanf("%d", &typeJoueur);
            if(typeJoueur == 1){
                printf("Quel est le prenom du joueur 4 ?\n");
                scanf("%s", &nomJoueur);
                joueur_4 = creationJoueur((char *)nomJoueur, 0);
            }else{
                joueur_4 = creationJoueur(NOM_JOUEUR_4, 1);
            }
            printf("Bienvenue %s !\n", joueur_4->nom);
        }
 
		i++;
	}
 
	printf("%s\n", joueur_2->nom);
 
	system("PAUSE");
 
	return 0;
}
 
 
 
// ----------------------------
// |                          |
// |  FONCTIONS DU PROGRAMME  |
// |                          |
// ----------------------------
 
 
// Cette fonction retourne un chiffre entre 1 et 6 (c'est un dé) :D
int lancerDeDe(){
	int valeur = 0;
    while(valeur == 0){
      int valeur = (int)(rand()%7);
    }
}
 
 
// La fonction suivante sert à créer un joueur
joueur creationJoueur(char *nom, int bot){
 
	joueur nouveau_joueur = malloc(sizeof(joueur));
 
	nouveau_joueur->chevauxJouables = 4;
	nouveau_joueur->chevauxEnclos = 4;
	nouveau_joueur->caseDepart = 0;
	nouveau_joueur->nom = nom;
	nouveau_joueur->bot = bot;
	nouveau_joueur->suivant = NULL;
 
	return nouveau_joueur;
 
}

Contenu du fichier cheval.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
// -----------------------------
// |                           |
// |  STRUCTURES DU PROGRAMME  |
// |                           |
// -----------------------------
 
// Cette structure représente un joueur et ses caractéristiques.
struct t_joueur{
	int chevauxJouables;				// 4 - Nbre de chevaux ayant gagné.
	int chevauxEnclos;					// Nbre de chevaux restant dans l'enclos.
	int caseDepart;							// Position de la case de départ. La case d'arrêt correspond à la case départ-1.
	char *nom;									// Nom du joueur.
	int bot;               			// A 1 si le joueur est un ordinateur, 0 sinon (humain).
	struct t_joueur *suivant; 	// Pointeur permettant d'accéder au joueur suivant.
};
 
typedef struct t_joueur *joueur;
 
 
// Cette structure représente un cheval et ses caractéristiques
struct t_cheval{
	joueur *proprietaire; 			// Pointeur vers le propriétaire du cheval
	int position;         			// Position du cheval sur le plateau
	int numero;           			// Numéro du cheval
};
 
typedef struct t_cheval *cheval;
 
 
// Variables globales
 
// Escaliers menant à la victoire
cheval **matriceEscaliers;
 
// Represente les cases du plateau de jeu
cheval *tableauPlateau;
 
 
// Prototypes de fonctions
 
// Création d'un joueur
// Retourne : un nouveau joueur
joueur creationJoueur(char *nom, int bot);
 
// Simule un lancement de dé.
// Retourne : un chiffre entre 1 et 6.
int lancerDeDe();
 
// Positionne le cheval de l'enclos d'un joueur sur la case de départ
// Param. : le joueur concerné
// Retourne : le cheval en question
cheval entrerChevalPlateau(int joueur);
 
// Remet le cheval d'un joueur dans l'enclos
// Param. : le cheval concerné
// Retourne : un entier (1 : succès, 0 : échec)
int sortirChevalPlateau(cheval leCheval);
 
// Teste si un cheval du joueur est disponible dans l'enclos
// Param. : le joueur concerné
// Retourne : un entier (1 : disponible, 0 : non disponible)
int chevalDispo(int joueur);
 
// Teste la présence d'un cheval sur la case
// Param. : la case concernée
// Retourne : le cheval si trouvé
cheval ChevalSurCase(int cellule);
 
// Teste si le cheval est ami d'un joueur
// Param. : le cheval/joueur concerné
// Retourne : un entier (1 : ami, 0 : ennemi)
int chevalAmi(cheval leCheval, joueur leJoueur);
 
// Ajoute un nouveau joueur au plateau
// Param. : Nom du joueur, un entier (1 : bot, 0 : humain)
void ajouterJoueur(char* nom, int bot);
 
// Ajout d'un vainqueur à la liste des gagnants
// Param. : le joueur concerné
void victoireJoueur(joueur leJoueur);
 
// Positionne un cheval sur la 1ere marche de ses escaliers
// Param. : le cheval concerné
void entrerChevalEscaliers(cheval leCheval);
 
// Sort un cheval de ses escaliers
// Param. : le cheval concerné
void sortirChevalEscaliers(cheval leCheval);
 
// Déplace un cheval sur ses escaliers d'une case
// Param. : le cheval concerné, le score du dé (entier de 1 à 6)
// Conditions : la valeur de scoreDe doit répondre aux règles du jeu.
void deplacerChevalEscaliers(cheval leCheval, int scoreDe);
 
// Déplace un cheval sur le plateau de jeu de scoreDe case
// Param. : le cheval concerné, le score du dé (entier de 1 à 6);
void deplacerChevalPlateau(cheval leCheval, int scoreDe);

Contenu du fichier constantes.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
/*
constantes.h
------------
 
Rôle : définit des constantes communes à tout le programme
*/
 
#define NOM_JOUEUR_2 "Christophe"
#define NOM_JOUEUR_3 "Mathieu"
#define NOM_JOUEUR_4 "Gwnenog"
Lorsque je mets ces lignes suivantes en commentaires, ça passe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
//joueur_3 = creationJoueur((char *)nomJoueur, 0);
//joueur_3 = creationJoueur(NOM_JOUEUR_3, 1);
//printf("Bienvenue %s !\n", joueur_3->nom);
Autrement ça ne passe pas, le programme se ferme de lui-même...


Avez-vous déjà rencontrer ce type de bug ?

Si oui, que faire ?

Merci à tous ceux qui répondrant,
Thomas