信件位置,找出一个单词猜测游戏的聪明方式

时间:2011-12-31 17:05:07

标签: java

我正在学习Java,在这个过程中我正在编写一个Word猜猜游戏。 现在我的问题如下:

假设猜词是“行话”。并假设“oodle”是你建议的一个词。 在处理您的猜测时,应输出以下内容: 正确的信件:没有 错误的位置字母:第一个位置的“o”,第四个位置的“l” 请注意,第二个“o”不应该作为错误位置的字母提及,因为我们之前已经报告过“o”。因此,如果您输入'ooooo',则只有最后一个字母应突出显示,因为它位于正确的位置,如果您输入'ooooz',则只应突出显示第一个字母,而不突出显示另一个字母。

我尝试了一些解决方案,但似乎都失败了。我知道有一种聪明/不那么复杂的方法可以做到这一点。所以有人可以帮助我吗?

代码:

// / Indicates whether a letter has been accounted for
// / while highlighting letters in the guess that are not
// / in the correct position
private Boolean[][] marked = new Boolean[WordLength][5];

// / Holds which all letters have been solved so far
private Boolean[][] solved = new Boolean[WordLength][6];


public void CheckLetters() {

    for (int j = 0; j < currentAttempt; j++) {
        tempWord = list.get(j); //The guessed words

        for (int i = 0; i < WordLength; i++) {

            if (tempWord.charAt(i) == CurrentPuzzleWord.charAt(i)) {
                solved[i][j] = true; //CurrentPuzzleWord is the string with the hidden word

            } else if (CurrentPuzzleWord.indexOf(tempWord.charAt(i)) != -1) {
                marked[i][j] = true;
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

所以你打算做多次检查。

String oracle = "lingo";
String input = "oodle";
String modOracle = "";
// ArrayList for noting the matched elements
ArrayList<Integer> match = new ArrayList<Integer>();
// ArrayList for the correct letters with wrong position
ArrayList<Integer> close = new ArrayList<Integer>();
// Length of the Strings of interest
int length = oracle.length;

显然,您要检查的第一件事是用于匹配且位置正确的字母。因此,请使用oracle字符串和用户输入字符串,逐个字符地比较它们,注意那些正确的字符串。

// may need to check that oracle and input are same length if this isn't enforced.
for (int i = 0; i < length; i++) {
    if (input.substring(i,i+1).equals(oracle.substring(i,i+1))) {
        // there is a match of letter and position
        match.add(i);
    }
    else
        modOracle = modOracle + oracle.substring(i,i+1);
}

然后,您需要对正确但位置错误的字母进行第二次检查。要做到这一点,首先从正在运行的检查中取出正确的字母。然后,对于输入字符串中与oracle字符串中的字母匹配的每个字母,请记下匹配项并将其从其余检查中删除。继续此操作,直到查看整个输入字符串。

for (int i = 0; i < length; i++) {
    if (match.contains(i))
        continue;

    // String to match
    String toMatch = input.substring(i,i+1);

    for (int j = 0; j < modOracle.length; j++) {
        if (toMatch.equals(modOracle.substring(j,j+1))) {
            close.add(i);
            // then remove this letter from modOracle
            // need small utility method for this.
            break;
        }
    }
}

合并两个检查的结果并将其输出给用户。

我不确定您希望如何向用户显示结果,但您现在拥有arraylist match,它对应于oracle / input中完全正确的位置和arraylist close这对应于oracle / input中的位置,使得该字母出现在某处,但不在该位置。