Java实现Wordle克隆:重复字母颜色显示异常(红/黄混淆)求助
问题解决:Wordle克隆重复字母颜色错误
你的核心问题是只靠secretWord.contains(userChar)判断黄色,完全没考虑目标词中该字符的剩余可用数量。比如目标词Brain只有1个I,用户输入多个I时,除了正确位置的那个,其他I应该标红色——因为没有多余的I可以匹配了。
解决方案思路
分两轮处理字符,结合字符频率统计:
- 第一轮:先标记所有位置正确的绿色字符,同时减少对应字符在目标词中的剩余可用次数。
- 第二轮:处理非绿色字符,若该字符在目标词中还有剩余可用次数,标黄色并再次减少次数;否则直接标红色。
修改后的完整代码
do { userInput = input.nextLine().toUpperCase(); // 转大写匹配目标词的大小写 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 { // 统计目标词中每个A-Z字符的出现次数 int[] charCount = new int[26]; for (int i = 0; i < secretWord.length(); i++) { char c = secretWord.charAt(i); charCount[c - 'A']++; } // 第一轮:标记绿色匹配,更新剩余可用次数 char[] resultFlags = new char[5]; for (int i = 0; i < 5; i++) { char userChar = userInput.charAt(i); char secretChar = secretWord.charAt(i); if (userChar == secretChar) { resultFlags[i] = 'G'; // G代表绿色匹配 charCount[userChar - 'A']--; // 已匹配,减少可用次数 } else { resultFlags[i] = 'U'; // U代表未处理 } } // 第二轮:处理黄色/红色字符 for (int i = 0; i < 5; i++) { if (resultFlags[i] == 'G') { System.out.print(GREEN + userInput.charAt(i) + RESET); continue; } char userChar = userInput.charAt(i); if (charCount[userChar - 'A'] > 0) { System.out.print(YELLOW + userInput.charAt(i) + RESET); charCount[userChar - 'A']--; // 消耗一次匹配机会 } else { System.out.print(RED + userInput.charAt(i) + RESET); } } System.out.println(); if (userInput.equals(secretWord)) { correct = true; } guessCounter++; } } while (guessCounter < maxGuess && !correct);
关键逻辑说明
- 字符频率统计:用
charCount数组记录目标词中每个字母的出现次数,比如Brain中的I对应charCount['I'-'A']初始值为1。 - 绿色优先处理:先处理位置正确的字符,确保这些匹配优先占用字符的可用次数,避免后续重复字符错误地被标为黄色。
- 剩余次数判断:第二轮处理时,只有当字符还有剩余可用次数时才标黄色,否则直接标红色,完美解决重复字母的颜色错误问题。
比如测试场景:目标词Brain,用户输入iiiii,第一轮会把第4个I标为绿色,同时charCount['I'-'A']减为0;第二轮处理其他I时,因为剩余次数为0,所以全部标红色,符合预期。
内容的提问来源于stack exchange,提问作者John Heck
相关产品推荐
相关产品推荐

