Napsal jsem tento program Hangman. Trvá tři slova v poli, vybere náhodné slovo a poté uživatel hádá písmena. Je to zdlouhavé, ale je to nesmírně jednoduché a srozumitelné. Návrhy jsou vítány, ale mějte na paměti, že moje znalosti v jazyce Java jsou omezené.

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

Odpověď

Váš kód je velmi přímočarý a snadno se sleduje. Existuje několik věcí, které můžete udělat, z nichž některé jsem níže navrhl, aby se usnadnila aktualizace a aby se vytvořil základ pro budoucí programy.

hlavní

Vy “ V hlavní funkci jsem napsal celý váš kód. Jedná se o poměrně typický přístup pro lidi, kteří se učí jazyk. Logiku přidáváte podle potřeby, dokud se nedostanete na konec. Může být rychle obtížné jej rozšířit nebo aktualizovat. V ideálním případě byste chtěli rozdělit main na logické prvky (další třídy & funkce), které lze připojit k vytvoření vašeho programu. Každý prvek by měl mít samostatnou odpovědnost a měl by být podle toho pojmenován. Díky tomu budou jednotlivé prvky srozumitelnější a bude snazší identifikovat kandidáty pro budoucí použití.

Odstranit duplikaci

Napsali jste hodně kódu. Mnoho je však velmi podobný ostatním bitům. Pokud si všimnete duplikace, je často dobrým znamením, že vám chybí stavební blok (například funkce). Když se podíváte na svůj kód, můžete jej rozdělit do struktury, jako je tato:

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

Všimnete si, že jsem smluvně uzavřel případová prohlášení pro každý slovo do jedné metody guessLettersUntilWin, do které slovo předávám. Je tomu tak proto, že mezi různými výroky případů, které byste měli být schopni odstranit, existuje mnoho zdvojení. Pomocí wordToGuess.length() můžete například odhadnout délku slova, namísto pevného kódování hodnoty (4/5). Místo pevného kódování písmen u slova můžete použít wordToGuess.toCharArray(). atd.

Vnoření

Příliš mnoho úrovní vnoření je špatných. Díky nim kód putuje po stránce doprava, dokud nespadne z okraje obrazovky. Nadměrnému vnoření se můžete vyhnout rozdělením kódu na vhodné metody. Můžete také nepoužívejte jej, pokud to není nutné. Například na začátku programu uděláte:

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 

A zbytek kódu je potom obsažen v else klauzule. Pobočka if nikdy neunikne, takže nepotřebujete nic jiného. Můžete jednoduše udělat:

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 

} // komentáře

Obvykle nevidíte mnoho poznámek k zavíracím složeným závorkám, což naznačuje, proč byla složená závorka otevřena, pouze přidává do kódu nepořádek. Mohou být užitečné tam, kde máte velké bloky vnořeného kódu, ale jak jsem řekl výše, často to naznačuje, že musíte svůj kód rozdělit více.

smyčky mohou být vaším přítelem

Vaše výroky případu mají znovu spoustu duplicit. Je to proto, že jste pro každé písmeno ve slově vytvořili řetězec if / else. Tuto strukturu lze nahradit smyčkou for (pseudokód):

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *