Am scris un joc bazat pe text Hangman în Java care trebuie să includă caracteristicile pe care le-am inclus în comentariile codului meu .

Pe scurt, jocul va cere utilizatorului să introducă un cuvânt pe care acesta (sau o a doua persoană) îl va ghici apoi. Cuvântul va fi cenzurat de program. Programul îi va spune utilizatorului dacă litera lui ghicită este sau nu în cuvânt și va arăta progresul cuvântului cenzurat după fiecare presupunere. Dacă utilizatorul a ghicit deja scrisoarea înainte, programul îi va spune utilizatorului acest lucru și își va arăta presupunerile anterioare fără a repeta nici o literă. Programul va afișa numărul de încercări la final.

Codul pe care l-am scris mai jos funcționează și are toate caracteristicile pe care le-am enumerat. Dar nu pare optim și probabil cu o etichetă foarte slabă, deoarece sunt autodidactă până acum. Prin urmare, caut orice sfat care să facă acest cod mai bun și să mă asigur că nu intru în obiceiuri proaste ( Probabil că deja am haha) deoarece continuu să învăț Java de unul singur.

//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() } 

Exemplu de ieșire a codului meu pentru referință, dacă este necesar:

introduceți descrierea imaginii aici

Răspuns

Câteva modificări simple:

Creați două scanere , unul în buclă și unul slab denumit la început. Redenumesc typedword la input și înlocuiți utilizările guess cu input.

if(repeated == false) 

ar fi mai bine scris

if(!repeated) 

În mod similar modific altele dacă declarații

aș folosi un Set<String> pentru a stoca presupunerile anterioare

M-am mutat d declarația times către !repeated loop, astfel încât declarația sa să fie mai aproape de utilizare și limitată la sfera sa de utilizare.

Alte declarații au fost alăturate setării valorii și unele atribuții înlănțuite, cum ar fi noua

String wordToGuess = input.nextLine().toUpperCase(); 

tempstring a fost eliminat, este construit acum doar când este necesar

o serie de variabile au fost redenumite pentru mai multe nume explicative.

Cod final:

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!"); } } 

Comentarii

  • o altă sugestie: ar putea fi interesant să stochezi ghiciul într-un char în loc de un șir, dar asta schimbă unele lucruri minore din logică …

Răspunde

Vă mulțumim că ne-ați distribuit codul! Arată destul de bine, dar (ca întotdeauna) există câteva lucruri de remediat și de căutat:

  1. Crearea mai multor instanțe Scanner: Nu trebuie. Trebuie doar unul. Crearea mai multor spații ocupă mai mult spațiu. În loc să creați typed word și guess, creați unul numit input sau ceva de genul acesta.

  2. Închiderea Scanners: Faceți întotdeauna deci, când ați terminat de utilizat, altfel veți primi un avertisment „Resurse scurgeri”. Închiderea unui Scanner face ca Scanner nu poate fi folosit din nou. Este ca și cum ai opri luminile atunci când ieși din cameră, nu are rost să le lași aprinse. Este o risipă dacă o faci.

  3. Utilizarea == cu booleeni. În loc de ==, utilizați !, astfel:

    if(condition) { //if "condition" is true. 

    sau

    if(!condition) { //if "condition" is false 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *