Bonjour, je dois ameliorer le code d'un puissance 4 que nous a donner notre prof.
On a ici un code de base fonctionnel qui reconnait les victoires horizontales et verticales mais pas en diagonale et malgrés pas mal de recherche je n'ai pas trouvé le moyen de le faire
Toute aide serait donc la bienvenue

voici le code :
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
 /*
 * @File:   Puissance4.cxx
 * @Authors: Alain Casali, Luc Bertrand, Marc Laporte
 * @Date: 29 novembre 2012
 * @Brief: 	gestion de la couleur dans un terminal
 * 			debut du puissance4		
 */
 
#include <iostream>
#include <iomanip> //setw
#include <vector>
 
#include <unistd.h> //sleep
 
using namespace std;
 
#define classdef typedef
 
namespace
{
	/* 
	 * taille du psuissance 4
	 */
 
	const char KJetonJoueur1 ('X');
	const char KJetonJoueur2 ('O');
	const char KVide         ('.'); 
 
	/*
	 * gestion de la couleurdu terminal
	 */
 
	const string 	KReset  ("0");
	const string  	KNoir   ("30");
	const string  	KRouge  ("31");
	const string  	KVert   ("32");
	const string  	KJaune  ("33");
	const string 	KBleu   ("34");
	const string  	KMAgenta("35");
	const string 	KCyan   ("36");
 
	void ClearScreen ()
	{
		cout << "\033[H\033[2J";
	} //ClearScreen ()
 
	void Couleur (const string & coul)
	{
		cout << "\033[" << coul.c_str () <<"m";
	} // Couleur()
 
	/* 
	 * definition des types 
	 */
 
	classdef vector <char> CVLigne;
	classdef vector <CVLigne> CVMatrice;
 
	/* 
	 * initialisation de la matrice
	 */
	void InitMat (CVMatrice & Mat) 
	{
		CVLigne Ligne (Mat.size (), KVide);
		for (unsigned i (0); i < Mat.size (); ++i)
			Mat [i] = Ligne;
	}//InitMat ()
 
	/*
	 * divers affichages
	 */
 
	void AfficheLigne (const CVLigne & Li)
	{
		for (unsigned i (0); i < Li.size (); ++i)
		{
			//attention au 4 et pas au 3 ici
			cout << (0 == i ? setw (3) : setw (4));
			switch (Li[i])
			{
			case KJetonJoueur1 :
				Couleur (KBleu);
				break;
			case KJetonJoueur2 :
				Couleur (KRouge);
				break;
			default :
				Couleur (KJaune);
				break;
			} // switch
			cout << Li [i];
		}
		cout << endl;
		Couleur (KReset);
	}// AfficheLigne ()
 
	void AfficheMatrice (const CVMatrice & Mat)
	{
		ClearScreen ();
		Couleur (KReset);
		for (unsigned i (0); i < Mat.size (); ++ i)
			AfficheLigne (Mat [i]); //, i);
	}// AfficheMatrice ()
 
	void AffichePuissance4  (const CVMatrice & Mat)
	{
		AfficheMatrice (Mat);
 
		const string KLigneTrait (3 * Mat.size (), '-');
		cout << KLigneTrait << endl;
 
		for (unsigned i (0); i < Mat.size (); ++i)
			cout << (0 == i ? setw (2) : setw (3)) << char ('A' + i);
		cout << endl;
	}// AffichePuissance4 ()
 
	/*
	 * fonction servant a positionner le jeton au bon endroit dans la matrice
	 */
 
	void PositionneJeton (CVMatrice & Mat, const unsigned NumCol, unsigned & NumLi, const bool CoupDuJoueur1)
	{
		NumLi = Mat.size () - 1;
		while (NumLi > 0 && (Mat [NumLi][NumCol] != KVide))
			--NumLi;
 
		Mat [NumLi][NumCol] = (CoupDuJoueur1 ? KJetonJoueur1 : KJetonJoueur2);
	} //PositionneJeton ()
 
	/*
	 * tests de victoire
	 */ 
 
	bool TestVictoireColonne (const CVMatrice& Mat, const unsigned NumLi, const unsigned NumCol, const bool CoupDuJoueur1)
	{
		const char KCarAInspecter = (CoupDuJoueur1 ? KJetonJoueur1 : KJetonJoueur2);
		if (NumLi > 3) return false;
 
		unsigned Li (NumLi + 1);
 
		while ((Li < Mat.size ()) && Mat [Li][NumCol] == KCarAInspecter)
			++Li;
 
		return (4 == Li - NumLi);
	} //TestVictoireColonne ()
 
	bool TestVictoireLigne (const CVMatrice& Mat, const unsigned NumLi, const unsigned NumCol, const bool CoupDuJoueur1)
	{
		const char KCarAInspecter = (CoupDuJoueur1 ? KJetonJoueur1 : KJetonJoueur2);
 
		const unsigned KNbInspectionsLi (NumCol < Mat.size () /2  ?  NumCol +1 : Mat.size () - NumCol);
		/*
		 * attention au transtypage du 2eme argument en int
		 * histoire qu'il puisse être négatif (si besoin)
		 */
		const int KPosDepart = max (0, int(NumCol - Mat.size () /2));
 
		for (unsigned NbInspections (0);  NbInspections < KNbInspectionsLi; ++NbInspections)
		{
			unsigned NbCorrespondances = 0;
			for (unsigned Pos (KPosDepart + NbInspections) ; (Pos < Mat.size ()) &&  (KCarAInspecter == Mat [NumLi][Pos]) ; ++Pos)
				++ NbCorrespondances;
 
			if (4 == NbCorrespondances) return true;
		}
		return false;
	} //TestVictoireLigne ()
 
	/*
	 * programme principal
	 */ 
 
	int ppal (void)
	{
 
		const unsigned KSize (7);
		unsigned NumPartie (1);
		const unsigned KMaxNumParties (KSize * KSize);
		CVMatrice Mat (KSize); 
 
		bool CoupDuJoueur1 (true);
		bool Victoire (false);
 
		InitMat (Mat) ; //Mat, KSize);
		AffichePuissance4 (Mat);
 
		while (NumPartie <= KMaxNumParties && ! Victoire)
		{
			cout << "tour numero : " << NumPartie << ", Joueur" 
				 << (CoupDuJoueur1 ? '1' : '2') << ", entrez une colonne : ";
 
			char NumCol;
			cin >> NumCol;
 
			NumCol = toupper (NumCol);
 
			//on s'assure que la colonne ne soit pas déjà pleine
			unsigned NumLi;
			PositionneJeton (Mat, NumCol - 'A', NumLi, CoupDuJoueur1);
 
			AffichePuissance4 (Mat);
 
			//on fait les tests de victoire
			if (TestVictoireColonne (Mat, NumLi, NumCol - 'A', CoupDuJoueur1) || 
				TestVictoireLigne (Mat, NumLi, NumCol - 'A', CoupDuJoueur1)) 
				Victoire = true;
 
			//augmentation du numéro de la partie
			++NumPartie;
 
			//changement de joueur
			CoupDuJoueur1 = !CoupDuJoueur1;
 
			//sleep (1);
		}//while (pas de victoire)
 
		if (!Victoire)
		{
			Couleur (KMAgenta);
			cout << "Aucun vainqueur" << endl;
			return 1;
		}
 
		Couleur (KVert);
		cout << "Félicitations Joueur" << (CoupDuJoueur1 ? '2' : '1') 
			 << " vous avez gagné :)" << endl;
		Couleur (KReset);
		return 0;
	} //ppal ()
 
} //namespace
 
int main ()
{
	return ppal ();
}