opencv3+python3.5成语填字游戏(三)成语填字游戏解密算法

本篇介绍填字游戏解密算法,本算法尚且存在一些问题,并不适合所有成语填字游戏。

GitHub源代码下载

  • 找到横向四字成语,并返回对应的在方格数组中的位置,还有对应下标
#寻找横向的四字成语方格
def findXFour(mi, i, j):
    if (j+1 == 10 or mi[i][j+1] == '0') and j-1>=0 and mi[i][j-1] != '0':
        return [[mi[i][j-3],mi[i][j-2],mi[i][j-1],mi[i][j]],
                [i,j-3,i,j-2,i,j-1,i,j]]
    elif (j+2 ==10 or (0 if j+2>10 else mi[i][j+2] == '0')) and j-1>=0 and mi[i][j-1] != '0':
        return [[mi[i][j-2],mi[i][j-1],mi[i][j],mi[i][j+1]],
                [i,j-2,i,j-1,i,j,i,j+1]]
    elif (j+3 ==10 or (0 if j+3>10 else mi[i][j+3] == '0')) and j-1>=0 and mi[i][j-1] != '0':
        return [[mi[i][j-1],mi[i][j],mi[i][j+1],mi[i][j+2]],
                [i,j-1,i,j,i,j+1,i,j+2]]
    elif (j+4 ==10 or (0 if j+4>10 else mi[i][j+4] == '0')) and (mi[i][j+1] != '0'):
        return [[mi[i][j],mi[i][j+1],mi[i][j+2],mi[i][j+3]],
                [i,j,i,j+1,i,j+2,i,j+3]]
    else:
        return []
  • 找到纵向四字成语,并返回对应的在方格数组中的位置,还有对应下标
#寻找纵向的四字成语方格
def findYFour(mi, i, j):
    if (i+1==10 or mi[i+1][j] == '0') and i-1>=0 and mi[i-1][j] != '0':
        return [[mi[i-3][j],mi[i-2][j],mi[i-1][j],mi[i][j]],
                [i-3,j,i-2,j,i-1,j,i,j]]
    elif (i+2==10 or (0 if i+2>10 else mi[i+2][j] == '0')) and i-1>=0 and mi[i-1][j] != '0':
        return [[mi[i-2][j],mi[i-1][j],mi[i][j],mi[i+1][j]],
                [i-2,j,i-1,j,i,j,i+1,j]]
    elif (i+3==10 or (0 if i+3>10 else mi[i+3][j] == '0')) and i-1>=0 and mi[i-1][j] != '0':
        return [[mi[i-1][j],mi[i][j],mi[i+1][j],mi[i+2][j]],
                [i-1,j,i,j,i+1,j,i+2,j]]
    elif (i+4==10 or (0 if i+4>10 else mi[i+4][j] == '0')) and (mi[i+1][j] == '0'):
        return [[mi[i][j],mi[i+1][j],mi[i+2][j],mi[i+3][j]],
                [i,j,i+1,j,i+2,j,i+3,j]]
    else:
        return []
  • 将找到的成语答案填入到相应成语方格数组中.
#改变对应方格的原生成成语填字矩阵
def changeMi(res, micopy):
    counts= []
    for j in range(len(chengyus)):
        count = 0
        if res[0][0] == chengyus[j][0]:
            count += 1
        if res[0][1] == chengyus[j][1]:
            count += 1
        if res[0][2] == chengyus[j][2]:
            count += 1
        if res[0][3] == chengyus[j][3]:
            count += 1
        counts.append(count)
    m = counts.index(max(counts))    
    #print(max(counts))
    micopy[res[1][0]][res[1][1]] = chengyus[m][0]
    micopy[res[1][2]][res[1][3]] = chengyus[m][1]
    micopy[res[1][4]][res[1][5]] = chengyus[m][2]
    micopy[res[1][6]][res[1][7]] = chengyus[m][3]
    chengyus.remove([chengyus[m][0],chengyus[m][1],chengyus[m][2],chengyus[m][3]])
  • 判断临时的成语数组中是否存在找到的成语
#判断res此四字成语是否在nodes里面存在    
def isExist(nodes,res):
    for i in range(len(nodes)):
        if(nodes[i][0][0] == res[0][0] and nodes[i][0][1] == res[0][1] 
           and nodes[i][0][2] == res[0][2] and nodes[i][0][3] == res[0][3]):
            return 1
    return 0
  • 得到每一个对应i,j位置的成语,先横向查找,否则纵向查找,如果存在且未替换过则填入答案
#实际的查找成语方格并修改原成语矩阵的函数
def getResult(mi, i,j, nodes, micopy):
    temp = findXFour(mi, i, j)
    res = (len(temp) != 0 and temp or findYFour(mi, i, j))
    
    if(len(res) > 0 and not isExist(nodes, res)):
        nodes.append(res)
        changeMi(res, micopy)
  • 得到所有答案
import copy
#总体的揭解谜函数    
def solve(mi):
    nodes = []
    micopy = copy.deepcopy(mi)  #对象拷贝,深拷贝
    for i in range(len(mi)):
        for j in range(len(mi[i])):
            if(mi[i][j] != '0'):
                getResult(mi, i,j, nodes, micopy)
   # print(nodes)
    return micopy
  • 后台打印得到的成语填字数组:
生成的填字游戏:


[['清', '1', '1', '1', '0', '0', '劳', '1', '1', '高'], 
 ['0', '0', '辨', '0', '0', '0', '0', '0', '0', '1'], 
 ['0', '0', '1', '0', '0', '0', '0', '0', '0', '1'], 
 ['1', '亲', '1', '1', '0', '0', '1', '如', '1', '水'], 
 ['0', '0', '0', '步', '1', '1', '花', '0', '0', '0'], 
 ['0', '0', '0', '1', '0', '0', '1', '0', '0', '0'], 
 ['比', '1', '可', '1', '0', '0', '1', '1', '归', '1'], 
 ['1', '0', '0', '0', '0', '0', '0', '0', '0', '1'], 
 ['1', '0', '0', '0', '0', '0', '0', '0', '0', '水'], 
 ['飞', '1', '1', '火', '0', '0', '1', '起', '1', '秀']]


求解后的填字游戏:


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

推荐阅读更多精彩内容