このハングマンプログラムを作成しました。配列内の3つの単語を取り、ランダムな単語を選択してから、ユーザーが文字を推測します。長いですが、非常にシンプルでわかりやすいです。提案は大歓迎ですが、Javaに関する私の知識は限られていることに注意してください。
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 } } }
回答
コードは非常に単純で、簡単に理解できます。更新を容易にし、将来のプログラムの基礎を形成するために、できることがいくつかあります。そのうちのいくつかを以下に提案します。
main
You ” main関数ですべてのコードを記述しました。これは、言語を学んでいる人々にとってかなり典型的なアプローチです。最後に到達するまで、必要に応じてロジックを追加し続けます。拡張や更新がすぐに難しくなる可能性があります。理想的には、メインを接続してプログラムを形成できる論理要素(他のクラス&関数)に分割する必要があります。各要素には個別の責任があり、それに応じて名前を付ける必要があります。これにより、個々の要素が理解しやすくなり、将来再利用する候補を特定しやすくなります。
重複を削除
たくさんのコードを記述しました。ただし、他のビットと非常によく似ています。重複に気付いた場合は、ビルディングブロック(関数など)が欠落していることを示す良い兆候であることがよくあります。コードを見ると、コードを次のような構造に分割できます。
playAgain = askPlayerIfTheyWantToPlayAgain() if(playAgain) { wordToGuess = getRandomWord(); guessLettersUntilWin(wordToGuess); }
それぞれのケースステートメントを縮小したことに気付くでしょう。単語を単一のメソッドguessLettersUntilWin
に変換し、そのメソッドに単語を渡します。これは、削除できるはずのさまざまなcaseステートメント間に多くの重複があるためです。たとえば、wordToGuess.length()
を使用して、推測する単語の長さを取得できます。値(4/5)をハードコーディングするのではなく、単語の文字をハードコーディングして推測するのではなく、wordToGuess.toCharArray()
などを使用できます。
ネスト
ネストレベルが多すぎると問題が発生します。ネストレベルが多すぎると、コードが画面の端から外れるまでページを右に移動します。コードを適切なメソッドに分割することで、過度のネストを回避できます。また、必要のないときは使用しないでください。たとえば、プログラムの開始時に次のようにします。
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
その後、残りのコードはelse
句。 if
ブランチはエスケープされないため、elseは必要ありません。次のようにするだけです。
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
} //コメント
通常、中括弧を閉じることについて、中括弧が開かれた理由を示すコメントはあまり表示されません。コードが煩雑になるだけです。これらは、ネストされたコードの大きなブロックがある場合に役立ちますが、上記で述べたように、これは多くの場合、コードをさらに分割する必要があることを示しています。
ループは友達になることができます
ここでも、caseステートメントに多くの重複があります。これは、単語の各文字に対してif / elseチェーンを作成したためです。この構造は、forループ(擬似コード)に置き換えることができます:
for(index=0 to guessWord.length()) { if(letter == guessWord[index]) { print("You found...") lettersCorrect++; } } // check if lettersCorrect == guessWord.length()