python编写古诗_用Python实现古诗词填字游戏(一)
利用古诗词做填字游戏是一项很有趣的活动,通常的填字游戏都是由几横几竖构成,如下图:
显然,横竖交叉的位置就是两句诗共有的字。那么,问题来了,如何从众多诗文中找到有共同字的句子呢?
这里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实现古诗词填字游戏(一)相关推荐
- python编写代码_用 Python 编写干净、可测试、高质量的代码
用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...
- python编写登录_通过Python编写一个简单登录功能过程解析
通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...
- 用python编写神经网络_用Python实现神经网络(第5周)的代价函数
基于Coursera的机器学习课程,我试图用python实现神经网络的代价函数.有一个question类似于这个--有一个可接受的答案--但答案中的代码是用八度音阶编写的.为了不偷懒,我已经尝试将答案 ...
- unity可以用python编写吗_基于python的Cා代码生成器(用于服务并应用于unity),一个,c,为了,并且,Unity...
为了满足项目需要,本人需要实现一个c#代码生成器(使用python开发),为此设计了一个语法模板适用于Unity的代码生成器.本次使用了Python的Template模板,使用python开发. ## ...
- 怎么用python编写记事本_利用Python开发实现简单的记事本
利用Python开发实现简单的记事本 最近想对 python 加深学习一下,同时也是想试着做一些东西,所以使用 python, 结合 Tkinter 来做一个简单的跨平台记事本.最终实现的记事本如下, ...
- python编写篮球_自制python版篮球经理游戏(1)—准备
今天突发奇想,打算做一个单击模拟版的篮球经理游戏,主要功能包括随机组队.抽卡.更换阵容和模拟比赛.具体的等想到了再往里添加,目前设计的游戏流程是这样的: 今天就先来完成准备工作. 尽然是模拟抽卡的游戏 ...
- python编写篮球_自制python版篮球经理游戏(5)—代码
游戏已全部完成,虽然和最初的设计有了些许偏差,但完成度达到了90%以上.完整代码在附件里,注释介绍了一些算法逻辑,并未对语句做详细地讲解,不过都是tkinter的一些基本语句,有疑问的地方直接百度即可 ...
- python编写我爱你_我爱你Python——情人节快乐
今天是2月14日,嗯,这是一个单身贵族的节日!从昨晚12点到现在朋友圈,空间一直都在秀. 你说秀就秀吧,我还发现竟然有秀重复的,嗯,你们都懂得!这也太休了吧!!!! 好友们都在秀,我呢?我当然不是一个 ...
- 用Python实现古诗词填字游戏(三)
我们在上上篇博客中准备好了输入,在上一篇中准备好了输出,于是我们来到了最关键和最核心的部分--选出诗句和共同字,同时确定输出位置. 程序的思路很清晰: a. 从输入中读入诗句内容,保存在一个list中 ...
最新文章
- cad 怎么显示块句柄_新手必看的CAD小技巧,老师傅精选汇总,三分钟教你学习用处多多...
- golang map 排序
- 修正本地乱码(待补充)
- 【linux下dhcp服务的简单搭建及优化部署】
- 读jQuery之二十(Deferred对象)
- Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!
- 43岁被裁员,200万年薪泡汤:这4件事你要尽早明白
- linux自学笔记--memcache和varnish缓存服务器
- [转贴]原创控件代码共享--日期选择控件
- 手机抓直播源工具app_东方卫视 手机在线直播 央视源
- Java优秀员工自我评价_年度优秀员工自我评价
- 【Arduino】WIN7装不上arduino驱动解决办法
- 桌面计算机休眠快捷键,Win7怎么在桌面创建休眠快捷方式|win7休眠快捷键
- 了解 InfoPath 2007十大优势
- 软件和算法能力对惯导精度的深刻影响
- 柿子营养丰富 吃柿子的几点注意
- 洛必达法则的一种极简证明
- Java接口和包(超详细)
- Ubuntu 16.04 源码编译安装 uhd gnuradio
- 幼儿园悬浮拼装式地板为增强儿童的想象空间添动力