Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
439 views
in Technique[技术] by (71.8m points)

Java Hangman program

I need help figuring out the following errors in my code: replacing the correct letters the user inputs in the mystery word. My last method's function is to do this but I cannot figure out why it will only input a single correct letter and not all of the correct guesses. Also the maximum number of tries the user has is 8 but when I compile my program the number of tries will go into the negatives and I cannot figure out what is wrong with my maximum tries loops. Thank you in advance! I really appreciate this. **Also using several methods in this program is a requirement for my assignment!

import java.util.*;
import java.io.*;

     public class Hangman {
 public static Scanner keyboard; 
 public static final int MAXSIZE = 15000;
 public static final int NUM_GUESS = 8; 
 public static final int WORD_LENGTH = 20; 
 public static void main(String[] args) {
 keyboard = new Scanner(System.in); 
 int random = pickrandom(MAXSIZE); 

    try {
        // Set up connection to the input file
        Scanner input = new Scanner(new FileReader("dictionary.txt"));
        String [] dictionaryWords = new String [MAXSIZE];
        int usedsize = 0;
        while ( usedsize < MAXSIZE && input.hasNextLine() ){
            dictionaryWords [usedsize] = input.nextLine();
            usedsize ++; 
            }
        System.out
        .println("              H A N G M A N. " +
                "
 This is a word guessing game. " +
                "
 A word will be selected at random and kept hidden. You will try to figure out the secret word by" +
                "
 guessing letters which you think are in the word. " +
                "
 You will guess one letter at a time. " +
                "
 If the letter you guess is correct, the position(s) of the letter in the secret word will be shown. " +
                "
 You will be allowed " + NUM_GUESS + " wrong guesses  If you guess incorrectly " + NUM_GUESS+ " times, you lose the game. " +
                "
 If you guess all of the letters in the word, you win." +
                "

 Press enter to continue ");
        keyboard.nextLine(); 
        clearScreen();
        String word = dictionaryWords[random];

        System.out.println(dictionaryWords[random]);
        String blank = blankWord(word);

        String decision; 
        //decision = keyboard.nextLine().toUpperCase();
        System.out.println("Word to guess :");
        System.out.println(blank);
        int tries = NUM_GUESS; 

        System.out.println("Enter a letter to guess or 9 to quit");
        String guess = keyboard.next();
        do{

             //System.out.println(tries); 
        while (!guess.equals("9") || !(guess.equals(word)  && tries >0))
                {
                char letter = guess.charAt(0); 
                String guesses = "";
                guesses += letter;
                if (word.indexOf(letter) < 0) {
                    tries--;
                    System.out.println("Incorrect letters tried: " + guess);
                    System.out.println("Number of guesses left: " + tries);
                    System.out.println("Enter a letter to guess or 9 to quit");
                    guess = keyboard.next();
                }
                else {
                    String correctWord = correctWord( guess,  word,  blank, letter );
                    System.out.println(correctWord); 
                    System.out.println("Enter a letter to guess or 9 to quit");
                    tries--;
                    System.out.println("Number of guesses left: " + tries);
                    guess = keyboard.next();
                    tries--;
                    System.out.println("Number of guesses left: " + tries);
                }












            }
        if (guess.equals("9")){
            System.out.println("Thanks for playing");

        }
        if ( guess.equals(word)){
            System.out.println("You won!");
        }
        if( tries == 0){
            System.out.println("You have no more guesses left"); 
        }
        System.out.println("Play again? Y/N");
        decision = keyboard.nextLine().toUpperCase();

        } while (decision.equals("Y"));
        //System.out.println("Play again? Y/N");
        //decision = keyboard.nextLine().toUpperCase();
    }
    catch (FileNotFoundException e) {
        System.out.println("There was an error opening one of the files.");
    }


}
//Clears screen after introduction 
private static void clearScreen (){
    for (int blanks = 0; blanks < 80; blanks++) {
        System.out.println();
    }
}

// This method returns a randomly selected integer
// between 0 and count-1
public static int pickrandom(int count) {
    Random generator = new Random();
    return generator.nextInt(count);
}

// Places asterisks in place of the letters in the word
// Parameter is the string word. it holds mystery word

public static String blankWord(String word) {
    String blank = "";

    for (int i = 0; i < word.length(); i++) {

        blank += " * ";
    }
    return blank;
}
//Replaces asterisks with correct guess 
     public static void fillWord(String blank,String word, char letter ){
for ( int i = 0; i <word.length() ; i++){
    if(word.charAt(i) == letter){
        blank.charAt( i ); 

    }

}
  }
  //Receives correct guesses and replaces the asterisks with correct letter 
  //Parameters is  the mystery word 
    public static String newWord (String word){
 String newWord  = "";
 if (newWord.length() > 0){
     newWord += word.charAt(0);
     for (int i = 1; i <word.length(); i ++){
         newWord += word.charAt(0);
     }

 }
return newWord;  
  }
  //Counts the number of missed guesses and replaces total count
  //Parameters are the mystery word and the letter guesses from user 
  public static boolean alreadyGuessed(String word, String guess){
 for (int i = 0 ; i< word.length() ; i++){
     if (word.charAt(i)== guess.charAt(0)){
         return true; 
     }
 }
 return false; 
     }
         //Compares to see if the letter has already been guessed
      //Parameters are the mystery word and the user's guess 
      public static boolean letterGuessed(String word, String guess){
     for (int i = 0 ; i< word.length(); i++){
     if (word.charAt(i) == guess.charAt(0)){
         return true;
     }
 }
 return false; 
    }
   //Replaces correct guess in blanks 
     public static String correctWord(String guess, String word, String blank, char letter){ 

    for (int i = 0; i < word.length(); i++) {

         if (letter == word.charAt(i)){
             if (i >0){
         blank = blank.substring (0, i) + letter + blank.substring(i +1);
             }
             if (i ==0){
                 blank = letter + blank.substring(1); 
             }

         }
    }
    return blank;
}



}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Your logic is backwards. If tries is -1, then:

while( ... || (guess.equals(word) && (tries < 8) && (tries > 0)) {
while( ... || (guess.equals(word) && (-1 < 8) && (-1 > 0)) {
while( ... || (guess.equals(word) && true && false)) {
while( ... || !(false)) {
while( ... || true) {
while(true) {

in other words, your loop can never terminate, because the tries checking is wrong.

while (!guess.equals(word) && (tries > 0)) {

is probably what you want.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...