저는이 행맨 프로그램을 작성했습니다. 배열에서 세 단어를 사용하고 임의의 단어를 선택한 다음 사용자가 문자를 추측합니다. 길지만 매우 간단하고 이해하기 쉽습니다. 제안을 환영하지만 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
당신 ” 메인 함수에 모든 코드를 작성했습니다. 이것은 언어를 배우는 사람들에게 상당히 전형적인 접근 방식입니다. 끝날 때까지 필요에 따라 논리를 계속 추가합니다. 확장 또는 업데이트가 금방 어려워 질 수 있습니다. 이상적으로는 메인을 프로그램을 형성하기 위해 연결할 수있는 논리적 요소 (다른 클래스 & 함수)로 나누고 싶습니다. 각 요소에는 고유 한 책임이 있어야하며 그에 따라 이름이 지정되어야합니다. 이렇게하면 개별 요소를 더 쉽게 이해하고 나중에 재사용 할 후보를 쉽게 식별 할 수 있습니다.
중복 제거
많은 코드를 작성했습니다. 그러나 이것은 다른 비트와 매우 유사합니다. 중복을 발견 한 곳에서는 종종 빌딩 블록 (예 : 함수)이 누락되었다는 좋은 신호입니다. 코드를 살펴보면 코드를 다음과 같은 구조로 나눌 수 있습니다.
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
분기는 이스케이프되지 않으므로 다른 분기가 필요하지 않습니다. 다음과 같이 간단히 수행 할 수 있습니다.
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()