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 :

Problème basique avec un arbre


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Problème basique avec un arbre
    Bonjour,

    Ça fait un bail que j'ai pas utilisé d'arbre en C#, et là, je sèche sur un problème vraiment basique...

    J'ai une classe de base : "GameNode". Il s'agit du type générique des noeuds de mon arbre.
    La classe "Animal" hérite de "GameNode", et n'a pas d'enfants possibles.
    La classe "Question" hérite de "GameNode" et a deux enfants de type "GameNode", "Oui" et "Non".

    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
     
        class GameNode
        {
            public string Text = string.Empty;
     
            public GameNode(string text)
            {
                this.Text = text;
            }
        }
     
        class Question : GameNode
        {
            public GameNode Oui = null;
            public GameNode Non = null;
     
            public Question (string text) : base(text)
            {
            }
        }
     
        class Animal : GameNode
        {
            public Animal (string text) : base(text)
            {
            }
        }
    Je fais ensuite le "jeu des animaux" (c'est à dire que le système pose des questions jusqu'à ce qu'il devine l'animal auquel on est en train de penser).

    Et lorsque le programme perds, il demande à quel animal on pensait, et quelle question aurait pu permettre de le trouver.

    Le programme basique, idéal pour se remettre à la programmation...

    Toute la phase de questions/réponses se passe bien.

    Jusqu'au moment où le programme pense à un animal (il n'a plus de question en stock), et que ce n'est pas le bon animal.

    A ce moment, il faut créer une question.
    Dans "oui", mettre le nouvel animal.
    Dans "non", mettre l'ancien animal.
    Et remplacer l'ancien animal par cette nouvelle question.

    Par exemple, voici mon arbre sérialisé en XML :
    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
     
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <animals>
      <question text="Est-ce un carnivore ?">
        <oui>
          <question text="Est-ce un poisson ?">
            <oui>
              <animal text="une truite" />
            </oui>
            <non>
              <animal text="un chien" />
            </non>
          </question>
        </oui>
        <non>
          <animal text="une vache" />
        </non>
      </question>
    </animals>
    Et le déroulement du jeu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Est-ce un carnivoire ?
    Oui
    Est-ce un poisson ?
    Non
    Est-ce un chien ?
    Non
     
    => Là, j'ai donc ma GameNode "Current" qui contient un objet "Animal" (un chien).
    Je veux le remplacer, dans l'arbre, par un objet "Question" (Est-ce un félin) dont le fils "Oui" est "un chat" et le fils "Non", l'ancien animal connu (un chien).

    Voici mon code :

    first : C'est le premier noeud de l'arbre (dans l'exemple, la question "Est-ce un carnivore ?"
    current : C'est le noeud en cours de traitement. Ici, l'objet "Animal" "un chien".

    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
     
                            Console.WriteLine("J'ai perdu.");
                            Console.WriteLine("Quel était votre animal ?");
                            string animal = Console.ReadLine();
                            Console.WriteLine("Quelle question permet de différencier {0} d'{1} ?", animal, current.Text);
                            string question = Console.ReadLine();
                            Question newQuestion = new Question(question);
                            newQuestion.Oui = new Animal(animal);
                            newQuestion.Non = current;
                            if (first == current)
                            {
                                first = newQuestion;
                            }
                            else
                            {
                                current = newQuestion;
                            }
                            GameNode.Save(first);
                            Console.ReadKey(true);
                            return;
    Au final, en mode pas à pas, current est bien modifié, mais first n'est pas modifié (c'est à dire que si je regarde dans l'arborescence à partir de first, j'ai toujours le chien, mais pas le chat).

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Le problème se situe au niveau de la ligne 16.

    En fait, lorsque je désire modifier ma node "Current", au lieu de mettre une référence de newQuestion dans mon arbre, je casse le lien qu'il y a entre Current et mon arbre : Current contient bien newQuestion, mais l'arbre n'est pas modifié.

    En fait, je voudrais non pas écraser la référence Current par la référence de newNode, mais écraser le pointeur vers la référence de Current par un pointeur vers la référence de newQuestion.

    En gros, je voudrais pouvoir remplacer Current par newQuestion dans l'arbre, sâchant le Current peut être le Oui ou le Non du parent. Du coup, je ne sais pas comment modifier le parent vu que je ne sais pas si je suis dans le oui ou le non (à moins de conserver une variable dans ma boucle pour ça, mais ça me semble assez crade non ?)

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Bon, ben en l'absence de réponses, j'ai fini par trouver une solution (c'est la solution crade dont je parlais...)

    Voici ce que ça donne :
    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
     
     
                while (current != null)
                {
                    if (current is Animal)
                    {
                        Console.WriteLine("Est-ce {0} ?", current.Text);
                        if (Console.ReadKey(true).Key == ConsoleKey.O)
                        {
                            Console.WriteLine("J'ai gagné !");
                            Console.ReadKey(true);
                            return;
                        }
                        else
                        {
                            Console.WriteLine("J'ai perdu.");
                            Console.WriteLine("Quel était votre animal ?");
                            string animal = Console.ReadLine();
                            Console.WriteLine("Quelle question permet de différencier {0} d'{1} ?", animal, current.Text);
                            string question = Console.ReadLine();
                            Question newQuestion = new Question(question);
                            newQuestion.Oui = new Animal(animal);
                            newQuestion.Non = current;
                            if (first == current)
                            {
                                first = newQuestion;
                            }
                            else
                            {
                                if (prevkey == ConsoleKey.O)
                                {
                                    (previous as Question).Oui = newQuestion;
                                }
                                else
                                {
                                    (previous as Question).Non = newQuestion;
                                }
                            }
                            GameNode.Save(first);
                            Console.ReadKey(true);
                            return;
                        }
                    }
                    else
                    {
                        Console.WriteLine(current.Text);
                        previous = current;
                        if (Console.ReadKey(true).Key == ConsoleKey.O)
                        {
                            current = (current as Question).Oui;
                            prevkey = ConsoleKey.O;
                        }
                        else
                        {
                            current = (current as Question).Non;
                            prevkey = ConsoleKey.N;
                        }
                    }
                }
    Y'a pas moyen de faire moins crade ?

    Bon, ben en tout cas, ça marche, je vais pouvoir retrouver mes 5 ans
    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
     
    Est-ce un carnivore ?
    o
    Est-ce un poisson ?
    n
    Est-ce un félin ?
    o
    Vit-il dans la brousse ?
    n
    Est-ce un chat ?
    n
    J'ai perdu.
    Quel était votre animal ?
    un lynx
    Quelle question permet de différencier un lynx d'un chat ?
    Est-ce un animal sauvage ?

Discussions similaires

  1. Problème basique avec unordered_set
    Par BaygonV dans le forum Débuter
    Réponses: 5
    Dernier message: 16/03/2014, 17h36
  2. Réponses: 11
    Dernier message: 04/06/2011, 02h45
  3. Problème basique avec SoapUI 2.5.1
    Par squallJ dans le forum Services Web
    Réponses: 1
    Dernier message: 11/03/2009, 16h27
  4. [Tableaux] Problème avec un arbre de sélection
    Par grumly22 dans le forum Langage
    Réponses: 24
    Dernier message: 29/05/2006, 14h05
  5. Problèmes de pointeurs avec les arbres
    Par thierry57 dans le forum C
    Réponses: 17
    Dernier message: 22/12/2005, 23h35

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