我正在尝试在 java 中制作一个 wordle 克隆,但重复的字母不会以正确的颜色显示(当它们应该以红色显示时以黄色显示)[复制]

I'm trying to make a wordle clone in java but duplicate letters wont display in the right color (display in yellow when they should display in red) [duplicate]

提问人:John Heck 提问时间:11/9/2023 最后编辑:Idle_MindJohn Heck 更新时间:11/10/2023 访问量:70

问:

do {
    userInput = input.nextLine().toUpperCase(); // Convert input to uppercase to match secretWord's case

    if (userInput.length() > 5) {
        System.out.println("Invalid Guess, word is too long");
    } else if (userInput.length() < 5) {
        System.out.println("Invalid Guess, word is too short");
    } else {
        for (int i = 0; i < 5; i++) {
            String userChar = userInput.substring(i, i + 1);
            String secretChar = secretWord.substring(i, i + 1); 

            if (userChar.equals(secretChar)) {
                System.out.print(GREEN + userChar + RESET);
            } else if (secretWord.contains(userChar)) {
                System.out.print(YELLOW + userChar + RESET);
            } else {
                System.out.print(RED + userChar + RESET);
            }
        }

        System.out.println();

        if (userInput.equals(secretWord)) {
            correct = true;
        }

        guessCounter++;
    }
} while (guessCounter < maxGuess && !correct);

程序首先从单词数组中选择一个单词。假设从数组中选择的单词是 Brain,如果用户输入 iiiii,它将以黄色显示前 3 个,以绿色显示第 4 个,以黄色显示第 5 个。我需要它以红色显示除第 4 个字母之外的所有字母,以表明这些字母不在单词中。

我尝试获取 userChar 的索引并将其与 secretChar 的索引进行比较,这会导致同样的事情发生。有没有办法使用secretWord.contains(userChar)之类的东西来确定它应该是红色的?任何帮助将不胜感激!

java 数组 字符串 字符 wordle-game

评论


答:

0赞 shmosel 11/9/2023 #1

标记黄色字母时,您需要跟踪哪些字母已经“声明”为黄色或绿色。一种方法是保留可用字符的列表(或多集),并在声明字母时将其清空。您还必须仔细检查您没有提前偷果岭。我认为最简单的方法是将单词运行两次,首先声明绿色字母,然后再次打印:

List<Character> available = IntStream.range(0, 5)
        .filter(i -> secretWord.charAt(i) != userInput.charAt(i))
        .mapToObj(secretWord::charAt)
        .collect(Collectors.toCollection(ArrayList::new));

for (int i = 0; i < 5; i++) {
    char userChar = userInput.charAt(i);
    char secretChar = secretWord.charAt(i);

    if (userChar == secretChar) {
        System.out.print(GREEN + userChar + RESET);
    } else if (available.remove((Character)userChar)) {
        System.out.print(YELLOW + userChar + RESET);        
    } else {
        System.out.print(RED + userChar + RESET);
    }

    ...

评论

1赞 Holger 11/9/2023
我认为,重载方法的问题太微妙了,无法掩盖它并默默地使用而不是.OP(和其他所有读者)应该知道为什么这样写。考虑到你现在在不知道是否需要打电话之前就开始装箱和拆箱了,我会声明 as 并用它来表示拳击的用途。removeCharactercharremoveuserCharcharavailable.remove((Object)userChar)
0赞 shmosel 11/10/2023
@Holger是的,我对此提出了质疑。将更新。
0赞 Reilas 11/9/2023 #2

我不熟悉 Wordle,所以这可能有些不正确。

"...如果用户输入 iiiii,它将以黄色显示前 3 个,以绿色显示第 4 个,以黄色显示第 5 个。我需要它以红色显示除第 4 个字母之外的所有字母,以表明这些字母不在单词中。..."

利用为单词着色。

这是维基百科上关于SGR控制序列的文章。
Wikipedia – SGR(选择图形演绎版)参数

class Word {
    String s;
    Set<Character> set = new LinkedHashSet<>();
    static String red = "\033[31m", yellow = "\033[33m", reset = "\033[0m";

    Word(String s) {
        this.s = s;
    }

    void guess(char c) {
        set.add(c);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (char c : s.toCharArray()) {
            sb.append(set.contains(c) ? yellow : red);
            sb.append(c).append(reset);
        }
        return sb.toString();
    }
}

而且,下面是一个用法示例。

Word w = new Word("Brain");
System.out.println(w);
w.guess('i');
System.out.println(w);