2014-01-11 2 views
-1

Итак, я написал небольшую игру Hangman, но у меня нет CLUE, почему она не работает. Обычно я задавал вопрос, чтобы решить проблему, но я просто не знаю, что происходит, и почему у меня возникает эта проблема. Нет ошибки.Почему мой код работает не так, как предполагалось?

Вот все мой код:

public static void main(String[] args) { 
    Scanner sc = new Scanner (System.in); 
    String mysteryGuess = "hello"; 
    String userGuess = ""; 
    int wrongGuesses; 


    System.out.println("Hello and welcome to Hang Man!"); 
    loop: 
    for(;;){ 
     String[] wordAsArray = convertToStringArray(mysteryGuess); 
     boolean[] guessed = new boolean[mysteryGuess.length()]; 
     for (int i = 0; i<wordAsArray.length;i++) 
      if(wordAsArray[i] == userGuess) 
       guessed[i]=true; 
     System.out.println("Word so far:" + visibleWord(wordAsArray,guessed)); 
     System.out.println("What is your guess?"); 
     userGuess = sc.next(); 
     if (guess(userGuess,wordAsArray,guessed) == true) 
      System.out.println("Correct"); 
     else 
      System.out.println("Incorrect"); 
     if (didWin(guessed)==true) 
      break loop; 
    } 
} 


//This method creates an array version of the parameter word 
//For example, if word contained the data "hello", then this method 
//would return {"h", "e", "l", "l", "o"} 
//Parameters: word - a single word 
//Returns:  an array containing each letter in word 
public static String[] convertToStringArray(String word) { 
    String [] pWord = new String [word.length()]; 
    for (int i = 0; i<pWord.length; i++){ 
     pWord[i] = word.substring(i,i+1); 
    } 
    return pWord; 

} 


//This method determines whether the player has won the game of HangMan 
//Parameters: guessed - array of boolean values 
//Returns:  true - if every value in guessed is true 
//    false - if at least one value in guessed is false 
public static boolean didWin(boolean[] guessed) { 
    boolean bGuess = true; 
    loop: 
    for (int i = 0; i<guessed.length;i++){ 
     if(guessed[i]==false){ 
      bGuess = false; 
      break loop; 
     } 


    } 
     return bGuess; 
} 


//This method determines what portion of the hidden word is visible 
//For example, if the parameters are as follows: 
//  wordAsArray: {"h", "e", "l", "l", "o"} 
//  guessed: {true, false, false, false, true} 
//Then the method should return "h???o" 
//Parameters: wordAsArray - the individual letters to be guessed 
//    guessed - array of boolean values; a true value means the corresponding letter has been guessed 
//Returns:  A string representing how much of the word has been guessed (unguessed letters are represented by ?'s) 
public static String visibleWord(String[] wordAsArray, boolean[] guessed) { 
    String visibleWord=""; 
    for(int i = 0; i<wordAsArray.length;i++){ 
     if (guessed[i] == true) 
      wordAsArray[i]=wordAsArray[i]; 
     if (guessed[i] == false) 
      wordAsArray[i]="?"; 
    } 
    for(int i = 0; i<wordAsArray.length;i++){ 
     visibleWord=visibleWord+wordAsArray[i]; 
    } 
    return visibleWord; 
} 


//This method checks to see if a player has made a successful guess in the game of Hang Man 
//For example, if the parameters are as follows: 
//  letter: "e" 
//  wordAsArray: {"h", "e", "l", "l", "o"} 
//  guessed: {true, false, false, false, true} 
//Then the guessed array would be changed to: 
//  guessed: {true, true, false, false, true} 
//And the method would return false 
//Parameters: letter - the letter that the user has just guessed 
//    wordAsArray - an array of individual letters that are to be guessed 
//    guessed - array of boolean values; a true value means the corresponding letter has been guessed 
//Returns: true - if letter matches an unguessed letter in wordAsArray 
//   false - otherwise 
public static boolean guess(String letter, String[] wordAsArray, boolean[] guessed) { 
    boolean appearsAtLeastOnce=false; 
    for(int i = 0; i<wordAsArray.length;i++) 
     if(letter.equalsIgnoreCase(wordAsArray[i])){ 
      guessed[i] = true; 
      appearsAtLeastOnce=true; 
     } 
    return appearsAtLeastOnce; 



} 

}

Так что, когда вы вводите ваше предположение, даже если это право будет сказать, его неправильно и «слово до сих пор» не будет показывать, что вы Правильно. Может кто-нибудь, пожалуйста, объясните мне, что здесь не так? Я уверен, что это простая вещь, которую мне не хватает, но я был на ней часами. Спасибо.

Кроме того, я использую «привет» только для тестирования. Я ищу, чтобы ввести список различных слов словаря.

ответ

3

Изменить

if(wordAsArray[i] == userGuess) 

в

if(wordAsArray[i].equals(userGuess)) //Replace .equals with .equalsIgnoreCase for case insensitive compare. 

Вы сравниваете строку, а не объект. Таким образом, == не будет работать.

Надеюсь, это поможет.

+0

IMO «Вы сравниваете ссылочные типы, а не примитивные типы Так' == 'не будет работать» более правильным, чем «Вы сравниваете строку, а не объект.Поэтому '==' не будет работать. – dorukayhan

0

Я не проверяла свой код глубоко, но есть некоторые проблемы, связанные с вашим кодом (и может быть есть еще несколько):

  1. Наиболее важные из них это вы определяете догадывался inside для loop, so every time the array is initialized to all false`.
  2. Вы используете == для строк, которые не будут работать, вы должны использовать метод String.equals() вместо этого, кстати, почему вы не использовали char?
  3. java.lang.String имеет toCharArray(), который возвращает char[], представляющие каждый символ, и потому char примитивно вы можете использовать == оператор на нем.
1

Ваша линия: if(wordAsArray[i] == userGuess) сравнивает два предмета, проверяя их равными. В этом случае два объекта String. Это сравнение проверяет, соответствуют ли объектов (расположение памяти). Несмотря на то, что строки имеют одинаковое значение, они представляют собой два разных объекта и, следовательно, имеют два разных расположения памяти, что сделает их неравными.

Что вы пытаетесь сделать, это проверить, совпадают ли эти два объекта значения. Это может быть достигнуто с помощью метода String.equals(): if(wordAsArray[i].equals(userGuess))

В целом, при работе с примитивными типами данных (INT, поплавком, логическими, символ ...) == сравнения работает просто отлично. Однако при работе с объектами вы должны использовать метод equals() объекта.

Подробнее о примитивных типов: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Смежные вопросы