You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Wordle游戏中重复字母的颜色判定Bug?

修复Wordle游戏重复字母颜色判定问题

当前Wordle游戏存在重复字母颜色判定错误:当秘密单词为brawl(仅含1个字母L)时,玩家猜测hello,两个L都会被标记为黄色,但正确逻辑应为一个L标记黄色,另一个标记灰色。

问题出在play_wordle函数的颜色判定逻辑——原逻辑仅检查字母是否存在于秘密单词中,未考虑字母的出现次数限制。以下是修复方案:

修复思路

  1. 用Counter统计秘密单词中每个字母的出现次数,跟踪剩余可匹配的字母数量
  2. 先遍历一次,标记所有**位置正确(绿色)**的字母,同时减少对应字母的剩余计数
  3. 再遍历一次,处理非绿色的字母:
    • 若字母在剩余计数中存在且计数>0,标记黄色并减少计数
    • 否则标记灰色

修复后的完整代码

from collections import Counter
import sys
from termcolor import colored, cprint
from colorama import Fore, Back, Style
from colored import fg, bg, attr
import time
from random import choice

# 验证玩家输入单词为5个字母且存在于英文词典中的类
class Player():  
    @staticmethod
    def read_content(value):
        with open('words.txt','r') as f:
            contents=f.read()
            if value.lower() in contents:
                return True
            else:
                return False
    
    def check_word(self):
        valid_word=False
        while not valid_word:
            val=input()
            if len(val)>5:
                print("您输入的单词超过5个字母")
                continue
            elif len(val)<5:
                print("您输入的单词不足5个字母")
                continue
            elif len(val)==5 and not self.read_content(val):
                print("您输入的5字母单词不存在于词典中")
            elif len(val)==5 and self.read_content(val):
                return val
                valid_word=True

# 游戏核心类:从文本文件选取随机单词并定义游戏规则
class Wordle():
    def __init__(self):
        self.word=self.today_word()
        
    @staticmethod
    def today_word():
        with open('words.txt','r') as f:
            contents=f.readlines()
        # 修复:去除换行符,避免单词比较时出错
        return choice(contents).strip()
    
    @staticmethod
    def game_rules():
        print("\t您有5次机会猜测今日单词\n")
        print(f"当颜色为{colored('绿色','green',attrs=['bold'])}时,表示字母位置正确\n"
          +f"当颜色为{colored('黄色','yellow',attrs=['bold'])}时,表示字母存在但位置错误\n"
          +f"当颜色为{colored('灰色','grey',attrs=['bold'])}时,表示字母不存在于目标单词中")
        print("请输入您猜测的单词")

def play_wordle(game,player):
    game.game_rules()
    todays_word=game.word
    attempt=1
    while attempt<6:
        player_word=player.check_word()
        # 初始化秘密单词的字母计数
        letter_counts = Counter(todays_word)
        # 第一步:标记绿色字母,并更新计数
        colored_letters = []
        for index, letter in enumerate(player_word):
            if letter == todays_word[index]:
                colored_letters.append(colored(letter.upper(),'red','on_green',attrs=['bold']))
                letter_counts[letter] -= 1
            else:
                colored_letters.append(None)
        
        # 第二步:处理非绿色字母,标记黄色或灰色
        for index, letter in enumerate(player_word):
            if colored_letters[index] is None:
                if letter in letter_counts and letter_counts[letter] > 0:
                    colored_letters[index] = colored(letter.upper(),'red','on_yellow',attrs=['bold'])
                    letter_counts[letter] -= 1
                else:
                    colored_letters[index] = colored(letter.upper(),'red','on_grey',attrs=['bold'])
        
        # 打印结果
        for char in colored_letters:
            print(char, end='  ')
            time.sleep(0.8)
        print()  # 换行
        
        if player_word == todays_word:
            print(f"\n恭喜您猜对了今日单词:{todays_word.upper()} ")
            break
        attempt +=1
        
    if attempt >=6 and player_word != todays_word:
        print(f"\n很遗憾您未猜对,今日单词是:{todays_word.upper()}")

关键修改点

  • 新增letter_counts = Counter(todays_word)统计字母出现次数
  • 分两次遍历:先处理绿色匹配,更新剩余计数;再处理黄色/灰色匹配,严格遵循剩余计数限制
  • 修复today_word函数:添加.strip()去除换行符,避免单词比较时因隐藏换行符导致的错误

内容的提问来源于stack exchange,提问作者Zakaria Ait Yakoub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:15:50