ISN - Organiser son mini-projet - exemple du jeu du pendu Ou

Transcription

ISN - Organiser son mini-projet - exemple du jeu du pendu Ou
ISN - Organiser son mini-projet - exemple du jeu du pendu
Ou « Quelques commentaires sur les variables de type String »
J’ai encore choisi cet exemple parce qu’on m’a posé la question, et parce que je ne voulais pas qu’ils se pendent.
⊲ Rappel : L’erreur classique du débutant est de se lancer dans le code et le mettre à jour progressivement, en
améliorant par touches, en implémentant de nouvelles fonctionnalités... Mais il est vrai que pour le pendu, il fallait
des trucs ou méthodes pour les String
⊲ Comment joue-t-on, concrètement ?
• Le programme choisit un mot, qui doit faire au moins trois lettres,
• car le programme propose un mot réponse constitué de la première et de la première lettre, et de « _ » à la
place des autres lettres.
• L’utilisateur du programme, que nous appellerons joueur, doit saisir une lettre.
• Si elle n’est pas dans les lettres à trouver la pénalité augmente,
• si elle est dans les lettres à trouver, la pénalité n’augmente pas et toutes les occurrences de la lettre doivent
apparaître à la place des « _ » correspondants.
• Le programme se termine quand on a tout trouvé,
• ou si la pénalité est trop grande !
Là encore, chacune de ces fonctionnalités bien séparées du programme doit faire l’objet d’une fonction
à l’extérieur de notre fonction principale main ! Voir squelette de code.
⊲ Ok, mais comment je gère la mémoire des coups ? Où je les stocke ?
Toujours la grosse question. Ici le mot à chercher est de type String.
Je propose, pour la première version, de l’imposer au début de programme : String mot = "ausgezeichnet";
On aura besoin de la longueur de ce mot, 13 ici, et d’un mot reponse qui est ici au début a___________t
⊲ Attention, le mieux est de déclarer ces trois variables à l’extérieur du main, en variable globale,
valable pour tout le programme !
⊲ Ok, mais comment je fais pour demander un caractère ?
Easy : javascool propose la fonction readChar(), un peu comme readInteger(), sauf qu’ici on renvoie un char.
Attention il ne faut pas taper sur la touche Entrée.
⊲ On va se contenter de conter les pénalités sans construire la potence pour commencer. Il faut une fonction pour
construire la réponse a___________t, une pour la modifier en a___e_e____et si on propose « e »...
⊲ Variables de type String :
• Ce n’est pas un type primitif, comme un char, c’est pour cela que cette classe commence par une majuscule.
• On peut faire des concaténations : mot = "Abde" + "raouf" donne mot = "Abderaouf".
• mot.length() donne la longueur du mot. Avec mot = "Abderaouf", mot.length() donne 9.
• mot.charAt(i) donne la i-ème lettre, i allant de 0 à 5 si le mot fait six lettres (comme pour les tableaux).
La première lettre de mot est mot.charAt(0), la deuxième mot.charAt(1), etc. D’où le (i+1) dans ce code :
void main() {
int i, longueur;
String mot = readString("Entrez votre mot:");
longueur=mot.length();
println("le mot saisi est : "+mot+" et il comprend "+ longueur+" lettres.");
for(i=0;i<longueur;i++) println("la "+(i+1)+"ème lettre du mot est "+mot.charAt(i) );
}
Essayez le avec Abderaouf ou ausgezeichnet ou Quarante-deux ! ;-)
• La méthode substring(int debut, int fin) permet d’extraire une sous-chaîne. Elle retourne un nouveau
String qui débute au caractère à la position debut et va jusqu’au caractère à la position (fin - 1).
Par exemple, si mot = "Abderaouf" alors txt = mot.substring(3, 6); retourne la chaîne "era".
• Enfin, pour tester si deux chaînes str1 et str2 sont les mêmes, if (str1.equals(str2))...
⊲ Pour mieux comprendre, voici à nouveau un squelette de code, à compléter, évidemment !
Squelette de code proposé
/**************************************
* Déclaration des variables globales *
**************************************/
String mot = "ausgezeichnet";
int longueur;
String reponse = ""; //ce sont trois variables globales
/*******************************************
* Fonction de construction du mot réponse *
*******************************************/
String constructionReponseInitiale() {
String construction = "";
/* ici on crée un mot construction à l’aide du mot de départ et des caractères _
* à l’aide d’une boucle for utilisant la variable globale longueur
* et de construction = construction + "_";
* et de mot.charAt(*) pour la première et la dernière lettre */
return construction;
}
String modificationReponse(char carac, int place) {
String nouvelle = /*construction à l’aide de reponse.substring(*,*) et carac
* à la place numéro place */
return nouvelle;
}
int traitement(char prop) {
/* Ici on traite la réponse en regardant si le caractère et dedans ou pas
* Si non, on renvoie une pénalité de 1.
* Si oui, on renvoie une pénalité de zéro,
* et on appelle la fonction modificationReponse pour remplacer les _
* pour chacune des apparitions de la lettre en question */
return penalite; // 0 ou 1 donc, suivant le cas
}
/***********************
* Programme principal *
***********************/
void main() {
clear();
longueur = mot.length();
//on doit savoir combien de lettres
reponse = constructionReponseInitiale();
//appel de la fonction
int compteur =0;
// pour les pénalités
char proposition;
// qui sera saisie par le joueur
println("Votre grille de jeu est :\n" + reponse+"\n"); // un \n revient à la ligne
while ( /* ce n’est pas gagné */ ) {
proposition = readChar(); //fonction de lecture javascool d’un caractère
compteur = compteur + traitement(proposition); //augmentera de 1 ou de zéro
println("La proposition est " + proposition + " et votre grille de jeu est :");
println(reponse+" et vous avez une penalite de " + compteur + "\n");
}
/* Code à finir
* C’est gagné ou pas */
}
Exemple d’exécution
Votre grille de jeu est :
a___________t
La proposition est a et votre grille de jeu est :
a___________t et vous avez une penalite de 1
La proposition est e et votre grille de jeu est :
a___e_e____et et vous avez une penalite de 1
La proposition est i et votre grille de jeu est :
a___e_ei___et et vous avez une penalite de 1
La proposition est o et votre grille de jeu est :
a___e_ei___et et vous avez une penalite de 2
La proposition est u et votre grille de jeu est :
au__e_ei___et et vous avez une penalite de 2
La proposition est y et votre grille de jeu est :
au__e_ei___et et vous avez une penalite de 3
La proposition est r et votre grille de jeu est :
au__e_ei___et et vous avez une penalite de 4
La proposition est s et votre grille de jeu est :
aus_e_ei___et et vous avez une penalite de 4
La proposition est g et votre grille de jeu est :
ausge_ei___et et vous avez une penalite de 4
La proposition est z et votre grille de jeu est :
ausgezei___et et vous avez une penalite de 4
La proposition est c et votre grille de jeu est :
ausgezeic__et et vous avez une penalite de 4
La proposition est h et votre grille de jeu est :
ausgezeich_et et vous avez une penalite de 4
La proposition est n et votre grille de jeu est :
ausgezeichnet et vous avez une penalite de 4
C’est gagné avec une penalité de 4 coups !