Bonjour,

J'ai écris un petit morpion. Le jeu ne fonctionne pas trop mal sauf sur poit : certaines variables locale à une fonction prennent toujours la même valeur. Voici la fonction en questiion :

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
 
char jeuAuto(char * valeurs, int coordonnee) {
 
	int value=0;
	int coord=0;
 
 
 
	/* "pondération" en fonction de l'intérêt en surchargeant value au fur et à mesure */
	/* d'abord les cases les moins intérréssantes et n'ayant pas été remplies : */
	if (valeurs[2] == 42) value=2; 
	if (valeurs[4] == 42) value=4;
	if (valeurs[6] == 42) value=6;
	if (valeurs[8] == 42) value=8;
	/* ensuite les cases moyennes */
	if (valeurs[1] == 42) value=1;
	if (valeurs[3] == 42) value=3;
	if (valeurs[7] == 42) value=7;
	if (valeurs[9] == 42) value=9;
	/* et enfin la case la plus intérréssante (que normalement Joueur1 prend ;-) ) */
	if (valeurs[5] == 42) value=5;
 
 
 
	if (coordonnee=='x') {
		switch (value) {
			case 5:
				coord=2;
			case 9:
				coord=3;
			case 7:
				coord=3;
			case 3:
				coord=1;
			case 1:
				coord=1;
			case 8:
				coord=3;
			case 6:
				coord=2;
			case 4:
				coord=2;
			case 2:
				coord=1;
		}
	}
 
 
	if (coordonnee=='y') {
		switch (value) {
			case 5:
				coord=2;
			case 9:
				coord=3;
			case 7:
				coord=1;
			case 3:
				coord=3;
			case 1:
				coord=1;
			case 8:
				coord=2;
			case 6:
				coord=3;
			case 4:
				coord=1;
			case 2:
				coord=2;
		}
	}
 
	printf("value : %i, coord %i, coordonnee %c\n",value, coord, coordonnee );
 
	return coord;
 
 
}
Son but est de faire jouer l'ordinateur.
La série de lignes "if ..." permet de vérifier que les case du morpion soit vides lorsque l'on souhaite y mettre un symbole 'X' ou 'O' : 42 est la valeur ascii de '*' dont je me sert pour remplir le tableau et que la chaine valeurs contient en 9 exemplaires lors de son initialisation dans la fonction main(...). Cette partie partie permet aussi de simuler la pondération en fonction de l'intérêt des case (la variable value faisant l'ongjet d'affectaion de valeurs succesives jusqu'à ce que la case la plus intérérsante qui soit disponible lui soit attribuée. Cette partie semble pluôt bien fonctionner.

La partie avec les deux 'select ...' pose problème, on se retrouve tourjours avec x=1 et y=2 :

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
 
{ c }  » ./morpion.exe m                                                                             /cygdrive/e/bin/scripts/c
+---+---+---+
+ * + * + * +
+---+---+---+
+ * + * + * +
+---+---+---+
+ * + * + * +
+---+---+---+
Joueur 1, donnez les coordonnées de la case à jouer
2 2
+---+---+---+
+ * + * + * +
+---+---+---+
+ * + X + * +
+---+---+---+
+ * + * + * +
+---+---+---+
value : 9, coord 2, coordonnee y
value : 9, coord 1, coordonnee x
Coordonnées demandées par l'ordinateur : 2 pour y et 1 pour x.
+---+---+---+
+ * + O + * +
+---+---+---+
+ * + X + * +
+---+---+---+
+ * + * + * +
+---+---+---+
Joueur 1, donnez les coordonnées de la case à jouer
3 3
+---+---+---+
+ * + O + * +
+---+---+---+
+ * + X + * +
+---+---+---+
+ * + * + X +
+---+---+---+
value : 7, coord 2, coordonnee y
value : 7, coord 1, coordonnee x
Coordonnées demandées par l'ordinateur : 2 pour y et 1 pour x.
Case dejà jouée ! Vous perdez un tour !
+---+---+---+
+ * + O + * +
+---+---+---+
+ * + X + * +
+---+---+---+
+ * + * + X +
+---+---+---+
Joueur 1, donnez les coordonnées de la case à jouer
1 3
+---+---+---+
+ * + O + X +
+---+---+---+
+ * + X + * +
+---+---+---+
+ * + * + X +
+---+---+---+
value : 7, coord 2, coordonnee y
value : 7, coord 1, coordonnee x
Coordonnées demandées par l'ordinateur : 2 pour y et 1 pour x.
Case dejà jouée ! Vous perdez un tour !
+---+---+---+
+ * + O + X +
+---+---+---+
+ * + X + * +
+---+---+---+
+ * + * + X +
+---+---+---+
Joueur 1, donnez les coordonnées de la case à jouer
Du coup, le jeu se déroule de façon anormale.

Voici le code complet au cas ou :

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
 
#include <stdio.h>
#include <stdlib.h>
 
void affichePlateau(char * valeurs);
void afficheLine(); /* Ligne de sépartion horizontale */
void afficheValue(char a, char b, char c);
void modifieValeurs(int x, int y, char * valeurs, char motif);
int verifGagnant(char * valeurs);
char jeuAuto(char * valeurs, int coordonnee); /* L'ordinateur est le joueur2 */
 
int main(int argc, char const *argv[])
{
 
	char valeurs[10]={42,42,42,42,42,42,42,42,42,42}; /* des '*' pour présenter le tableau vierge en début de jeu */
	char * val=valeurs;
	int j1x,j1y,j2x,j2y; /* coordonnées saisie par les joueurs */
	int compteur=0;
	int iswinner=0;
 
	affichePlateau(val);
 
	while (compteur<9) {
		printf("Joueur 1, donnez les coordonnées de la case à jouer\n");
		scanf("%d %d",&j1x, &j1y);
		if (j1y>3 || j1y<1 || j1x>3 || j1x<1) {
			printf("Cette case n'existe pas. Vous avez perdu un tour !\n");
		}
		else {
			modifieValeurs(j1x, j1y, val, 'X');
			affichePlateau(val);
			compteur++;
		}
		iswinner=verifGagnant(val);
		if (iswinner==1) {
			printf("Le joueur 1 a gagné ! \n");
			exit(0);
		}
		if (compteur==9) break;
		if (! argv[1]) {
			printf("Joueur 2, donnez les coordonnées de la case à jouer\n");
			scanf("%d %d",&j2x, &j2y);
		}
		else {
			j2y=jeuAuto(val,'y');
			j2x=jeuAuto(val,'x');
			printf("Coordonnées demandées par l'ordinateur : %i pour y et %i pour x.\n", j2y, j2x);
		}
		if (j2y>3 || j2y<1 || j2x>3 || j2x<1) {
			printf("Cette case n'existe pas. Vous avez perdu un tour !\n");
		}
		else {
			modifieValeurs(j2x, j2y, val, 'O');
			affichePlateau(val);
			compteur++;
		}
		iswinner=verifGagnant(val);
		if (iswinner==1) {
			printf("Le joueur 2 a gagné ! \n");
			exit(0);
		}
 
	}
 
	printf("\n\nLa partie est finie.\n");
 
	return 0;
}
 
void affichePlateau(char * valeurs) {
 
	/*Affichage di plateau mis à jour avec les valeurs de la chaine.*/
 
	afficheLine();
	afficheValue((char) valeurs[1], (char) valeurs[2], (char) valeurs[3]);
	afficheLine();
	afficheValue((char) valeurs[4],(char) valeurs[5],(char) valeurs[6]);
	afficheLine();
	afficheValue((char) valeurs[7],(char) valeurs[8],(char) valeurs[9]);
	afficheLine();
 
}
 
/* Les deux fonctions qui suivent servent juste a formater le tableau.*/
 
void afficheLine() {
	printf("+---+---+---+\n");
}
 
void afficheValue(char a, char b, char c) {
	printf("+ %c + %c + %c +\n", a, b, c);	
}
 
void modifieValeurs(int x, int y, char * valeurs, char motif) {
 
	int position;
 
	/* En fonction de la position dans la chaine et sa disponibilité, on affecte 'X' ou 'O' à la case choisie. */
 
	if (x==1 && y==1) position=1;
	if (x==1 && y==2) position=2;
	if (x==1 && y==3) position=3;
	if (x==2 && y==1) position=4;
	if (x==2 && y==2) position=5;
	if (x==2 && y==3) position=6;
	if (x==3 && y==1) position=7;
	if (x==3 && y==2) position=8;
	if (x==3 && y==3) position=9;
 
 
	if (valeurs[position]==42) {
		 valeurs[position]=motif;
		}
	else {
		printf("Case dejà jouée ! Vous perdez un tour !\n");
	}
 
}
 
int verifGagnant(char * valeurs) {
 
	int win=0;
 
	/* On verifie que trois cases contigues soit égales ('X' ou 'O') et que ces trois case ne comportent pas d'étoiles pour éviter */
	/* une succession de trois étoiles qui serait autrement considérée comme bonne.*/
 
	if (valeurs[1] == valeurs[2] && valeurs[2] == valeurs[3] && valeurs[1] != 42 && valeurs[2] != 42 && valeurs[3] != 42) win=1;
	if (valeurs[4] == valeurs[5] && valeurs[4] == valeurs[6] && valeurs[4] != 42 && valeurs[5] != 42 && valeurs[6] != 42) win=1;
	if (valeurs[7] == valeurs[8] && valeurs[7] == valeurs[9] && valeurs[7] != 42 && valeurs[8] != 42 && valeurs[9] != 42) win=1;
 
	if (valeurs[1] == valeurs[4] && valeurs[1] == valeurs[7] && valeurs[1] != 42 && valeurs[2] != 42 && valeurs[3] != 42) win=1;
	if (valeurs[2] == valeurs[5] && valeurs[2] == valeurs[8] && valeurs[1] != 42 && valeurs[2] != 42 && valeurs[3] != 42) win=1;
	if (valeurs[3] == valeurs[6] && valeurs[3] == valeurs[9] && valeurs[1] != 42 && valeurs[2] != 42 && valeurs[3] != 42) win=1;
 
	if (valeurs[1] == valeurs[5] && valeurs[1] == valeurs[9] && valeurs[1] != 42 && valeurs[5] != 42 && valeurs[9] != 42) win=1;
	if (valeurs[7] == valeurs[5] && valeurs[7] == valeurs[3] && valeurs[7] != 42 && valeurs[5] != 42 && valeurs[3] != 42) win=1;
 
	return win;
 
}
 
char jeuAuto(char * valeurs, int coordonnee) {
 
	int value=0;
	int coord=0;
 
 
 
	/* "pondération" en fonction de l'intérêt en surchargeant value au fur et à mesure */
	/* d'abord les cases les moins intérréssantes et n'ayant pas été remplies : */
	if (valeurs[2] == 42) value=2; 
	if (valeurs[4] == 42) value=4;
	if (valeurs[6] == 42) value=6;
	if (valeurs[8] == 42) value=8;
	/* ensuite les cases moyennes */
	if (valeurs[1] == 42) value=1;
	if (valeurs[3] == 42) value=3;
	if (valeurs[7] == 42) value=7;
	if (valeurs[9] == 42) value=9;
	/* et enfin la case la plus intérréssante (que normalement Joueur1 prend ;-) ) */
	if (valeurs[5] == 42) value=5;
 
 
 
	if (coordonnee==120) {
		switch (value) {
			case 5:
				coord=2;
			case 9:
				coord=3;
			case 7:
				coord=3;
			case 3:
				coord=1;
			case 1:
				coord=1;
			case 8:
				coord=3;
			case 6:
				coord=2;
			case 4:
				coord=2;
			case 2:
				coord=1;
		}
	}
 
 
	if (coordonnee==121) {
		switch (value) {
			case 5:
				coord=2;
			case 9:
				coord=3;
			case 7:
				coord=1;
			case 3:
				coord=3;
			case 1:
				coord=1;
			case 8:
				coord=2;
			case 6:
				coord=3;
			case 4:
				coord=1;
			case 2:
				coord=2;
		}
	}
 
	printf("value : %i, coord %i, coordonnee %c\n",value, coord, coordonnee );
 
	return coord;
 
 
}
Merci pour votre aide et bon week end