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 !