Bonjour ^^

(j'ai posté ce message sur un autre forum, mais il y a moins de monde et j'obtiens pas souvent de réponse alors qu'ici il y a beaucoup plus de monde).

voilà j'ai passé toute ma matiné à faire un joli TicTacToe, à vrai dire les seuls trucs que j'avais fait tout seul, c'était un programme pour calculer le théorème de Pythagore et la réciproque ou des petits trucs comme ça, là j'ai essayé un truc un peu plus complexe et surtout j'ai essayé de le faire en objet (bien que j'ai tout juste commencé le chapitre sur l'objet dans mon bouquin). Je l'ai fait entièrement tout seul (en fait j'ai bloqué une heure sur la fonction pour tester les possibilités si on a gagné, au départ je faisais if (tableau [0][0] == tableau [0][1] == tableau [0][2] == 'O') ou tableau [0][0] && tableau [0][1] && tableau [0][2] == 'O', mais rien en marchait et à la fin j'ai trouvé tableau [0][0] == 'O' && tableau [0][1] && 'O'... enfin bref.

Voilà le code. J'ai un petit problème au niveau de la classe Joueurs (lisez les commentaires dans la définition de la fonction vérifier() de la classe TicTacToe, ce sera plus simple) :

main() :

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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
#include "tictactoe.h"
#include "joueurs.h"
 
void afficherRegles();
 
int main()
{
   char jouer;
 
   cout << "\t\t\t*********JEU DU MORPION********* (v 1.0)\n\n\n"
        << "Afficher les regles ? (o/n) ";
   cin >> jouer;
 
   if (jouer == 'o')
   {
      afficherRegles();
   }
 
   cout << endl << endl << endl;
 
   Joueurs Personne1; // Créé les deux personnes qui jouent
   Joueurs Personne2;
 
   // Alors attention, ici c'est le bazar complet ^_^   
   do
   {
      TicTacToe tableJeu; // Créé un objet TicTacToe
 
      bool etat = false;
 
      tableJeu.dessiner();
 
      // Reste dans la boucle tant que toutes les cases n'ont pas été remplies
      // ou tant que Etat est false.
      for (int i = 0 ; i < 9 && etat == false ; i++)
      {
         int colonne, ligne;
 
         if (i % 2 == 0) // Permet à chaque joueur de jouer à tour de rôle
         {
            cout << "Joueur 1 (ligne colonne) : ";
            cin >> ligne >> colonne;
 
            tableJeu.remplir(ligne, colonne, 'X');
         }
 
         else
         {
            cout << "Joueur 2 (ligne colonne) : ";
            cin >> ligne >> colonne;
 
            tableJeu.remplir(ligne, colonne, 'O');
         }
 
         cout << endl;
         tableJeu.dessiner();
 
         // Vérifie qu'à partir du quatrième coup puisqu'il est impossible de
         // gagner en trois coups. Maintenant je ne sais pas si c'est mieux
         // de mettre cet opérateur ternaire plutôt que d'effectuer à chaque
         // fois toutes les possibilitées.         
         i > 3 ? (etat = tableJeu.verifier()) : ' ';        
      }
 
      etat == false ? cout << "Personne ne gagne, voulez-vous rejouer (o/n) ? " :
                      cout << "Voulez-vous rejouer (o/n) ? ";                      
      cin >> jouer;
 
      cout << endl << endl << endl;
   }
   while (jouer == 'o');        
 
   cin.ignore();
   return 0;
}
 
// Affiche les règles, tout simplement ^^
void afficherRegles()
{
   cout << "Vous devez aligner trois X ou trois O en diagonale, horizontale "
        << "ou verticale.\nPour valider une position, entrez d'abord la ligne "
        << "(0, 1 ou 2), puis la colonne (0, 1 ou 2) puis validez avec Enter."
        << endl << endl;
   system("PAUSE");
}
TicTacToe.h :

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
// Class automatically generated by Dev-C++ New Class wizard
 
#ifndef TICTACTOE_H
#define TICTACTOE_H
 
class TicTacToe
{
	public:
		TicTacToe();
		~TicTacToe();
		void dessiner() const;
		bool verifier() const;
		void remplir(int, int, char);
	private:
      char tableauJeu [3][3];
};
 
#endif // TICTACTOE_H
TicTacToe.cpp (d'ailleurs comment on appelle ça ? Je crois que TicTactoe.h porte le nom d'en tête, mais ou on définit le tout, ça porte quel nom ?) :

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
// Class automatically generated by Dev-C++ New Class wizard
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
 
#include "tictactoe.h" // class's header file
#include "joueurs.h"
 
// Initialise le plateau de jeu à un caractère blanc
TicTacToe::TicTacToe()
{
	for (int i = 0 ; i < 3 ; i++)
	   for (int j = 0 ; j < 3 ; j++)
	      tableauJeu [i][j] = ' ';
}
 
// Destructeur
TicTacToe::~TicTacToe()
{
}
 
// Dessine le tableau avec éventuellement des 'X' ou des 'O'.
// Méthode super pas clair du tout, à améliorer ^^.
void TicTacToe::dessiner() const
{
   cout << "    0   1   2" << endl << endl;
 
   for (int i = 0 ; i < 3 ; ++i)
   {
      cout << i << "  ";
 
      for (int j = 0 ; j < 3 ; ++j)
      {
         cout << " " << tableauJeu [i][j] << " |";
      }
         cout << endl << "   ---|---|---|" << endl;
   }
}
 
// Rempli le tableau à l'aide du caractère fourni. Si la ligne et la colonne
// demandé sont déjà prises par un caractère, un message d'erreur s'affiche.
void TicTacToe::remplir (int ligne, int colonne, char caractere)
{
   while ( (tableauJeu [ligne][colonne] == 'X') ||
           (tableauJeu [ligne][colonne] == 'O') )
   {
      int a, b;
 
      cout << "Place deja occupee. Entrez une nouvelle place : ";
      cin >> a >> b;
 
      ligne = a;
      colonne = b;
   }   
 
   tableauJeu [ligne][colonne] = caractere;
}
 
// Vérifie tout simplement chaque possibilité de gagner.
bool TicTacToe::verifier() const
{
   // Verification pour les 'X'
   if ( (tableauJeu [0][0] == 'X' && tableauJeu [0][1] == 'X' && tableauJeu [0][2] == 'X') ||
        (tableauJeu [1][0] == 'X' && tableauJeu [1][1] == 'X' && tableauJeu [1][2] == 'X') ||
        (tableauJeu [2][0] == 'X' && tableauJeu [2][1] == 'X' && tableauJeu [2][2] == 'X') ||
        (tableauJeu [0][0] == 'X' && tableauJeu [1][0] == 'X' && tableauJeu [2][0] == 'X') ||
        (tableauJeu [0][1] == 'X' && tableauJeu [1][1] == 'X' && tableauJeu [2][1] == 'X') ||
        (tableauJeu [0][2] == 'X' && tableauJeu [1][2] == 'X' && tableauJeu [2][2] == 'X') ||
        (tableauJeu [0][0] == 'X' && tableauJeu [1][1] == 'X' && tableauJeu [2][2] == 'X') ||
        (tableauJeu [0][2] == 'X' && tableauJeu [1][1] == 'X' && tableauJeu [2][0] == 'X') )
   {
      cout << "Joueur 1 gagne.\n\n";
      // Ce que je voudrai insérer mais qui ne marche pas :
      // Joueurs.setJoueur1()  : incrémenterai la valeur de 1.
      // Joueurs.lireJoueur()
      return true;
   }
 
   // Verification pour les 'O'
   if ( (tableauJeu [0][0] == 'O' && tableauJeu [0][1] == 'O' && tableauJeu [0][2] == 'O') ||
        (tableauJeu [1][0] == 'O' && tableauJeu [1][1] == 'O' && tableauJeu [1][2] == 'O') ||
        (tableauJeu [2][0] == 'O' && tableauJeu [2][1] == 'O' && tableauJeu [2][2] == 'O') ||
        (tableauJeu [0][0] == 'O' && tableauJeu [1][0] == 'O' && tableauJeu [2][0] == 'O') ||
        (tableauJeu [0][1] == 'O' && tableauJeu [1][1] == 'O' && tableauJeu [2][1] == 'O') ||
        (tableauJeu [0][2] == 'O' && tableauJeu [1][2] == 'O' && tableauJeu [2][2] == 'O') ||
        (tableauJeu [0][0] == 'O' && tableauJeu [1][1] == 'O' && tableauJeu [2][2] == 'O') ||
        (tableauJeu [0][2] == 'O' && tableauJeu [1][1] == 'O' && tableauJeu [2][0] == 'O') )
   {
      cout << "Joueur 2 gagne.\n\n";
      // Ce que je voudrai insérer mais qui ne marche pas :
      // Joueurs.setJoueur2()  : incrémenterai la valeur de 1.
      // Joueurs.lireJoueur()
      return true;
   }
 
   return false;
}
Joueurs.h :

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
// Class automatically generated by Dev-C++ New Class wizard
 
#ifndef JOUEURS_H
#define JOUEURS_H
 
class Joueurs
{
	public:
		Joueurs();
		~Joueurs();
		void setJoueur1() {joueur1++;}
		void setJoueur2() {joueur2++;}
		void lireJoueur() const;
	private:
      int joueur1;
      int joueur2;
};
 
#endif // JOUEURS_H
Joueurs.cpp :

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
// Class automatically generated by Dev-C++ New Class wizard
#include <iostream>
using std::cout;
 
#include "joueurs.h" // class's header file
 
// Initialise le nombre de victoire de chaque joueur à 0
Joueurs::Joueurs()
{
	joueur1 = 0;
	joueur2 = 0;
}
 
Joueurs::~Joueurs()
{
}
 
void Joueurs::lireJoueur() const
{
   cout << "Le joueur 1 a gagne " << joueur1 << " fois.\n"
        << "Le joueur 2 a gagne " << joueur2 << " fois.\n";
}
J'ai beau chercher j'ai pas réussi à le faire marcher. Peut-être un friend mais j'ai aps encore appris.

En outre j'aimerais savoir comment réduire main(), et une autre méthode qui prendrai moins de place pour la vérification, parceque c'est un peu bancal ce que j'ai fait tout de même ^^.

Merci.

Bakura, content d'avoir enfin réussi un truc intéressant en C++ ^^.[/code]