提问人:John Heck 提问时间:11/9/2023 最后编辑:Idle_MindJohn Heck 更新时间:11/10/2023 访问量:70
我正在尝试在 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]
问:
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)之类的东西来确定它应该是红色的?任何帮助将不胜感激!
答:
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 并用它来表示拳击的用途。remove
Character
char
remove
userChar
char
available.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);
评论