2014-01-24 91 views
0

我一直坚持这段代码一段时间了,并会真正感谢一些帮助。所以基本上我的hang子手代码运行良好,但控制台中的显示器,破折号应该反映哪些字母已被正确猜测,哪些字母仍然被猜到是完全错误的。我会在这里发布我的代码。由于时间很长,我只会发布相关的方法。我觉得问题出在显示器阵列列表上,我无法持续更新。爪哇Hang子手代码

 public void play() { 

    String SecretWord = getWord(); 
    ArrayList <String> lettersInWord = new ArrayList <String>(); 
    for (int i=0;i<SecretWord.length();i++){ 
      lettersInWord.add(Character.toString(SecretWord.charAt(i))); 
      } 
    int remainingChances = getNumberGuesses(); 
    int noOfLetters = SecretWord.length(); 
    ArrayList<String> lowerCaseAlphabets = getAlphabetArrayList(); 
    ArrayList<String> display = new ArrayList<String>(); 
    for (int i = 0; i<noOfLetters; i++) { 
     display.add("_"); 
    } 
    System.out.println(printDisplay(display)); 
    Set <String> lettersGuessed = new HashSet<String>(); 
    while (remainingChances > 0){ 
     String question = readString("What letter do you want to guess?"); 
     if (lowerCaseAlphabets.contains(question)){ 
     System.out.println("Number of misses remaining equals "+remainingChances+""); 
     int index = lettersInWord.indexOf(question); 
      if (index== -1){ 
       lettersGuessed.add(question); 
       remainingChances-= 1; 
       if (remainingChances==0){ 
        System.out.println("No "+question+". You lose! The secret word was "+SecretWord+""); 
       } 
       else if (remainingChances>0){ 
        System.out.println("There is no "+question+" in the word"); 
        System.out.println(printDisplay(display)); 
        System.out.println("Guesses so Far :"+lettersGuessed+""); 

       } 
      } 
      else if (index!=-1){ 
       while (index!= -1){ 
        display.set(index, question); 
        System.out.println(printDisplay(display)); 
        System.out.println("Guesses so Far :"+lettersGuessed+""); 
        lettersInWord.remove(index); 
        if (lettersInWord.size()==0){ 
         System.out.println("You have won! Congratulations!"); 
         return; 
        } 
        else if (lettersInWord.size()!=0){ 
         index = lettersInWord.indexOf(question); 

        } 
       } 

      } 
     } 
     else { 
      System.out.println("The letter you have chosen in invalid. You must pick a lower case letter from the alphabet!"); 

     } 
    } 
}    

    public String printDisplay(ArrayList<String> display){ 
    String View = ""; 
    for (int i =0;i<display.size();i++){ 
     View+= display.get(i) + " "; 
    } 
    return View; 
} 

回答

1

的问题是这一行:

lettersInWord.remove(index); 当你调用这个你正在改变ArrayList中,所以,当你得到新的指数,将是不正确的,因为它已被转移。例如,我们说这个秘密词是“测试”。首先,数组列表将是[t,e,s,t],当你询问第一个t的索引时,你会得到0(正确)。但是在调用arraylist.remove之后,你会有[e.s.t]。当询问第二个t的索引时,它将返回2而不是你正在查找的3。

也许你应该有第二个arraylist,保持秘密词完整,你将用于索引查找,并保留第一个存储剩余的字母。

+0

虽然我似乎仍然遇到同样的问题。 – user2904796

+1

请勿删除'lettersInWord'中的任何内容。只需用'null'替换建立索引中的字符即可。这会让你的索引正确,同时阻止'indexOf'找到任何已经建立的字符。 – regulus

+0

因此,如果我使用lettersInWord.set(index,null),当我使用lettersInWord.size()调用时,是否会计算空元素? – user2904796