Jai écrit ce programme du pendu. Il faut trois mots dans un tableau, choisit un mot au hasard, puis lutilisateur devine les lettres. Cest long, mais cest extrêmement simple et compréhensible. Les suggestions sont les bienvenues, mais gardez à lesprit que mes connaissances en java sont limitées.

import java.util.*; public class Hangman { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int noOfGuesses =0,lettersCorrect=0; String choiceToPlay, userGuess; char menuChoice, letter; String[] list={"hello","java","loop"}; System.out.println("\t\t\t\tWelcome to Hangman!");//main game start menu System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); do { System.out.println("\t\t\t Do you want to play? Press Y/N\n"); choiceToPlay = sc.next(); menuChoice = choiceToPlay.charAt(0); if(!(menuChoice == "y"||menuChoice == "Y"||menuChoice == "n"||menuChoice =="N")) { System.out.println("\t\t\t\tYou have entered an invalid option. Try again!\n"); }//if any letter other than y or n is entered }//do while (!(menuChoice =="Y" ||menuChoice=="y"||menuChoice == "n"|| menuChoice =="N")); if(menuChoice == "N"||menuChoice =="n") { System.out.println("You have chosen to leave the game."); System.out.println("Goodbye!"); System.exit(0); }//if else { int randomWordNumber = (int)((Math.random()*list.length));// Pick random index of guessWord array char[] enteredLetters = new char[list[randomWordNumber].length()];// Create an array to store already entered letters switch(randomWordNumber) { case 1: { char [] correctLetter = {"-", "-", "-", "-", "-"}; while(lettersCorrect <5) { char guessWord[]={"h","e","l","l","o"}; System.out.println("\nThe guess word has 5 letters."); System.out.println("Enter a letter to guess: "); userGuess = sc.next(); letter = userGuess.charAt(0);//Incrementing letters each time. noOfGuesses++; if(letter == guessWord[0]) { System.out.println("There is 1 "+guessWord[0]+" in the word"); System.out.println("You have guessed the first letter correctly."); correctLetter[0] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect++; System.out.println("Letters correct so far: "+lettersCorrect); }//if first letter else if(letter==guessWord[1]) { System.out.println("There is 1 "+guessWord[1]+" in the word"); System.out.println("You have guessed the second letter correctly."); correctLetter[1] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect++; System.out.println("Letters correct so far: "+lettersCorrect); }//if second letter else if(letter ==guessWord[2]||letter==guessWord[3]) { System.out.println("There are 2 "+guessWord[2]+" in the word"); System.out.println("You have guessed the third and fourth letters correctly."); correctLetter[2] = letter; correctLetter[3]=letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect+=2; System.out.println("Letters correct so far: "+lettersCorrect); }//if third and fourth letters else if(letter ==guessWord[4]) { lettersCorrect++; System.out.println("There is 1 O in the word"); System.out.println("You have guessed the fifth letter correctly."); correctLetter[4] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); System.out.println("Letters correct so far: "+lettersCorrect); }//if fifth letter else { System.out.println("The letter you guessed is not in the word.\n"); System.out.println("Guesses taken so far: "+noOfGuesses); System.out.println("Letters correct so far: "+lettersCorrect); }//else incorrect letter } System.out.println("\nYou found the word!"); System.out.println("It was hello."); System.out.println("Total guesses: "+noOfGuesses); break; } case 2: { char [] correctLetter = {"-", "-", "-", "-"}; while(lettersCorrect <4) { char guessWord[]={"j","a","v","a"}; System.out.println("\nThe guess word has 4 letters."); System.out.println("Enter a letter to guess: "); userGuess = sc.next(); letter = userGuess.charAt(0);//Incrementing letters each time. noOfGuesses++; if(letter == guessWord[0]) { System.out.println("There is 1 "+guessWord[0]+" in the word"); System.out.println("You have guessed the first letter correctly."); correctLetter[0] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect++; System.out.println("Letters correct so far: "+lettersCorrect); }//if first letter else if(letter==guessWord[1]) { System.out.println("There are 2 "+guessWord[1]+" in the word"); System.out.println("You have guessed the second and fourth letters correctly."); correctLetter[1] = letter; correctLetter[3] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect+=2; System.out.println("Letters correct so far: "+lettersCorrect); }//if second letter else if(letter ==guessWord[2]) { System.out.println("There is 1 "+guessWord[2]+" in the word"); System.out.println("You have guessed the third letter correctly."); correctLetter[2] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect++; System.out.println("Letters correct so far: "+lettersCorrect); }//if third and fourth letters else { System.out.println("The letter you guessed is not in the word.\n"); System.out.println("Guesses taken so far: "+noOfGuesses); System.out.println("Letters correct so far: "+lettersCorrect); }//else incorrect letter }//while loop System.out.println("\nYou found the word!"); System.out.println("It was java."); System.out.println("Total guesses: "+noOfGuesses); break; } default: { char [] correctLetter = {"-", "-", "-", "-"}; while(lettersCorrect<4) { char guessWord[]={"l","o","o","p"}; System.out.println("\nThe guess word has 4 letters."); System.out.println("Enter a letter to guess: "); userGuess = sc.next(); letter = userGuess.charAt(0);//Incrementing letters each time. noOfGuesses++; if(letter == guessWord[0]) { System.out.println("There is 1 "+guessWord[0]+" in the word"); System.out.println("You have guessed the first letter correctly."); correctLetter[0] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect++; System.out.println("Letters correct so far: "+lettersCorrect); }//if first letter else if(letter==guessWord[1]) { System.out.println("There are 2 "+guessWord[1]+" in the word"); System.out.println("You have guessed the second and third letters correctly."); correctLetter[1] = letter; correctLetter[2] = letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect+=2; System.out.println("Letters correct so far: "+lettersCorrect); }//if second letter else if(letter ==guessWord[3]) { System.out.println("There is 1 "+guessWord[3]+" in the word"); System.out.println("You have guessed the fourth letter correctly."); correctLetter[3]=letter; System.out.println(correctLetter); System.out.println("You have had " + noOfGuesses + " guesses, so far"); lettersCorrect++; System.out.println("Letters correct so far: "+lettersCorrect); }//if third and fourth letters else { System.out.println("The letter you guessed is not in the word.\n"); System.out.println("Guesses taken so far: "+noOfGuesses); System.out.println("Letters correct so far: "+lettersCorrect); }//else incorrect letter }//while loop }//case System.out.println("\nYou found the word!"); System.out.println("It was loop."); System.out.println("Total guesses: "+noOfGuesses); }//switch } } } 

Réponse

Votre code est assez simple et facile à suivre. Il y a plusieurs choses que vous pouvez faire, dont certaines que jai suggérées ci-dessous, pour faciliter la mise à jour et pour former une base pour les futurs programmes.

main

Vous  » Jai écrit tout votre code dans la fonction principale. Cest une approche assez typique pour les personnes qui apprennent la langue. Vous continuez à ajouter la logique selon les besoins jusquà la fin. Il peut rapidement devenir difficile à étendre ou à mettre à jour. Idéalement, vous voulez diviser les éléments principaux en éléments logiques (autres classes & fonctions) qui peuvent être connectés pour former votre programme. Chaque élément doit avoir une responsabilité distincte et doit être nommé en conséquence. Cela rendra les éléments individuels plus faciles à comprendre et facilitera l’identification des candidats à réutiliser à l’avenir.

Suppression des doublons

Vous avez écrit beaucoup de code. Beaucoup de il est cependant très similaire aux autres bits. Là où vous remarquez une duplication, cest souvent un bon signe que vous manquez un bloc de construction (comme une fonction). En regardant votre code, vous pouvez diviser le code en une structure comme celle-ci:

playAgain = askPlayerIfTheyWantToPlayAgain() if(playAgain) { wordToGuess = getRandomWord(); guessLettersUntilWin(wordToGuess); } 

Vous remarquerez que jai « contracté les instructions de cas pour chaque mot en une seule méthode guessLettersUntilWin, dans laquelle je passe le mot. Cest parce quil y a beaucoup de duplication entre les différentes instructions case que vous devriez pouvoir supprimer. Vous pouvez utiliser wordToGuess.length() pour obtenir la longueur du mot à deviner, par exemple, plutôt que de coder en dur la valeur (4/5). Plutôt que de coder en dur les lettres du mot à deviner, vous pouvez utiliser wordToGuess.toCharArray(). etc.

Nesting

Trop de niveaux dimbrication sont mauvais. Ils font errer le code sur la page vers la droite jusquà ce quil tombe du bord de votre écran. Vous pouvez éviter une imbrication excessive en décomposant votre code en méthodes appropriées. Vous pouvez également évitez de lutiliser quand ce nest pas nécessaire. Par exemple, au début de votre programme, vous faites:

if(menuChoice == "N"||menuChoice =="n") { System.out.println("You have chosen to leave the game."); System.out.println("Goodbye!"); System.exit(0); }//if else { // Rest of code 

Et puis le reste du code est contenu dans le else. La branche if ne s’échappe jamais, vous n’avez donc pas besoin de l’autre. Vous pouvez simplement faire:

if(menuChoice == "N"||menuChoice =="n") { System.out.println("You have chosen to leave the game."); System.out.println("Goodbye!"); System.exit(0); } // Rest of code 

} // commentaires

Vous ne voyez généralement pas beaucoup de commentaires sur les accolades fermantes indiquant pourquoi laccolade a été ouverte, cela ajoute juste du fouillis au code. Ils peuvent être utiles lorsque vous avez de gros blocs de code imbriqué, mais comme je lai dit ci-dessus, cest souvent une indication que vous devez décomposer davantage votre code.

les boucles peuvent être votre ami

Encore une fois, vos déclarations de cas ont beaucoup de doublons. Cest parce que vous avez créé une chaîne if / else pour chaque lettre du mot. Cette structure pourrait être remplacée par une boucle for (pseudocode):

for(index=0 to guessWord.length()) { if(letter == guessWord[index]) { print("You found...") lettersCorrect++; } } // check if lettersCorrect == guessWord.length() 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *