2015-04-26 3 views
-1

Я пытаюсь создать игру Hangman. Предположим, что слово «угадать» было «лампочкой». Когда пользователь угадывает письмо, которое появляется более одного раза в слове, которое в данном случае является «l», я хочу удалить эту букву из ArrayList во всех местах, чтобы ArrayList содержал «ightbub». Ниже приведен мой код для класса, который обрабатывает userGuesses и проверяет буквы в выбранном слове. ДЛЯ КОДА НИЖЕ: wordToGuess = ("lightbulb")ArrayList (выпуск с удалением)

Еще одна проблема: ниже этого кода я включил вывод. Как вы можете видеть, когда я вхожу в одно и то же письмо, он говорит, что я догадался о письме, хотя это письмо должно быть удалено из ArrayList.

import java.util.ArrayList; 

public class InputChecker extends PromptUser{ 

static int numOfGuesses; 
static String userGuess; 
static String[] charList; 
static boolean contains; 

ArrayList<String> characters = new ArrayList<String>(); 

public boolean alive = true; 

static WordSelector ws = new WordSelector(); 
static LengthReturner lr = new LengthReturner(); 
static PromptUser pu = new PromptUser(); 

static String wordToGuess = ws.setWord(); 
static int wordLength; 

public static void finish() { 
    System.out.println(); 
    System.out.println(); 
    System.out.println("Congratulations! You have finished the game."); 
    System.out.println("Coming soon: GUI"); 
} 

public boolean askUser() { 
    while(alive == true) { 
     boolean validGuess = false; 
     while(validGuess == false) { 
      userGuess = pu.getUserInput("Enter your guess here:"); 
      if(userGuess == null || userGuess.length() > 1) { 
       validGuess = false; 
       System.out.println("Enter ONE letter!"); 
      } else { 
       validGuess = true; 
      } 
     } 
     wordLength = lr.setLength(wordToGuess); 
     charList = wordToGuess.split("(?!^)"); 
     contains = false; 
     for(String c : charList) { 
      characters.add(c); 
     } 
     for (String c : characters) { 
      if(userGuess == c) { 
       characters.remove(c); 
       contains = true; 
      } 
     } 
     if(contains == true) { 
      System.out.println("You guessed a letter!"); 
      numOfGuesses++; 
      if(characters.isEmpty()) { 
       System.out.println(); 
       System.out.println(); 
       System.out.println("Congratulations! You have successfully guessed the word, which was " + wordToGuess + "."); 
       System.out.println("You took " + numOfGuesses + " guesses!"); 
       alive = false; 
      } 
     } else { 
      System.out.println("Your guess, '" + userGuess + "', is not in the word!"); 
      numOfGuesses++; 
     } 
    } 
    return alive; 
} 
} 

Вот результат, когда я ввожу одну и ту же букву повторно. Обратите внимание, как всегда говорится, что я успешно догадался о письме, хотя это письмо должно быть удалено из ArrayList. Так или иначе, remove() не работает для меня. Опять же, wordToGuess = ("лампочка :)

Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
Enter your guess here: 
l 
You guessed a letter! 
+0

Вы бы быстро поняли свою проблему, если попытались отладить. В частности: вы должны попробовать распечатать «символы» сразу после распечатки «Вы догадались о письме!». – ruakh

ответ

1

Перемещение строки:.

charList = wordToGuess.split("(?!^)"); 
    contains = false; 
    for(String c : charList) { 
     characters.add(c); 
    } 

вне цикла времени, так как она в то время цикла, он повторно инициализацией„символов“ в каждой итерации.

0

JavaDoc для Iterator.remove() говорит (частично),

Этот метод может быть вызван только один раз за вызов до next(). Поведение итератора не указывается, если базовая коллекция изменена во время выполнения итерации любым способом, кроме как путем вызова этого метода.

Кроме того, вы сравните Object типов (включая String) равенство с equals() (не ==). Вам нужно что-то вроде

Iterator<String> iter = characters.iterator(); 
while (iter.hasNext()) { 
    String c = iter.next(); 
    if (userGuess.equals(c)) { 
     // characters.remove(c); 
     iter.remove(); 
     contains = true; 
    } 
} 
Смежные вопросы