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".
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).
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) { } }
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 :
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
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>
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).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9Est-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).
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".
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).
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;
Partager