2015-11-28 53 views
-2

好的,所以我对我的编程课有这样的做法,我们被要求做一个hang子手游戏,你可以看到。除了一件事以外,所有的程序都可以正常工作:当一个字有一个字母重复多次时,程序只接受一次,然后忽略其他字。我认为问题出在setLetter方法中。它的工作是用字母替换破折号。当我第二次运行该程序并输入字母时,它确实告诉我这是一个正确的猜测,但它不会用字母替换短划线。Hang子手程序(重复字母)

任何帮助将不胜感激! 谢谢。

import java.util.Random; 
import java.util.Scanner; 

public class Hangman { 

public static void main(String [] args) { 

    // word list 
    String [] hangmanList = {"accelerate", "achieve", "able", "microscope", 
      "thumb", "wonderful", "yard", "wood", "lemon", "favorite", "decide", "circular", 
      "broke", "elephant", "funny", "hamburger", "leg", "job", "lighthouse", "mother", 
      "notebook", "puzzle"}; 



    int allowedGuesses = 7; 

    String secretWord=pickRandomWord(hangmanList);   
    System.out.println(secretWord); 

    char[] correctGuesses = new char [secretWord.length()];  


    for (int i=0; i<correctGuesses.length;i++){ 
     correctGuesses[i]= '-'; 
    } 


    char [] incorrectGuesses= new char [20]; 



    int mistakeCount = 0; 
    Scanner input = new Scanner(System.in); 



    for (int i=0; mistakeCount<allowedGuesses;i++){ 
     if (checkWinner(correctGuesses)!=true){ 

     printGallows(mistakeCount); 

     System.out.println("\n "); 

     for (int j=0;j<correctGuesses.length;j++){ 
      System.out.print(correctGuesses[j]); 
     } 

     System.out.print("\nWrong guesses: "); 
     for (int j=0;j<=i;j++){ 
      System.out.print(incorrectGuesses[j]); 
     } 


     System.out.print("\nPlease guess a letter: "); 
     char a = input.next().charAt(0);; 


     boolean letterFound = false;   
     letterFound = matchFound(a,secretWord); 


     if (letterFound) { 

      setLetter(a ,secretWord, correctGuesses); 
      System.out.println("-== correct guess! ==-"); 
     } 
     else { 

      incorrectGuesses[i]=a; 

      mistakeCount++; 

      System.out.println(":(:(:(Oops! that is incorrect..."); 
     } 

    } 
     else break; 

    } 



    System.out.println("\n********************************************"); 
    System.out.println("The secret word was: " + secretWord); 

    if (checkWinner(correctGuesses)) { 
     System.out.println("Congratulations, you won!"); 
    } 
    else { 
     System.out.println("Better luck next time!!!"); 
     printGallows(mistakeCount);    
    } 


}  


private static boolean checkWinner(char[] correctGuesses) { 
    boolean isWinner=false; 

    for (int i=0; i<correctGuesses.length;i++){ 
     if (correctGuesses[i]!= '-') isWinner=true; 
     else isWinner=false; 
    } 

    return isWinner; 
} 


public static boolean matchFound(char guess,String secretWord) { 
    char [] letters = secretWord.toCharArray(); 
    for (int i=0; i<letters.length;i++){ 

     if (guess == letters[i]) { 
      return true ; 
     } 
    } 
    return false;   
} 


public static boolean setLetter(char guess,String secretWord, char[] correctGuesses) { 

    char [] letters = secretWord.toCharArray(); 
    int guessed=0; 
    for (int i=0;i<letters.length;i++){ 

     if (guess==letters[i]){ 
      guessed++; 
     } 

     if (guessed>0){ 
      correctGuesses[i]=letters[i]; 
      return true; 
     } 

     else if (guess==0){ 
      correctGuesses[i]=letters[i]; 
      return true; 
     } 
    } 

    return false;   
} 



private static void printGallows(int mistakeCount) { 

    if (mistakeCount==0){ 
     System.out.print(" ____\n | |\n |\n |\n |\n |\n |\n |\n__|__"); } 

      else if (mistakeCount==1){ 
      System.out.print(" ____\n | |\n | O\n |\n |\n |\n |\n |\n__|__"); } 

      else if (mistakeCount==2){ 
      System.out.print(" ____\n | |\n | O\n | |\n |\n |\n |\n |\n__|__");} 

      else if (mistakeCount==3){ 
      System.out.print(" ____\n | |\n | O\n | |\n | \\|\n |\n |\n |\n__|__");} 

      else if (mistakeCount==4){ 
      System.out.print(" ____\n | |\n | O\n | |\n | \\|/\n |\n |\n |\n__|__");} 

      else if (mistakeCount==5){ 
      System.out.print(" ____\n | |\n | O\n | |\n | \\|/\n | |\n |\n |\n__|__");} 

      else if (mistakeCount==6){ 
      System.out.print(" ____\n | |\n | O\n | |\n | \\|/\n | |\n | /\n |\n__|__");} 

      else if (mistakeCount==7){ 
      System.out.print(" ____\n | |\n | O\n | |\n | \\|/\n | |\n |/\\ \n |\n__|__");} 

} 


private static String pickRandomWord(String[] dictionary){ 
    String secretWord=null; 

    Random r = new Random(); 

    secretWord = dictionary [r.nextInt(dictionary.length)];  

    return secretWord; 
} 

} // end of Hangman class 

回答

1

是的,问题出在setLetter方法中。你在第一个字母匹配时返回true。我的解决方案是

public static boolean setLetter(char guess, String secretWord, char[] correctGuesses) { 

    char[] letters = secretWord.toCharArray(); 
    int guessed = 0; 
    for (int i = 0; i < letters.length; i++) { 
     if (guess == letters[i]) { 
      guessed++; 
      correctGuesses[i] = letters[i]; 
     } 
    } 

    return guessed != 0; 
}