如何在空字符数组中添加猜测字母,确保它们永远不会被覆盖?

时间:2012-01-28 00:49:47

标签: java

基本上,这是一个刽子手游戏,我初始化一个猜测的字符字符数组,其长度与猜测的字相同,但不会在数组中放任何东西。在每次猜测之后,我想将猜测的字符添加到数组中,它将检查字符是否已被猜到,但是我很难实现它。

我尝试过的是在我的Hangman类中使用这个辅助方法:

private boolean checkIfGuessed(char c) {
        boolean guessed = false;
        for (int i = 0; i < guessedChars.length; i++) {
            if (guessedChars[i] == c) {
                guessed = true;
                break;
            }
            else if (guessedChars[i] != c && guessedChars[i] == 0) {
                guessedChars[i] = c;
            }
        }
        for (int i = 0; i < guessedChars.length; i++) {
            System.out.print(guessedChars[i] + " ");
        }
        return guessed;
    }

但它并没有按照我的意愿行事,它只是用最初猜到的任何字母填充数组。 (例如,无论游戏在哪里,如果玩家猜到第一个,并且阵列长度为6,那将是aaaaaa)

我正在尝试通过使用变量来标记它是否已被猜到(并将其返回到另一个方法)并且设置为猜测它是否循环通过数组并在最初的某个索引处找到相同的字符猜到了,会爆发出来的。否则,如果某个索引不等于猜测的字符,并且它等于0(我知道在数值数组中,这表示为空,不确定是否在char数组中),意味着为空,它会将猜到的字母写入循环的索引是。

问题显然是循环,并且似乎将数组中的所有索引标记为猜到的第一个字符。

有没有更好的方法来做这件事/我做错了什么?

4 个答案:

答案 0 :(得分:2)

我建议您改用HashSet<Character>。您只需add并以简单有效的方式致电contains

答案 1 :(得分:2)

您可以在循环中添加字符,并在添加后不退出循环。就像现在一样,你需要扫描整个数组(因为它没有排序),通过设置标志或存储索引(如果找到)来指示它是否在数组中,如果找不到则将其添加到数组中

就个人而言,我会将猜测中的角色保留在一组中。

答案 2 :(得分:0)

我会使用两个表或数组一个用于猜测的字符本身 和另一个包含256个元素对应实际字符的数组,当播放器选择一个字符时,检查包含256个元素的数组(如果该字母已被选中)但是首先使256个条目字符数组标记所有不在单词中的字母用1作为标志来表示该字母不可用

当他们选择一封信时,确保他们正在挑选一封有效的信件,如果他们选择一个尚未被选中的国旗,那么该国旗应首先为0 您进行测试或放置的索引将从被选择的字母的Ascii值中获得,您是否关注我? 这是一种非常快速的方法来确定已经选择的字母,因为它们中最多只有256个....希望这会有所帮助。

答案 3 :(得分:0)

您可以使用BitSet来存储是否猜到了某个角色。字符的索引(相对于aA)将作为位数组的索引。

这当然是假设26个字符的英文字母。如果您计划本地化您的Hangman游戏,这可能不是最好的方法。

    private BitSet guessedChars = new BitSet(26);

    private boolean checkIfGuessed(char c) {
        return guessedChars.get(charIndex(c));
    }

    private void guess(char c) {
        guessedChars.set(charIndex(c));
    }

    private int charIndex(char c) {
        if (c >= 'a' && c <= 'z') return c - 'a';
        if (c >= 'A' && c <= 'Z') return c - 'A';
        throw new IllegalArgumentException("char is not a letter");
    }