IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Projet de Puissance 4


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    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 : 1
    Points
    1
    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 : 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 ();
    }

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    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

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je ne connaissais pas le mot clé "classdef"
    Et pour cause !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define classdef typedef
    Ce genre de chose est à éviter absolument ! A part introduire un doute et tromper le lecteur, quel intéret ? aucun !
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    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 éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 139
    Points
    17 139
    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.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. [Projet] Application MFC : Puissance 4
    Par Inferno802 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/05/2015, 17h34
  2. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 14h52
  3. Projet Puissance 4
    Par chloe69 dans le forum C++
    Réponses: 5
    Dernier message: 28/04/2010, 17h24
  4. Les fichiers d'un projet
    Par Manolo dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2002, 17h51
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo