Ich habe dieses Hangman-Programm geschrieben. Es dauert drei Wörter in einem Array, wählt ein zufälliges Wort aus und dann errät der Benutzer die Buchstaben. Es ist langwierig, aber es ist extrem einfach und verständlich. Vorschläge sind willkommen, aber denken Sie daran, dass meine Kenntnisse in Java begrenzt sind.

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 } } } 

Antwort

Ihr Code ist ziemlich einfach und leicht zu befolgen. Sie können verschiedene Dinge tun, von denen ich einige unten vorgeschlagen habe, um die Aktualisierung zu vereinfachen und eine Grundlage für zukünftige Programme zu bilden.

main

You “ Ich habe Ihren gesamten Code in die Hauptfunktion geschrieben. Dies ist ein ziemlich typischer Ansatz für Menschen, die die Sprache lernen. Sie fügen die Logik nach Bedarf hinzu, bis Sie das Ende erreicht haben. Das Erweitern oder Aktualisieren kann schnell schwierig werden. Idealerweise möchten Sie main in logische Elemente (andere Klassen & -Funktionen) aufteilen, die zu Ihrem Programm verbunden werden können. Jedes Element sollte eine eigene Verantwortung haben und entsprechend benannt werden. Dies erleichtert das Verständnis der einzelnen Elemente und die Identifizierung von Kandidaten für die zukünftige Wiederverwendung.

Entfernen von Duplikaten

Sie haben viel Code geschrieben Es ist jedoch anderen Bits sehr ähnlich. Wenn Sie eine Duplizierung bemerken, ist dies oft ein gutes Zeichen dafür, dass Ihnen ein Baustein (z. B. eine Funktion) fehlt. Wenn Sie sich Ihren Code ansehen, können Sie den Code in eine Struktur wie die folgende aufteilen:

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

Sie werden feststellen, dass ich die case-Anweisungen für jeden Vertrag abgeschlossen habe Wort in eine einzelne Methode guessLettersUntilWin, in die ich das Wort übergebe. Dies liegt daran, dass zwischen den verschiedenen case-Anweisungen, die Sie entfernen sollten, viele Überschneidungen bestehen. Sie können wordToGuess.length() verwenden, um beispielsweise die Länge des zu erratenden Wortes zu ermitteln. Anstatt den Wert (4/5) hart zu codieren, können Sie wordToGuess.toCharArray() usw.

Nesting

Zu viele Verschachtelungsebenen sind fehlerhaft. Dadurch wandert der Code über die Seite nach rechts, bis er vom Bildschirmrand abfällt. Sie können übermäßiges Verschachteln vermeiden, indem Sie Ihren Code in geeignete Methoden aufteilen Vermeiden Sie es, wenn es nicht notwendig ist. Zum Beispiel tun Sie zu Beginn Ihres Programms Folgendes:

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 

Und dann ist der Rest des Codes in der else -Klausel. Der Zweig if wird nie ausgeblendet, sodass Sie den anderen nicht benötigen. Sie können einfach Folgendes tun:

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 

} // Kommentare

Normalerweise werden beim Schließen von Klammern nicht viele Kommentare angezeigt, die angeben, warum die Klammer geöffnet wurde. Sie fügt dem Code lediglich Unordnung hinzu. Sie können nützlich sein, wenn Sie große Blöcke verschachtelten Codes haben. Wie ich bereits sagte, ist dies häufig ein Hinweis darauf, dass Sie Ihren Code mehr aufteilen müssen.

Schleifen können Ihr Freund sein

Ihre case-Anweisungen enthalten wieder viele Duplikate. Dies liegt daran, dass Sie für jeden Buchstaben im Wort eine if / else-Kette erstellt haben. Diese Struktur könnte durch eine for-Schleife (Pseudocode) ersetzt werden:

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


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.