利用古诗词做填字游戏是一项很有趣的活动,通常的填字游戏都是由几横几竖构成,如下图:

显然,横竖交叉的位置就是两句诗共有的字。那么,问题来了,如何从众多诗文中找到有共同字的句子呢?

这里Mr. PosPro用Python写了一个小程序,可以生成简单填字游戏(的模型),程序输出的效果如下:

可以看到,程序从全唐诗中找到了3句有共同字的句子,并以合适的位置完成了排列。?和#代表了交叉处的字,同时在屏幕下方给出了最后答案。

下面Mr. PosPro教你如何实现这个程序。程序总体上分为三个部分:

(一)从TXT文件《全唐诗》中提取有用信息,并按照我们需要的格式保存到新文件中

(二)实现一个在DOS窗口的输出程序,以便在指定位置输出特定文字

(三)核心部分,抽取诗句,找到关联的字,确定每一个字的输出位置,并把最后结果交给(二)中实现的程序

本次主要讨论第(一)部分内容,其它部分的实现请参见后续博客。

想要做一个古诗词的填字游戏,首先得收集到足够多的诗句作为原料库。可以在网上搜索“全唐诗TXT“,我选择的版本大概有8.2M,内容如图:

这个版本适合直接阅读,但却不适合用程序处理,所以首先得写一段程序,把这四百多万字的文本文件,转化成我想要形式。对此我是这样设计的:

1>去掉所有无关信息,只保留标题,作者,诗文内容(标点符号也不要)

2>一首诗的所有信息都在一行中表达,从左到右依次为:行号,题目,作者,诗句全文,所有内容Tab隔开。

即,形成如下这个样子

下面就是具体的程序实现了:

1.读入文件

i=3200 # PosPro says:在测试时无需读取全部信息,可以通过此参数调整读入行数,加快测试

with open('全唐诗.txt',encoding='gbk',errors="ignore") as f:

for line in f:

line=line.rstrip().lstrip() #去除左右空白字符

if i>0:

analyzeText(line)

i-=1

else:

break

代码很简单,但有个小技巧可以和大家分享一下:由于文件很大(超过400万字),在测试阶段如果一次性读入的话,会很耗时间。这里用i控制一下读入的行数。毕竟,我们首先要验证的是功能的正确。

2. analyzeText函数在干什么?

仔细分析《全唐诗》的文本,可以发现一个特点,即‘卷’和‘【’同时出现的那一行就是诗文的起始,我们应该以此为标志,将程序分为寻找下一首诗,处理标题,处理诗文等几个阶段,代码如下:(PosPro says: Python的优美之处就在于,程序本身和对程序的解释几乎是一体的,你读懂了代码也就理解了代码。当然,我也会加上足够多的注释的。)

INDEXNUM=0

EMPTYLINE=0

STATEFLAG=0

def analyzeText(line):

global INDEXNUM, EMPTYLINE, STATEFLAG

if line=='':

EMPTYLINE+=1

#PosPro says:构成一个无限循环,只有通过return才能够退出整个函数,读取下一行

while (True):

if STATEFLAG==0:

#0:始状态,在此状态下若发现某一行同时包含'卷'和'【',则进入诗句标题

if ('卷' in line) and ('【' in line):

STATEFLAG=1

else:

return

#1: 表示当前句为标题

if STATEFLAG==1:

INDEXNUM+=1

processTitle(line)

STATEFLAG=2

EMPTYLINE=0

return

#2: 表示正在读取诗文,但需要特别考虑空行和进入下一首诗标题的情况

if STATEFLAG==2:

if EMPTYLINE>2:

processEndPoem()

STATEFLAG=0

EMPTYLINE=0

return

elif ('卷' in line) and ('【' in line):

processEndPoem()

STATEFLAG=1

EMPTYLINE=0

#PosPro says:此处不return,因为该line还需交由状态1处理

else:

processPoemText(line)

return

3. 分而治之,实现对标题、诗文,以及结束的分别处理。三个函数一起给出:

