Jeg skrev et Hangman-tekstbaseret spil i Java, der skal indeholde de funktioner, som jeg inkluderede i kommentarerne til min kode .

Kort sagt, spillet beder brugeren om at skrive et ord, som de (eller en 2. person) derefter vil gætte på. Ordet censureres af programmet. Programmet fortæller brugeren, om deres gættede bogstav er i ordet eller ej, og viser forløbet af det censurerede ord efter hvert gæt. Hvis brugeren allerede gættede brevet før, vil programmet fortælle brugeren om det og vise deres tidligere gæt uden at gentage nogen bogstaver. Programmet viser antallet af forsøg i slutningen.

Koden, jeg skrev nedenfor, fungerer og har alle de funktioner, jeg har angivet. Men det virker ikke optimalt og sandsynligvis med meget dårlig etikette, da jeg indtil videre er selvlært. Derfor leder jeg efter råd, der kan forbedre denne kode og sikre, at jeg ikke kommer i dårlige vaner ( Jeg har sandsynligvis allerede haha), da jeg fortsætter med at lære Java alene.

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

Eksempel på output af min kode til reference, hvis det er nødvendigt:

indtast billedebeskrivelse her

Svar

Nogle enkle ændringer:

Du opretter to scannere , en inde i sløjfen og en dårligt navngivet i starten. Jeg omdøber typedword til input og erstatte anvendelser af guess med input.

if(repeated == false) 

ville være bedre skrevet

if(!repeated) 

Tilsvarende ændrer jeg andet, hvis udsagn

Jeg bruger en Set<String> til at gemme tidligere gætter

Jeg har flyttet d erklæringen om times til inden for !repeated loop, så dens erklæring er nærmere brugen og begrænset i omfang til dens anvendelse.

Andre erklæringer er blevet knyttet til indstillingen af værdien, og nogle opgaver lænket som den nye

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

tempstring er fjernet, den konstrueres kun nu, når det er nødvendigt

et antal variabler er blevet omdøbt til flere forklarende navne.

Endelig kode:

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

Kommentarer

  • et andet forslag: Det kan være interessant at gemme gæt i en char i stedet for en streng, men det ændrer nogle mindre ting i logikken …

Svar

Tak for at dele din kode! Det ser ret godt ud, men (som altid) er der nogle ting at rette og passe på:

  1. Oprettelse af flere Scanner forekomster: Don “t. Du har kun brug for en. Oprettelse af mere end en tager kun mere plads. I stedet for at oprette typed word og guess skal du bare oprette en kaldet input eller noget lignende.

  2. Lukning af din Scanners: Gør altid så når du er færdig med at bruge dem, ellers får du en “Ressource lækage” advarsel. Lukning af en Scanner gør det så, at Scanner kan ikke bruges igen. Det er som at slukke for lysene, når du forlader rummet, det har ingen mening at lade dem være tændt. Det er bare spild, hvis du gør det.

  3. Brug af == med booleanske. I stedet for == skal du bruge ! på denne måde:

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

    eller

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *