利用Python破解猜字游戏Wordle

游戏链接:https://www.powerlanguage.co.uk/wordle/

年前同学给我安利了一款猜字游戏,该游戏每天会指定5位字母单词谜底,玩家有6次机会猜中这个单词。如果字母在谜底中出现且位置对了就显示绿色,字母出现了但位置不对就显示黄色,字母在答案的单词中没出现就显示灰色。


image.png

我属于人菜瘾大,单词量本就薄弱,被这些生僻单词折磨的死去活来,我是怒了,反正玩不起就耍流氓,天下武功唯穷举不破,用代码暴力破解吧。

一、代码思路

1、找到一份英文单词词库,我把词库分享到网盘。
链接:https://pan.baidu.com/s/1lvHw28i9NMxtXuEJkFP3YQ
提取码:6666
2、对词库进行预处理,删除有标点符号的单词、统一单词的大小写。
3、依次猜词:每次猜词时尽量保证选择的单词的字母是不重复的,这样能保证最大化试错概率;每次猜词根据反馈的颜色缩小单词词库,然后每次从词库中随机选择单词,选择的原则还是从重复单词数少的单词组中选择一个。此外,尽可能选择有元音的单词,这样命中率会高些。

代码如下:

## 后面根据猜中情况筛选:orange、black、green    
def apd_col(color_lst,char,location=0):
    color_lst.append([char,location-1])
    return color_lst
        
def select_word_lst(word_lst,org_lst,blk_lst,grn_lst):
    next_word_lst = []
    for word in word_lst:
        org_mark,blk_mark,grn_mark=1,0,1
        ## 黑名单筛选
        for blk_word in blk_lst:
            if word.find(blk_word[0])>=0:
                blk_mark=1
        #绿名单圈选        
        for grn_word in grn_lst:
            if word[grn_word[1]]!=grn_word[0]:
                grn_mark=0
        #黄名单圈选        
        for org_word in org_lst:
            if word[org_word[1]]==org_word[0] or word.find(org_word[0])==-1:
                org_mark=0        
                
        if blk_mark==0 and grn_mark==1 and org_mark==1:
            next_word_lst.append(word)
    return next_word_lst 

if __name__=="__main__":
    import os 
    import random
    os.chdir(r"C:\Users\bingo\Desktop\wordle")
    
    # 读取单词库
    word_lst=[]
    for line in open("data/dic.txt",encoding="utf-8"):
        word=line.split("\uf8f5")[0]
        if len(word.strip())==5 and word.find("-")<0:
            word = word.lower()
            word_lst.append(word)
            
    ## 第一轮 初始化英文字母:包含元音aeiou、尽可能出现所有字母
    init_lst=[]
    for word in word_lst:
        word=word.lower()
        if (word.find("a")>=0 or word.find("e")>=0 or word.find("i")>=0 or word.find("o")>=0 or word.find("u")>=0) and len(set(word))==5 and word.find("-")<0:
            init_lst.append(word)

    init_word = init_lst[random.randrange(len(init_lst))]
    print(init_word)
    
    #第二轮
    org_lst,blk_lst,grn_lst=[],[],[] #初始化
    
    
    
    blk_lst=apd_col(blk_lst,"p",-1)
    blk_lst=apd_col(blk_lst,"a",-1)
    blk_lst=apd_col(blk_lst,"s",-1)
    blk_lst=apd_col(blk_lst,"t",-1)
    blk_lst=apd_col(blk_lst,"e",-1)
    
    grn_lst=apd_col(grn_lst,"e",2)
    word_lst_2 = select_word_lst(word_lst,org_lst,blk_lst,grn_lst)
    #初始两轮尽可能多的选出词汇

    #第三轮
    org_lst=apd_col(org_lst,"o",1)
    org_lst=apd_col(org_lst,"c",3)
    
    blk_lst=apd_col(blk_lst,"r",1)
    blk_lst=apd_col(blk_lst,"i",4)
    blk_lst=apd_col(blk_lst,"n",5)
    word_lst_3 = select_word_lst(word_lst_2,org_lst,blk_lst,grn_lst)

二、改进空间

1、交互做的很垃圾,每次都是在手机里猜单词,然后在电脑上根据反馈结果输入到单词组中,不过我是不想改了,代码能用就行。
2、猜中的单词轮数略多,平均要四-五轮,我看网上有人能做到三轮,我感觉深深的惭愧,这道题就是极大似然概率知识点的典型应用,话说用上算法得多花半天时间,我是没有折腾的劲了,有缘人看到可以尝试下。思路就是每个单词之间是有一定相关概率,每次猜词时可以根据反馈的情况,选择词库中单词中出现概率最高的即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容