def processTitle(line):

print (str(INDEXNUM), end='\t') #INDEX就是我自己做的诗文索引

idx1=line.find('【')

idx2=line.find('】')

poemTitle=line[idx1+1:idx2]

author=line[idx2+1:]

print(poemTitle,end='\t')

if author.rstrip()=='':

print ('佚名',end='\t') #发现有些诗句没有注明作者,那我就自己标一下

else:

print(author,end='\t')

def processPoemText(line):

#此时已深入到诗句中了,要将各种标点符号删掉,并将每句诗文作为list中的一项

if not line=='':

#如果要以多个不同字符作为分隔符,就必须用

everyLine=re.split(',|。',line)

for l in everyLine:

print (l, end='\t')

def processEndPoem():

print ('') #完成一个换行

4. 等等,不是说要产生一个新文件么?怎么都是在DOS窗口显示的啊?

别急,这就是Python另一个优雅之处了。在命令行敲完文件名之后,加上">1.txt",想输出到哪里就到哪里

附:全部代码如下:

## Created by PosPro

## http://blog.csdn.net/pospro

import re

i=3200 # PosPro says:在测试时无需读取全部信息,可以通过此参数调整读入行数,加快测试

INDEXNUM=0

EMPTYLINE=0

STATEFLAG=0

def processTitle(line):

print (str(INDEXNUM), end='\t') #INDEX就是我自己做的诗文索引

idx1=line.find('【')

idx2=line.find('】')

poemTitle=line[idx1+1:idx2]

author=line[idx2+1:]

print(poemTitle,end='\t')

if author.rstrip()=='':

print ('佚名',end='\t') #发现有些诗句没有注明作者,那我就自己标一下

else:

print(author,end='\t')

def processPoemText(line):

#此时已深入到诗句中了,要将各种标点符号删掉,并将每句诗文作为list中的一项

if not line=='':

#PosPro says:如果要以多个不同字符作为分隔符,就必须用到re模块了

everyLine=re.split(',|。',line)

for l in everyLine:

print (l, end='\t')

def processEndPoem():

print ('') #完成一个换行

def analyzeText(line):

global INDEXNUM, EMPTYLINE, STATEFLAG

if line=='':

EMPTYLINE+=1

#PosPro says:构成一个无限循环,只有通过return才能够退出整个函数,读取下一行

while (True):

if STATEFLAG==0:

#0:始状态,在此状态下若发现某一行同时包含'卷'和'【',则进入诗句标题

if ('卷' in line) and ('【' in line):

STATEFLAG=1

else:

return

#1: 表示当前句为标题

if STATEFLAG==1:

INDEXNUM+=1

processTitle(line)

STATEFLAG=2

EMPTYLINE=0

return

#2: 表示正在读取诗文,但需要特别考虑空行和进入下一首诗标题的情况

if STATEFLAG==2:

if EMPTYLINE>2:

processEndPoem()

STATEFLAG=0

EMPTYLINE=0

return

elif ('卷' in line) and ('【' in line):

processEndPoem()

STATEFLAG=1

EMPTYLINE=0

#PosPro says:此处不return,因为该line还需交由状态1处理

else:

processPoemText(line)

return

with open('全唐诗.txt',encoding='gbk',errors="ignore") as f:

for line in f:

#去除左右空白字符

line=line.rstrip().lstrip()

if i>0:

analyzeText(line)

i-=1

else:

break

