코드 주석에 포함 된 기능을 포함해야하는 행맨 텍스트 기반 게임을 Java로 작성했습니다. .
간단히 말해서 게임은 사용자 (또는 두 번째 사람)가 추측 할 단어를 입력하도록 요청합니다. 그 단어는 프로그램에 의해 검열됩니다. 이 프로그램은 추측 한 글자가 단어에 있는지 여부를 사용자에게 알리고 각 추측 후 검열 된 단어의 진행 상황을 보여줍니다. 사용자가 이미 문자를 추측 한 경우 프로그램은 사용자에게이를 알리고 문자를 반복하지 않고 이전 추측을 표시합니다. 프로그램은 마지막에 시도 횟수를 표시합니다.
아래에 작성한 코드는 작동하며 나열된 모든 기능을 가지고 있습니다. 하지만 지금까지는 독학을했기 때문에 최적이 아니며 아마도 매우 열악한 에티켓으로 보입니다. 따라서이 코드를 더 좋게 만들고 나쁜 습관에 빠지지 않도록 할 조언을 찾고 있습니다 ( Java를 계속 배우기 때문에 이미 haha가있을 것입니다.
//Simple Hangman game where user types a word, program stores it in all CAPS for easier user readability and censors the word (i.e *****) //User then guesses one letter at a time until the entire word is guessed. Program will inform the user if the guess is in the word, and show the progress of the word after each guess. //If the guessed letter is in the word, program will print out the # of times the letter is in the word. //Program will store and print out # of guesses (attempts) needed to guess the word at the end of the program. //If user tries to duplicate a previous guess, program will inform user of that and show previous guesses by user. Attempt count will not go up for duplicate guesses. //When the program shows previous guesses by the user (using a string), it cannot contain duplicate letters. (i.e: if user guesses "s" twice, "s" will still only show up once in the string) //StackOverFlow readers: This program works as intended, but as a self-taught beginner coder, I need assistance on optimal coding style (less lines the better) and good coding principles/etiquette //I definitely think there are much better ways to code this, but I cannot think of any more (as you probably noticed, this is v3, which has more features and yet similar amount of lines as version 1 haha) //All and any help is appreciated! Thank you :D import java.util.*; public class HangmanGameV3 { public static void main(String [] args){ //Initialize all the variables used here String storedword; char[] charstring; int length; char[] censor; int attempts=0; StringBuilder pastguesses = new StringBuilder(); //String Builder to add and print out previous guesses Scanner typedword = new Scanner(System.in); System.out.println("Enter your word to guess: "); storedword = typedword.nextLine(); storedword = storedword.toUpperCase(); //stores the word and changes it to all caps length = storedword.length(); charstring = storedword.toCharArray(); //creates char array of string //creates and prints an array of chars with the same length as string censor = storedword.toCharArray(); System.out.println("Your secret word is: "); for (int index = 0; index < length; index++){ censor[index] = "*"; } //Main loop to take guesses (is this while loop the ideal loop here? while (String.valueOf(censor).equals(storedword)== false){ //Initialize all variables in loop char charguess; String tempword; String tempstring; boolean correct = false; //required for if loops below/lets the user know if the letter is in the word or not int times = 0; //number of times a letter is in the word boolean repeated = false; //check if user guessed the same letter twice //prints the censored secret word for(int a= 0; a < length; a++){ System.out.print(censor[a]); } System.out.println(); //asks user for guess, then stores guess in Char charguess and String tempstring Scanner guess = new Scanner(System.in); System.out.println("Type your guess: "); tempword = guess.next(); charguess = tempword.charAt(0); //gets char data from scanner pastguesses.append(charguess); //adds guess to previous guess string tempstring = pastguesses.toString(); //checks if user already guessed the letter previously if (tempstring.lastIndexOf(charguess, tempstring.length() -2 ) != -1){ System.out.println("You already guessed this letter! Guess again. Your previous guesses were: "); pastguesses.deleteCharAt(tempstring.length()-1); System.out.println(tempstring.substring(0, tempstring.length()-1)); repeated = true; } //if the guess is not a duplicated guess, checks if the guessed letter is in the word if (repeated == false){ for (int index = 0; index < length; index++){ if(charstring[index] == Character.toUpperCase(charguess)) { censor[index] = Character.toUpperCase(charguess); //replaces * with guessed letter in caps correct = true; times++; } } if(correct == true){ System.out.println("The letter " + charguess + " is in the secret word! There are " + times +" " + charguess + " "s in the word. Revealing the letter(s): "); } else if (correct == false){ System.out.println("Sorry, the letter is not in the word. Your secret word: "); } System.out.println(); } attempts++; } System.out.println("You guessed the entire word "+ storedword.toUpperCase() + " correctly! It took you " + attempts + " attempts!"); //typedword.close(); //StackOverFlow readers: is this necessary? Not sure how to use .close() }
필요한 경우 참조 할 수 있도록 코드의 샘플 출력 :
답변
몇 가지 간단한 변경 사항 :
두 개의 스캐너 를 만듭니다. 하나는 루프 내부에 하나는 처음에 이름이 잘못되었습니다. id = “3c7833a846”>
를input
로 변경하고guess
사용을input
.
if(repeated == false)
더 잘 작성 될 것입니다.
if(!repeated)
비슷하게 문장
과거 추측을 저장하기 위해 Set<String>
를 사용합니다.
이동했습니다 d times
의 선언을 !repeated loop
내에서 선언하여 사용 범위를 제한하고 사용 범위를 제한합니다. p>
다른 선언이 값 설정에 결합되었으며 일부 할당은 새 것과 같이 연결되었습니다.
String wordToGuess = input.nextLine().toUpperCase();
tempstring
가 제거되었습니다. 지금은 필요할 때만 구성됩니다.
더 많은 설명을 위해 여러 변수의 이름이 변경되었습니다.
최종 코드 :
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class HangmanGameV3 { public static void main(String[] args) { int attempts = 0; Set<String> previousGuesses = new HashSet<>(); Scanner input = new Scanner(System.in); System.out.println("Enter your word to guess: "); String wordToGuess = input.nextLine().toUpperCase(); int length = wordToGuess.length(); char[] wordToGuessChars = wordToGuess.toCharArray(); //creates char array of string //creates and prints an array of chars with the same length as string char[] censor = wordToGuess.toCharArray(); System.out.println("Your secret word is: "); for (int index = 0; index < length; index++) { censor[index] = "*"; } //Main loop to take guesses (is this while loop the ideal loop here? while (!String.valueOf(censor).equals(wordToGuess)) { //Initialize all variables in loop boolean correct = false; //required for if loops below/lets the user know if the letter is in the word or not boolean repeated = false; //check if user guessed the same letter twice //prints the censored secret word for (int a = 0; a < length; a++) { System.out.print(censor[a]); } System.out.println(); //asks user for guess, then stores guess in Char charguess and String tempstring System.out.println("Type your guess: "); String currentGuess = input.next().toUpperCase().substring(0, 1); char currentGuessChar = currentGuess.charAt(0); //gets char data from scanner //checks if user already guessed the letter previously if (previousGuesses.contains(currentGuess)) { System.out.println("You already guessed this letter! Guess again. Your previous guesses were: "); System.out.println(previousGuesses.stream().reduce("", String::concat)); repeated = true; } previousGuesses.add(currentGuess); //if the guess is not a duplicated guess, checks if the guessed letter is in the word if (!repeated) { int times = 0; //number of times a letter is in the word for (int index = 0; index < length; index++) { if (wordToGuessChars[index] == currentGuessChar) { censor[index] = currentGuessChar; //replaces * with guessed letter in caps correct = true; times++; } } if (correct) { System.out.println("The letter " + currentGuessChar + " is in the secret word! There are " + times + " " + currentGuessChar + " "s in the word. Revealing the letter(s): "); } else { System.out.println("Sorry, the letter is not in the word. Your secret word: "); } System.out.println(); } attempts++; } System.out.println("You guessed the entire word " + wordToGuess.toUpperCase() + " correctly! It took you " + attempts + " attempts!"); } }
댓글
- 다른 제안 : String 대신에 로직의 사소한 사항이 변경됩니다 …
Answer
코드를 공유해 주셔서 감사합니다! 꽤 괜찮아 보이지만 (항상 그렇듯이) 몇 가지 수정하고주의해야 할 사항이 있습니다.
-
여러
Scanner
인스턴스 만들기 : 하지 마세요. 하나만 필요합니다. 둘 이상을 만들면 더 많은 공간이 필요합니다.typed word
및guess
를 만드는 대신input
또는 이와 유사한 이름입니다. -
Scanners
닫기 : 항상 따라서 사용을 완료하지 않으면 “리소스 누수”경고가 표시됩니다.Scanner
를 닫으면Scanner
는 다시 사용할 수 없습니다. 방을 나갈 때 조명을 끄는 것과 같습니다. 조명을 켜두는 것이 의미가 없습니다. 그렇게하면 낭비 일뿐입니다. -
부울과 함께
==
사용.==
대신 다음과 같이!
를 사용합니다.if(condition) { //if "condition" is true.
또는
if(!condition) { //if "condition" is false