自动生成诗词比赛用九宫格或十二宫格

旁听苏豪兄与惠云师商讨怎样制作诗词比赛用的九宫格时忍不住多嘴了一句——“用程序自动生成很简单啊”,立马就被抓了差,后悔都来不及流泪 

那就先把实现过程表达清楚吧:


将“诗词大赛”文件中的各行存入“诗词大赛”数组
创建Word文档
for i = 0 to ubound(“诗词大赛”)中的每一行
    if 五言
        格子数 = 9
        字数 = 5
    elseif 七言
        格子数 = 12
        字数 = 7
    else
        continue
    按格子数创建“宫格”数组
    for j = 1 to 格子数
        随机取不等于i的行号
        在该行中取一个异于第i行的字存入“宫格”数组
    for j = 1 to 字数
        于[1,格子数]内取不同的随机数,用第j个字取代该位置的字
    把九宫格或十二宫格加入Word文档

刚开始想用Python实现,所以表达方式类Python语言,百度“如何在Word文档中加入表格”,被告知Python在Word操作上不灵光,只好转向vb,也将算法表达风格切换到类vb语言了。

算法就是解题思路、方法,算法就是实现目标的过程、步骤,麦肯锡的金字塔模式用在算法表达上也一样灵光的。其实到目前为止,对“把表格加入文档”还是毫无把握,但这并不妨碍我将这个步骤描述出来,然后再通过百度、谷歌进一步细化。

突然醒悟,掉坑里了!非用word文档不可吗?用网页不也可以?(用网页)是在自己的能力范围内,而且处理起来还方便!

因此修改了对算法的描述(类Python语言):


将“诗词大赛”文件中的各行存入“诗词大赛”列表
创建网页文档
将网页起始代码写入网页文档中 
for 诗句 in “诗词大赛”列表
    if 五言
        格子数 = 9
        “表格”字符串 = 三行三列表格网页代码 
        字数 = 5
    elseif 七言
        格子数 = 12
        “表格”字符串 = 四行三列表格网页代码 
        字数 = 7
    else
        continue
    for i in range(格子数)
        随机取不等于i的行号
        在该行中取一个异于第i行的字加入“宫格”列表
    for i in range(字数)
        于[1,格子数]内取不同的随机数,用第j个字取代该位置的字
    for i in range(格子数)
        用“宫格”列表中第i个字替代掉“表格”字符串中的“Zi”(i=1,2,3,...)
    将“表格”字符串写入网页文档中
将网页结束代码写入网页文档中

调试完程序是难得高兴的事,一言不合,先上代码:

from random import seed, randrange
verse = []
for line in open("poem.txt"):
    verse.append(line[:-1])
vs = ''.join(verse)
sudoku = open("sudoku.html", "w")
sudoku.write('<html><body>')
seed()
for v in verse:
    numberOfWords = len(v)
    if numberOfWords == 5:
        numberOfGrid = 9
        table = '<table border="1" cellspacing="0" cellpadding="1"><tr><td width="100" height="100" align="center" valign="middle"><h1>Z1</h1></td><td width="100" height="100" align="center" valign="middle"><h1>Z2</h1></td><td width="100" height="100" align="center" valign="middle"><h1>Z3</h1></td></tr><tr><td height="100" align="center" valign="middle"><h1>Z4</h1></td><td height="100" align="center" valign="middle"><h1>Z5</h1></td><td height="100" align="center" valign="middle"><h1>Z6</h1></td></tr><tr><td height="100" align="center" valign="middle"><h1>Z7</h1></td><td height="100" align="center" valign="middle"><h1>Z8</h1></td><td height="100" align="center" valign="middle"><h1>Z9</h1></td></tr></table><br><br>'
    elif numberOfWords == 7:
        numberOfGrid = 12
        table = '<table border="1" cellspacing="0" cellpadding="1"><tr><td width="100" height="100" align="center" valign="middle"><h1>Z1</h1></td><td width="100" height="100" align="center" valign="middle"><h1>Z2</h1></td><td width="100" height="100" align="center" valign="middle"><h1>Z3</h1></td></tr><tr><td height="100" align="center" valign="middle"><h1>Z4</h1></td><td height="100" align="center" valign="middle"><h1>Z5</h1></td><td height="100" align="center" valign="middle"><h1>Z6</h1></td></tr><tr><td height="100" align="center" valign="middle"><h1>Z7</h1></td><td height="100" align="center" valign="middle"><h1>Z8</h1></td><td height="100" align="center" valign="middle"><h1>Z9</h1></td></tr><tr><td height="100" align="center" valign="middle"><h1>Z10</h1></td><td height="100" align="center" valign="middle"><h1>Z11</h1></td><td height="100" align="center" valign="middle"><h1>Z12</h1></td></tr></table><br><br>'
    else:
        continue
    grid = []
    for i in range(numberOfGrid):
        while True:
            w = vs[randrange(0, len(vs))]
            if w not in v:
                break
        grid.append(w)
    randomPlace = []
    for i in range(numberOfWords):
        while True:
            place = randrange(0, numberOfGrid)
            if place not in randomPlace:
                break
        randomPlace.append(place)
        grid[place] = v[i]
    for i in range(1, numberOfGrid+1):
        table = table.replace("Z%d" % (numberOfGrid+1-i), grid[numberOfGrid-i])
    sudoku.write(table)
sudoku.write('</body></html>')
sudoku.close()

poem.txt文档内容格式如下:
愿得一人心
白首不相离
身无彩凤双飞翼
心有灵犀一点通
不是花中偏爱菊
此花开尽更无花
床前明月光
疑是地上霜
野旷天低树
江清月近人
明月松间照
清泉石上流

在写代码时,考虑到原算法中先随机抽取某行再从中随机抽取某字的做法可能会抽取不到合适的字,于是改用在所有汉字中随机抽取的方法,结果出现了不少冷僻字,最终还是改回随机抽取poem.txt文档中的字,但不再按行抽取:
w = vs[randrange(0, len(vs))]
语句中的vs是保存了文档中所有字的字符串。

猜你喜欢

转载自blog.csdn.net/qq_37183108/article/details/80775660