python编写古诗_用Python实现古诗词填字游戏(一)相关推荐

  1. python编写代码_用 Python 编写干净、可测试、高质量的代码

    用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...

  2. python编写登录_通过Python编写一个简单登录功能过程解析

    通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...

  3. 用python编写神经网络_用Python实现神经网络(第5周)的代价函数

    基于Coursera的机器学习课程,我试图用python实现神经网络的代价函数.有一个question类似于这个--有一个可接受的答案--但答案中的代码是用八度音阶编写的.为了不偷懒,我已经尝试将答案 ...

  4. unity可以用python编写吗_基于python的Cා代码生成器(用于服务并应用于unity),一个,c,为了,并且,Unity...

    为了满足项目需要,本人需要实现一个c#代码生成器(使用python开发),为此设计了一个语法模板适用于Unity的代码生成器.本次使用了Python的Template模板,使用python开发. ## ...

  5. 怎么用python编写记事本_利用Python开发实现简单的记事本

    利用Python开发实现简单的记事本 最近想对 python 加深学习一下,同时也是想试着做一些东西,所以使用 python, 结合 Tkinter 来做一个简单的跨平台记事本.最终实现的记事本如下, ...

  6. python编写篮球_自制python版篮球经理游戏(1)—准备

    今天突发奇想,打算做一个单击模拟版的篮球经理游戏,主要功能包括随机组队.抽卡.更换阵容和模拟比赛.具体的等想到了再往里添加,目前设计的游戏流程是这样的: 今天就先来完成准备工作. 尽然是模拟抽卡的游戏 ...

  7. python编写篮球_自制python版篮球经理游戏(5)—代码

    游戏已全部完成,虽然和最初的设计有了些许偏差,但完成度达到了90%以上.完整代码在附件里,注释介绍了一些算法逻辑,并未对语句做详细地讲解,不过都是tkinter的一些基本语句,有疑问的地方直接百度即可 ...

  8. python编写我爱你_我爱你Python——情人节快乐

    今天是2月14日,嗯,这是一个单身贵族的节日!从昨晚12点到现在朋友圈,空间一直都在秀. 你说秀就秀吧,我还发现竟然有秀重复的,嗯,你们都懂得!这也太休了吧!!!! 好友们都在秀,我呢?我当然不是一个 ...

  9. 用Python实现古诗词填字游戏(三)

    我们在上上篇博客中准备好了输入,在上一篇中准备好了输出,于是我们来到了最关键和最核心的部分--选出诗句和共同字,同时确定输出位置. 程序的思路很清晰: a. 从输入中读入诗句内容,保存在一个list中 ...

最新文章

  1. cad 怎么显示块句柄_新手必看的CAD小技巧,老师傅精选汇总,三分钟教你学习用处多多...
  2. golang map 排序
  3. 修正本地乱码(待补充)
  4. 【linux下dhcp服务的简单搭建及优化部署】
  5. 读jQuery之二十(Deferred对象)
  6. Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
  7. 43岁被裁员,200万年薪泡汤:这4件事你要尽早明白
  8. linux自学笔记--memcache和varnish缓存服务器
  9. [转贴]原创控件代码共享--日期选择控件
  10. 手机抓直播源工具app_东方卫视 手机在线直播 央视源
  11. Java优秀员工自我评价_年度优秀员工自我评价
  12. 【Arduino】WIN7装不上arduino驱动解决办法
  13. 桌面计算机休眠快捷键,Win7怎么在桌面创建休眠快捷方式|win7休眠快捷键
  14. 了解 InfoPath 2007十大优势
  15. 软件和算法能力对惯导精度的深刻影响
  16. 柿子营养丰富 吃柿子的几点注意
  17. 洛必达法则的一种极简证明
  18. Java接口和包(超详细)
  19. Ubuntu 16.04 源码编译安装 uhd gnuradio
  20. 幼儿园悬浮拼装式地板为增强儿童的想象空间添动力

热门文章

  1. FFmpeg实现音频解码并播放
  2. caret包处理流程
  3. pydicom 安装与使用
  4. excel多组数据散点图生成
  5. 头歌 Java实训答案 全ac代码 请善用目录功能
  6. JAVAphpstudy
  7. mysql定时任务自动备份
  8. iOS 14捏制个性化拟我表情方法教程
  9. 图说slam(一):amcl定位算法主要流程概念图解
  10. deepsort : 牧游 网友提供的思路,用mgn替换reid 的特征检测部分