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 :

TicTacToe, petit problème


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut TicTacToe, petit problème
    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]

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    kes ki marche pas??

    je l ai copiler il marche trebien!!

    il t affiche des erreurs??

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Oui, il marche très bien, sauf si on réactive les deux trois lignes que j'ai mis en commentaire dans la définition de la fonction verifier, ça plus précisement :

    // Ce que je voudrai insérer mais qui ne marche pas :
    // Joueurs.setJoueur1() : incrémenterai la valeur de 1.
    // Joueurs.lireJoueur()

    Si on enlève les commentaires ça marche plus, parceque là en fait la classe Joueurs ne sert à rien. En fait ce que je veux c'est donc initialiser deux personnes, Joueurs joueur1, Joueurs joueur2. Et ensuite dès que joueur1 gagne ou joueur2 gagne, appelé la fonction setJoueur1 ou setJoueur2 pour incrémenter la valeur de joueur1 ou joueur2. Toutefois je n'arrive pas, dans la classe TicTacToe, appelé la fonction de la classe Joueurs.

    J'avais pensé au départ à créer les deux joueurs à même la classe TicTacToe, mais dès que l'on quitte la boucle do, l'objet est supprimé donc ça garde pas en mémoire le score des personnes.

    Je sais pas si je me suis bien fait ocmprendre ^^

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    quand tu ecris:

    joueurs.setjoueur1();

    ca veut dire koi??

    joueurs n est pas un objet mais une classe!!

    tu dois d abord instance joueurs pour pouvoir l utiliser!!

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    plus clairement:

    avant d utiliser tes fonctions setJoueurs1();

    ecri:

    Joueurs objet_joueurs;

    et ensuite appelle tes fonctions avec cet objet;

    objet_joueurs.setjoueur1();

  6. #6
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    A mon avis il y a un léger problème dans ton analyse du domaine.
    Ta fonction setJoueur, et les variables joueur1 et joueur2 aurait plus leur place dans la classe TicTacToe, puisqu'il s'agit des joueurs de la partie.
    Mais je crois qu'il y aurait encore un petit peu de travail, pour éviter ça:
    // Alors attention, ici c'est le bazar complet ^_^


    Enfin, juste une petite remarque qui me choque , ta classe Joueurs, est un modèle (un moule) pour creer une instance de joueur, donc pour creer 1 joueur.
    Il est donc préférable de l'appeller (la classe) Joueur..

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Ca ne marche pas mieux, j'ai mis ceci :

    cout << "Joueur 1 gagne.\n\n";
    Personne1.setJoueur();
    Personne1.lireJoueur();
    return true;

    dans les verifications des X

    et ceci dans les vérifications des O

    cout << "Joueur 2 gagne.\n\n";
    Personne2.setJoueur();
    Personne2.lireJoueur();
    return true;

    et la fonction lireJoueur :

    void Joueurs::lireJoueur() const
    {
    cout << "Le joueur 1 a gagne " << Personne1.lireJoueur << " fois.\n"
    << "Le joueur 2 a gagne " << Personne2.lireJoueur << " fois.\n";
    }

    Mais pour la fonction vérifier, étant dans la définition de classe TicTacToe, et ayant instancié les objets Joueurs dans main, il me dit qu'ils ne sont pas déclarés :/, ce qui est logique.

    J'avais pensé à faire, dans la classe TicTacToe, deux variables membres en plus, de type Joueurs, mais ca ne sert pas à grand chose puisque dès la fin de la boucle le tableau de jeu sera supprimé, avec tout ce qu'il y a dedans aussi donc ça ne change rien.

    Je sais pas si je suis très clair.

  8. #8
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    MatRem, oui désolé pour la classe Joueurs, je l'ai fait tout à l'heure rapidement, j'ai pas fait gaffe, en effet ça serait mieux Joueur, j'y penserai la prochaine fois ^^.

    Oui comme j'ai dit au message au dessus j'aurais pu créer deux variables membres dans la classe TicTacToe :

    Joueurs personne1
    Joueurs personne2

    mais le problème c'est que justement je les créé pour compter le nombre de victoire et que, dès qu'une partie est gagné ou égalité, l'objet est détruit, donc tout ce qui va avec (et par conséquent personne1 et personne2), pour être recréé, ce qui fait que le nombre de victoire sera toujours au maximum de un.

    La je fais une autre classe, et j'instancie les deux personnes en dehors de toute boucle, comme ça ils restent jusqu'à la fin du programme.

    EDIT : et pour le bazar je vais essayer de m'y atteler, mais j'ai pas trop d'expérience en prog alors j'ai tendance à coder à l'arrache sans trop réfléchir, et puis de toute façon j'ai pas trop d'idées pour diminuer le main :/. J'en suis sur qu'il y en a mais il y a plein de choses que je n'ai pas apprises encore.

  9. #9
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Une bonne solution est de faire un diagramme UML, pour analyser ton système AVANT de programmer. Pour un petit jeu comme ça, sa se prête bien en plus.
    Et je pense qu'ainsi, on progresse plus vite au niveau de la notion objet.
    Ensuite avec un peu d'expérience, et sur un petit système, on arrive à s'en passer, mais c'est toujours intéressant de l'avoir pour aider à comprendre le projet

  10. #10
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Oui bien sûr, j'essayerai de le faire pour un prochain projet dans le même style comme un puissance 4. En attendant, personne pour mon problème ? ^^.

  11. #11
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    personne ? Sinon j'ai essayé un nouveau truc, j'ai déclaré la classe Joueurs friend de la classe tictactoe mais ça ne marche pas mieux, enfin peut-être que je m'y suis mal pris pour la déclaration des friend j'ai pas encore vu ça donc j'ai fait un peu à l'arrache, enfin ça ne marche pas mieux.

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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