Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Débuter
Débuter Forum d'entraide pour débuter en langage de programmation C++. Avant de poster : cours d'initiation au C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/12/2012, 16h03   #1
jonas123
Invité de passage
 
Homme
Webplanneur
Inscription : décembre 2012
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Webplanneur

Informations forums :
Inscription : décembre 2012
Messages : 1
Points : 0
Points : 0
Par défaut Projet de Puissance 4

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 :
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 ();
}
jonas123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 07h43   #2
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 372
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2008
Messages : 10 372
Points : 39 575
Points : 39 575
Bonjour,

Personnellement, je ne serais pas contre une découpe du projet en plusieurs fichiers et même, si vous êtes en C++, une découpe en classe logique (approche orientée objet), afin de faire que le jeu puisse être modulable et extensible.
Une fois le code refactorisé, il sera plus facile à prendre en main et à modifier.

Je ne connaissais pas le mot clé "classdef"

Sinon, bien sur, compilé toujours avec le maximum de warnings sera un avantage
Un petit coup de valgrind ou autre débogueur mémoire permettra de vérifier la propreté du code.
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 10h01   #3
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 539
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 539
Points : 4 073
Points : 4 073
Citation:
Envoyé par LittleWhite Voir le message
Je ne connaissais pas le mot clé "classdef"
Et pour cause !
Code :
#define classdef typedef
Ce genre de chose est à éviter absolument ! A part introduire un doute et tromper le lecteur, quel intéret ? aucun !
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/12/2012, 07h45   #4
nyergk
Invité de passage
 
Inscription : octobre 2011
Messages : 15
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 15
Points : 4
Points : 4
moi aussi je suis debutant en programmation , mais bon la victoire en diagonale c est quand meme pas trop compliqué comme algorithme, y a que 2 possibilités

1) x+1 et y+1
2) x+1 et y-1

vous parcourez systematiquement toutes les diagoonales du tableau simplement et voila le tour est joué, on peut meme ameliorer l algorithme.
nyergk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 09h09   #5
leternel
Membre Expert
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 1 175
Points : 2 476
Points : 2 476
mieux encore, uniquement les diagonales autour du pion joué...
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
  • Une variable de moins est une source d'erreur en moins.
  • Un pointeur de moins est une montagne d'erreurs en moins.
  • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h05.


 
 
 
 
Partenaires

Hébergement Web