美文网首页
opencv3+python3.5成语填字游戏(三)成语填字游戏

opencv3+python3.5成语填字游戏(三)成语填字游戏

作者: mler801 | 来源:发表于2018-05-22 13:36 被阅读0次

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

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

相关文章

  • opencv3+python3.5成语填字游戏(三)成语填字游戏

    本篇介绍填字游戏解密算法,本算法尚且存在一些问题,并不适合所有成语填字游戏。 GitHub源代码下载 找到横向四字...

  • opencv3+python3.5成语填字游戏(一)印刷体汉字的

    首先这是一个成语填字游戏,大概就是一张成语填字游戏图片,通过opencv图像识别后转为矩阵,再通过解算法,解出答案...

  • 成语消消消技术支持

    成语消消消是一款休闲益智的成语填字游戏。游戏玩法简单,点击汉字并组成正确的4字成语,即可通过关卡,游戏趣味性极强,...

  • 成语填字接龙技术支持

    成语填字接龙是一款休闲益智的成语填字游戏。游戏玩法简单,点击汉字并组成正确的4字成语,即可通过关卡,游戏趣味性极强...

  • 成语填字游戏必备工具

    自己做的微信小程序,成言词典,需要的自行扫码或者搜索 支持单字,双字,三字,整词查询,包括成语释义及出处

  • 写对联像填字游戏,轻松又有趣,你也可以玩

    曾小云(跟曾老师同步写征联训练营讲师) 小时候玩过许多填字游戏,比如填写成语、诗词、人名、地名等等,可以让我们玩中...

  • opencv3+python3.5成语填字游戏(二)填字图片汉字

    GitHub源代码 上一篇说的是汉字的分割。今天该实际填字图片的解析了。实际图片如下: 这是一个10*10的方格,...

  • python实现成语填字游戏 自动生成题目

    开心!先来个成果图记录一下,之前一直觉得很神奇,自动生成题目的算法是怎样的,好奇着好奇着就去试试,其实好像也不涉及...

  • 2018-01-30

    正在做的事:填字游戏 bug解决:同向挨着的单词 比如stop和inside两个挨着了,在填字游戏中造成了障碍。 ...

  • 填字游戏

    你把文字填进饱满的方格每一场意外都是注定每一次发现都是巧合 我走不出一张纸也填不满所有的方格只能看着拼出的词汇没脚...

网友评论

      本文标题:opencv3+python3.5成语填字游戏(三)成语填字游戏

      本文链接:https://www.haomeiwen.com/subject/jcmhjftx.html