刽子手:记住以前的猜测

时间:2013-09-20 16:48:00

标签: java

我是一个非常新的Java,所以这可能听起来很愚蠢。

我正在尝试用Java创建一个基于GUI的Hangman游戏。我已经从数组创建了按钮列表,并在单击时将单个字母作为字符返回。我有猜测的单词列表,每按一次按钮,它需要将单词与被按下的字母进行比较,如果匹配则替换。

我的一位朋友建议使用数组分割和检查字母,但我不熟悉那些东西。由于我需要跟踪错误的输入以及计算错误,我不确定使用StringBuilder是否是最好的主意。如果StringBuilder是我的最佳选择,请帮助我解决以下问题:

 String word = retWord; // The actual word  
 String s = "" + guessed; //Changing guessed letter to string 
 StringBuilder gletters = new StringBuilder(s);  
 String mainword = word.replaceAll("[^" + gletters + "]", "_"); //Replacing the matching letters  
 a.setText(mainword);

代码在按下按钮的FOR循环内执行,但输出需要为'apple'。每次按下按钮,输出看起来像这样:

按下A时: A _ _ _ _
按下P时: _ p p _ _
按下L时: _ _ _ L _
按下E时: _ _ _ _ E

我的问题是我应该如何让它记住以前的猜测是正确的,而不仅仅是当前的猜测? 另外,如何计算错误按钮按下的错误?

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:1)

将先前猜到的字母保存在数组中

ArrayList<String> lettersGuessed;

一些伪代码

When button pressed then
    added letter to list of letters guessed
    if the letter guessed is wrong then
        increment wrong guesses count
        end game it too many wrong guesses
    end if
    reveal all letters in the list of letters guessed
end when 

答案 1 :(得分:1)

你的问题是你用for循环覆盖gletters。这意味着您的正则表达式会覆盖除猜测字母之外的所有内容,而不会覆盖以前的字母。

要尽可能少地更改代码(即使用StringBuilder),只需在for循环之外初始化gletters(容量至少为正确单词的大小)。然后在循环内部,只需附加到它。

你应该能够从这里弄明白。 JavaDocs是你的朋友! http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html

答案 2 :(得分:0)

将正确的猜测存储在一个数组/列表/集中,并在另一个组中进行错误的猜测。然后你可以调用你使用的任何结构的count方法来获得错误猜测的数量。

答案 3 :(得分:0)

您可以使用布尔数组存储以前的猜测字母。

boolean lettersGuessed = new boolean[26];

从那里,按下字母(字符,而不是字符串)并将其转换为大写字母;然后减去65.使用你得到的数字作为数组中的位置,并检查它是否已被猜到;如果没有将条目设置为true并显示正确的字母,或者将错误猜测的数量加1。

转换为大写的代码如下所示:

// See if a lower case letter was entered
// Convert it to uppercase
if (guessed >= 97 && guessed <= 122) guessed -= 32;

// Subtract 65 to get array index
guessed -= 65;

// Make sure the guess is a letter
if (guessed <= 0 && guessed <= 25) {
    if (lettersGuessed[guessed]) {
        // The user already guessed this letter, do nothing
    } else {
        lettersGuessed[guessed] = true;
        // See if the letter guessed was right, if it was show the letters
        // If it wasn't, incorrectGuesses+1
} 

这个使用的关键思想是在内部,计算机使用数字来表示字母(在这种情况下,查找ascii值);知道了这一点,我们可以使用这些数字将它们转移到一个范围(0到25),这个范围适用于数组中的位置。

为了检查一封信是否正确,你可以做这样的事情(这不是最好的方法,但应该足够简单):

boolean correct = false;
for (int i = 0; i < word.length(); i++) {
    if (word.charAt(i) == guessed) {
        correct = true;
    }
}

在此之后,如果猜到的字母是单词中的一个字母,correct将为真。否则correct将为假。

为了记住以前的猜测,而不是每次重新声明String的String s = "" + guessed;,而只是声明String一次。然后,要在其末尾添加一个字母,请使用s.concat("" + guessed)

相关问题