Kirjoitin tämän hirsipuuohjelman. Matriisissa tarvitaan kolme sanaa, se valitsee satunnaisen sanan ja sitten käyttäjä arvaa kirjaimet. Se on pitkä, mutta erittäin yksinkertainen ja ymmärrettävä. Ehdotukset ovat tervetulleita, mutta muista, että tietämykseni Java-kielellä on rajallinen.
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 } } }
Vastaa
Koodisi on melko yksinkertainen ja helppo seurata. Voit tehdä useita asioita, joista olen ehdottanut alla, helpottamaan päivittämistä ja muodostamaan perustan tuleville ohjelmille.
main
Sinä ” Olet kirjoittanut kaikki koodisi päätoimintoon. Tämä on melko tyypillinen tapa oppia kieltä. Lisäät logiikkaa tarpeen mukaan, kunnes pääset loppuun. Laajentaminen tai päivittäminen voi nopeasti olla vaikeaa. Ihannetapauksessa haluat jakaa pääryhmän loogisiin elementteihin (muut luokat &), jotka voidaan yhdistää muodostamaan ohjelmasi. Jokaisella elementillä tulisi olla erillinen vastuu, ja se tulisi nimetä vastaavasti. Tämä tekee yksittäisistä elementeistä helpommin ymmärrettäviä ja helpottaa myöhemmin käytettävien ehdokkaiden tunnistamista.
Poista päällekkäisyys
Olet kirjoittanut paljon koodia. Paljon se on kuitenkin hyvin samanlainen kuin muut bitit. Jos havaitset päällekkäisyyksiä, on usein hyvä merkki siitä, että puuttuu rakennusosa (kuten funktio). Koodia tarkasteltaessa voit jakaa koodin tällaiseen rakenteeseen:
playAgain = askPlayerIfTheyWantToPlayAgain() if(playAgain) { wordToGuess = getRandomWord(); guessLettersUntilWin(wordToGuess); }
Huomaa, että olen supistanut kullekin tapauslausekkeet sana yhdeksi menetelmäksi guessLettersUntilWin
, johon välitän sanan. Tämä johtuu siitä, että eri tapauslausekkeiden välillä on paljon päällekkäisyyksiä, jotka sinun pitäisi pystyä poistamaan. Voit käyttää wordToGuess.length()
-näppäintä saadaksesi esimerkiksi sanan pituuden arvata, sen sijaan, että koodaisit kovasti arvoa (4/5). Sen sijaan, että koodaisit kovasti sanan kirjaimia arvata, voit käyttää wordToGuess.toCharArray()
. jne.
Nesting
Liian monet pesintätasot ovat huonoja. Ne saavat koodin vaeltamaan sivun yli oikealle, kunnes se putoaa näytön reunasta. Voit välttää liiallisen pesimisen jakamalla koodin sopiviksi menetelmiksi. Voit myös vältä sen käyttöä, kun se ei ole välttämätöntä. Esimerkiksi ohjelman alussa teet:
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
Ja loput koodista on else
-lauseke. Haara if
ei koskaan pääse pakoon, joten et tarvitse muuta. Voit tehdä yksinkertaisesti:
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
} // kommentit
Et yleensä näe monia kommentteja sulkujen sulkemisesta, mikä osoittaa, miksi ahdin avattiin, se vain lisää sekaannusta koodiin. Ne voivat olla hyödyllisiä, kun sinulla on suuria lohkoja sisäkkäisiä koodeja, mutta kuten olen edellä sanonut, tämä on usein osoitus siitä, että sinun on hajotettava koodisi enemmän.
silmukat voivat olla ystäväsi
Tapauslausekkeissasi on jälleen paljon päällekkäisyyksiä. Tämä johtuu siitä, että olet luonut if / else-ketjun jokaiselle sanan kirjaimelle. Tämä rakenne voidaan korvata for for -silmukalla (pseudokoodi):
for(index=0 to guessWord.length()) { if(letter == guessWord[index]) { print("You found...") lettersCorrect++; } } // check if lettersCorrect == guessWord.length()