Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Discussion: Projet de Puissance 4

  1. #1
    Invité de passage
    Homme Profil pro
    Webplanneur
    Inscrit en
    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 ();
    }

  2. #2
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 986
    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 : 16 986
    Points : 88 741
    Points
    88 741

    Par défaut

    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.

  3. #3
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 240
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 240
    Points : 5 843
    Points
    5 843

    Par défaut

    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 !

  4. #4
    Membre du Club

    Inscrit en
    octobre 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 31
    Points : 49
    Points
    49

    Par défaut

    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.

  5. #5
    Expert Confirmé Sénior

    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    2 240
    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 : 2 240
    Points : 5 205
    Points
    5 205

    Par défaut

    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.

    Pour faire des graphes, essayez yEd.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •