Projet Zuul de conception orientée objet en Java d'un jeu d'aventure
Forum des exercices du projet Zuul
Exercice 7.6
- Lire la suite du chapitre 7 [ci-joint] (si possible en anglais, sinon en français).
La version de setExits proposée dans le livre teste si chaque paramètre est null avant de l'affecter à l'attribut correspondant, mais ce n'est pas indispensable. Comprenez-vous pourquoi ? - Effectuer les modifications qui y sont décrites dans les classes Room et Game.
- Pour résoudre le problème du message "Unknown direction", voir les 3 solutions possibles proposées dans les échanges ci-dessous.
Pour information, l'exercice 7.8.1 vous demandera d'ajouter au moins un lieu dans une direction haut et/ou bas.
Un étudiant a écrit :
Bonjour, je suis bloqué à l'exercice 7.6, j'ai effectué les modifications demandées au niveau de la classe Room, mais lorsque je compile la classe Game, il y'a un problème au niveau de la methode "getExit". C'est en rapport avec le type, mais je vois pas ce que je peux faire. Merci de votre réponse, cordialement
Si vous voulez que je trouve votre erreur, ce que vous pouvez
faire (dans un premier temps) est :
- recopier ici la ligne où se produit l'erreur,
- recopier ici le message d'erreur.
Mais vous pouvez sans doute trouver vous-même votre erreur :
si votre ligne est de la forme variable = objet.getExit(paramètre);
et que l'erreur "est en rapport avec un type" comme vous dites,
soit le paramètre n'est pas du même type que celui déclaré dans getExit,
soit la valeur retournée par getExit n'est pas du même type que la variable.
L'étudiant a répondu :
Et le message d'erreur : method getExit in v1.Room cannot be applied to given type
Le message d'erreur signifie qu'il y a une différence de type (et de nombre) de paramètres entre l'appel de getExit que vous montrez (avec 4 paramètres de type Room) et la déclaration de getExit dans la classe Room qui, je suppose, n'attend qu'un seul paramètre (une String).
Vous semblez donc ne pas avoir compris à quoi sert la fonction getExit : on lui passe une direction (nord, sud, est, ou ouest) et elle doit nous retourner la Room qui se trouve dans cette direction (ou null s'il n'y a pas de sortie dans cette direction).
Elle correspond exactement à la partie 4.b.3 du TP 3.1.
Si tout ça ne vous suffit pas à régler ce problème, mettez votre projet sur votre compte esiee (s'il n'y est pas déjà) et venez en 5356.
Voici mon message d'erreur de cette ligne d'instruction:
Room nextRoom = currentRoom.getExit(pDirection);
cannot find variable symbol - variable pDirection
(pDirection est mon seul paramètre de la methode getExit, il est du type String)
L'erreur "cannot find variable symbol - variable pDirection" signifie qu'il n'y a pas de paramètre pDirection dans la méthode que vous êtes en train d'écrire (vous confondez avec le nom du paramètre de la méthode que vous voulez appeler).
Vous voulez appeler la méthode getExit : il faut lui passer une String qui est à votre disposition dans la méthode que vous êtes en train d'écrire.
Où est stockée le mot contenant la direction dans laquelle vous voulez aller ?
Un étudiant a écrit :
Un étudiant a écrit :
après avoir rajouté la méthode getExit( ) dans la classe Room
je ne comprends pas ce qu’il faut changer dans la classe Game,
car dans le pdf ils disent de remplacer une partie de la méthode de goRoom avec la méthode getExit
mais je ne vois pas ce qu’il faut remplacer.
1) à quoi sert la fonction getExit ? (*)
2) comment (et où) cette tâche est-elle actuellement accomplie dans la méthode goRoom ?
3) c'est à ces endroits qu'il faudra remplacer votre code actuel par des appels à la fonction getExit.
(*) si vous ne vous sentez pas capable de répondre à cette question,
demandez-vous pour cette fonction, quelle valeur elle prend en paramètre et quelle valeur elle retourne.
Des étudiants ont demandé :
Lorsqu'on remplace la suite de if/else
par un seul appel à getExit comme c'est expliqué dans le livre,
on perd la possibilité de tester si on a tapé un mauvais nom de direction.
Très bonne remarque !
Le livre ne traite pas ce cas-là, alors que je l'ai ajouté dans le TP 3.1.
Pour s'en sortir, je vois au moins 2 solutions :
- getExit pourrait retourner null aussi quand c'est une mauvaise direction, et goRoom dirait alors "There's no door or unknown direction !" quand
vNextRoom vaut null.
Inconvénient : deux erreurs différentes génèrent le même message (du coup, le joueur est moins bien renseigné).
- getExit pourrait retourner this quand c'est une mauvaise direction, et goRoom pourrait alors dire "Unknown direction !" quand vNextRoom vaut this.aCurrentRoom (puisque c'est sur cette pièce qu'on appelle getExit).
Inconvénient : si un jeu tordu veut qu'en allant au nord d'une pièce, on se retrouve dans la même pièce, ce ne sera pas possible (le concepteur du jeu se prive d'une possibilité, mais extrêmement rare).
Bonjour Monsieur,
N'est-il pas plus simple de rajouter directement S.o.println("Unknown Direction"); dans setExit(.) ?
Ça donnerait quelque chose du genre :
public Room getExit (final String pDirection){
...
else {
System.out.println("Unknown direction !");
return null;}
}
Il faudrait bien sûr ensuite trouver un moyen pour ne pas afficher "There is no door"
EDIT : Après réflexion, c'est vrai qu'il est bien plus simple d'utiliser le this même si ça peut limiter la créativité.
Bravo d'avoir compris que ce n'est finalement pas plus simple.
Mais il y aurait 2 autres inconvénients :
- la fonction n'est pas censée produire d'affichage, par exemple si on veut juste tester si une direction existe
- et même si on l'autorisait à afficher, que se passe-t-il quand on
modifie l'interface textuelle en interface graphique : on serait obligé
de modifier la classe Room !?
Baudouin CORTES a écrit :
Voici mon code, je ne sais pas s'il est très propre mais cela a l'air de fonctionner :
Dans Room j'ai ajouté et modifié :
private static Room sUnkown;
static {sUnkown = new Room("Unkown direction !");}
return sUnkownn;
Dans Game j'ai modifié :
Dans createRooms :
Room vUnknown = new Room("Unknown direction !");
Et dans goRoom :
else if (vNextRoom == this.aCurrentRoom.getExit("")) {
System.out.println("Unknown direction !");
return;
}
Pourriez-vous me dire ce que vous en pensez ?
Je pense que c'est une très bonne idée. Je vais juste l'améliorer ci-dessous.
Solution 3 :
Au début de Room :
public static final Room UNKNOWN_DIRECTION = new Room( "Unknown direction !" );
A la fin de getExit :
return UNKNOWN_DIRECTION;
Dans goRoom :
if (vNextRoom == Room.UNKNOWN_DIRECTION) {
System.out.println( Room.UNKNOWN_DIRECTION.getDescription() );
return;
}
Bonjour Monsieur,
j'ai une question concernant la méthode printLocationInfo().
Suite à l'ajout de la HashMap je me suis dit que cela serai plus simple de faire une boucle dessus puis d'afficher une a une les sorties non null plutot que de faire un if pour chaque cas.
Or printLocationInfo() est dans Game donc on a pas accès à cette HashMap.
Alors je me suis dit qu'on pourrait déléguer le travaille de cette méthode à la méthode toString() de Room qu'on créerais et qui elle aurait par définition accès à cette HashMap. Elle afficherait donc les infos que printLocationInfo est censé afficher ( ou simplement utiliser uniquement toString() à la place de printLocationInfo ).
Puis-je réaliser ceci ?
Réseaux sociaux