成语接龙是中华民族传统的文字游戏,它有着悠久的历史,也有广泛的社会基础,是老少皆宜的民间文化娱乐活动!一般聚会时会玩这个游戏做互动,还有就是QQ有一个成语接龙红包,有时会因为自己的成语储备量不够,而接不下去。

那么大家有没有想过自己去实现一个成语接龙的程序呢?接下来,我就用Python来实现一个成语接龙小程序,废话不多说,开始~~~~

成语准备

说到成语接龙,首先就得保证拥有足够多的成语,这个条件就不满足,我没有成语哎,散会~

开玩笑,身为一个Python码农,爬个数据还是没啥子问题的,没有成语不要紧,有办法,
我发现了一个网站:chengyu.t086.com/list/A_1.ht…, 这个网站上有很多的成语及解释啥的,废话不多说,我都给它爬下来。

分析爬取思路:

通过网页抓包,分析出以下特点:每次请求都会发出:http://chengyu.t086.com/list/{A-Z}_{页码}.html这个请求,如下图,是首字母为A的第一页。

解析网页有“下一页”时,循环翻页,例如从 chengyu.t086.com/list/A_1.ht… 翻页至 chengyu.t086.com/list/A_2.ht…, 当解析网页解析不到“下一页”时,就要请求拼音首字母的下一个chengyu.t086.com/list/B_1.ht…, 依次循环下去,直至爬完。

这样就是有两层循环,第一层循环A-Z,第二层循环页码,然后拼成http://chengyu.t086.com/list/{A-Z}_{页码}.html 去请求,没有下一页时,就跳出第二层循环,循环下一个拼音首字母。

如下标记的内容即为成语具体信息的跳转链接,去发请求该链接的话,返回来的是该成语的释意等具体信息。也是我们需要的,需要爬下来。

代码如下:

import requests
from bs4 import BeautifulSoupclass Idiom:def __init__(self):self.num = 0self.url = 'http://chengyu.t086.com/list/{}_{}.html'self.url_info = 'http://chengyu.t086.com/{}'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/81.0.4044.43 Safari/537.36','Referer': 'http://chengyu.t086.com/'}self.all_idiom = {}self.pinyin_initials = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'W', 'X', 'Y', 'Z']def idiom_spider(self):"""爬取所有成语"""idiom_list = []for initial in self.pinyin_initials:page = 1while True:url = self.url.format(initial, page)print(url)start_html = requests.get(url, headers=self.headers)start_html.encoding = 'gb18030'soup = BeautifulSoup(start_html.text, "html.parser")# 查找所有class=listw的divlistw = soup.find('div', class_='listw')a2 = soup.find("div", class_="a2")# 查找所有的a标签lista = listw.find_all('a')lastpage = a2.find_all('a')for p in lista:print("词语", p.text)print((p["href"]))info_url = self.url_info.format(p["href"])print("infourl", info_url)info_html = requests.get(info_url, headers=self.headers)info_html.encoding = 'gb18030'soup = BeautifulSoup(info_html.text, "html.parser")# 查找所有td标签td_list = soup.findAll('td')# 成语释意print("含义:", td_list[5].text)new_idiom = {"idiom": p.text, "paraphrase": td_list[5].text, "first_pinxin":initial}idiom_list.append(new_idiom)if not lastpage or str(lastpage[-1]).find("下一页") == -1:  # 如果没有下一页的超链接标签,breakbreakpage += 1idiom = Idiom()
idiom.idiom_spider()

运行过程图:

可以按照自己的需求把成语存为指定格式,我是把所有成语存到了sqlite3数据库,因为Python就内置了sqlite3数据库,所以,在Python中使用sqlite3,不需要安装任何东西,可以方便直接使用,总共爬取成语30880条,可能不全,但是也够用了。

成语接龙程序

实现原理其实不说,大家也可能已经想到了,就是根据刚才爬取的成语,与指定成语进行字符串首尾条件匹配,如果拼音可以匹配上,就是接龙成功了。

判断拼音是否相同,在Python中有一个第三方库pypinyin,可以使用pip install pypinyin进行安装。 使用下面代码可以获取指定汉字的拼音:

from pypinyin import lazy_pinyinprint(lazy_pinyin("全菜工程师"))

结果为:['quan', 'cai', 'gong', 'cheng', 'shi'],是一个列表。 下面我将成语接龙程序分解:

判断是否为成语

逻辑很简单,就是查询指定字符串是否在爬取的成语库里,在则为成语,不在则不是:

说到查询成语库,刚才爬取的成语我是放在了sqlite3数据库之中,那下面为Python连接sqlite3代码,为了方便使用,提取出来:

import sqlite3def sqlite_conn():try:conn = sqlite3.connect('meta.db')return connexcept Exception as e:print(e)

那么,判断是否为成语的代码如下:

def idiom_exist(user_idiom):"""查询指定成语是否在成语库中:param user_idiom: string:return: bool"""cursor = sqlite_conn().cursor()db_res = cursor.execute("SELECT id, idiom, paraphrase, first_pinxin  from idiom where idiom='{}'".format(user_idiom))for idiom in db_res:if idiom[1]:return Truereturn False

接龙

接龙也很简单,根据用户输入成语,获取该成语尾字拼音首字母,根据拼音首字母查询成语库中符合条件的成语,在判定这些成语的首字拼音是否和用户输入的尾字拼音相同,在符合条件的成语中,随机返回一个即可:

def solitaire(user_idiom):"""返回成语及含义:param user_idiom: 用户输入的成语:return: 返回成语及含义"""cursor = sqlite_conn().cursor()# 如果没有指定需要接龙的成语,则随机挑选一个返回即可if not user_idiom:random_num = random.randint(1, 30880)random_idiom = cursor.execute("SELECT id, idiom, paraphrase, first_pinxin  from idiom where id={}".format(random_num))for idiom in random_idiom:return idiom[1], idiom[2]player = lazy_pinyin(user_idiom)[-1][0].upper()  # 获取玩家输入的最后一个拼音首字母db_idiom = cursor.execute("SELECT id, idiom, paraphrase, first_pinxin  from idiom where first_pinxin='{}'".format(player))chioce_idiom = []  # 可供选择的成语for idiom in db_idiom:if lazy_pinyin(user_idiom)[-1] == lazy_pinyin(idiom[1])[0]:chioce_idiom.append([idiom[1], idiom[2]])if not chioce_idiom:return None, Nonereturn random.choice(chioce_idiom)[0], random.choice(chioce_idiom)[1]

判断用户接龙是否正确

逻辑是先查询用户输入是否为成语,如果是,再判断其是否符合接龙规则,比较简单:

def judge(bot_idiom, user_idiom):if lazy_pinyin(user_idiom)[0] == lazy_pinyin(bot_idiom)[-1]:return Truereturn False

至此,成语接龙核心代码,已经完成,为了交互友好,写了一个交互函数,由于代码篇幅过长,这里只贴截图:

在交互函数中,加入了先后手选择,可以选择先手或者后手,以及记忆集合,用于判断成语是否被重复使用,还加了能接龙10次就成功的机制。

下面展示运行截图:

可以看出,程序可能没有特别完美,单已经很好的实现了预期,对战了几把,由于我的成语储备量不高,统统以失败告终,感兴趣的同学可以试一下,看看你能不能行,哈哈哈。

总结

之前的文章总是以知识点的形式输出,我发现,写多了往往就成了知识点总结,自己看来都没有什么趣味性,提不起阅读兴趣,以后尽量在自己的文章中加入一些趣味性的东西,也算是提升自己的写作能力了,加油!!

身为Python程序员的你,有了这个,再也不怕“成语接龙红包“抢不到了相关推荐

  1. 2021年全国Python程序员薪资曝光,网友:吹的不多.....

    2021年转眼已经过去,在近几个月的榜单中,Python已经走上连续卫冕的道路,并且与Java/PHP的差距拉得更远了一些. 冷静分析多方数据以后,想跟大家说:关于超越老牌霸主Java,过去几年间Py ...

  2. 520 情人节 :属于Python 程序员的脱单攻略大合集(视频版)

    作者| Python 编程时光 责编| Carol 情人节年年有,但今年的 5.20 要比以往的更有意义. 2020.05.20 ,爱你爱你我爱你,如果再卡个时间(13:14),那就是 爱你爱你我爱你 ...

  3. 面试官吐槽:“Python程序员就是不行!”网友:我能把你面哭!

    最近几年,Python莫名火了起来,很多公司都想赶上这"莫名"的热潮,招聘到大牛人才.但是,最近一个HR在社交网站的吐槽又火了: 那么问题来了,市面上为什么鲜有企业满意的优秀的Py ...

  4. Python程序员Debug利器,和Print说再见 | 技术头条

    整理 | Rachel 责编 | Jane 出品 | Python大本营(id:pythonnews) [导语]程序员每日都在和 debug 相伴.新手程序员需要学习的 debug 手段复杂多样,设置 ...

  5. Python 程序员最常犯的十个错误

    常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数.虽然这是一个很好的语言特性,但是当默认值是可变类型时,也会导致一些令人困惑的情 ...

  6. python官方推荐的三本书-一个合格的python程序员,应该从这三本书入手

    pytho官方推荐的三本入门书籍 python是一门新起的老的编程语言,为什么这么说呢?因为在很早就出现了,最初被用于编写自动化脚本,随着版本不断更新,越来越用于独立的大型项目,在17年广泛进入入门的 ...

  7. 学python用什么软件开发-5款Python程序员高频使用开发工具推荐

    很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头.后来工作中深刻体会到,合理使用开发的工具的便利和高效.今天,我就把Python程序员使用 ...

  8. python编程工具p-5款Python程序员高频使用开发工具推荐

    很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头.后来工作中深刻体会到,合理使用开发的工具的便利和高效.今天,我就把Python程序员使用 ...

  9. python开发工具排名-Python程序员必备的四款开发工具

    原标题:Python程序员必备的四款开发工具 每一位Python程序员都会有套工具来应对开发工作上的挑战.多年来,Python程序员使用开发工具来完成他们的工作.有很多工具对他们是有用的,不过对于初入 ...

最新文章

  1. 【独家】深度学习论文阅读路线图
  2. spring boot integrated mybatis three ways!--转
  3. 大数据时代,如何让个人信息不再“裸奔”?
  4. 高并发01_synchronized
  5. 《3》CentOS7.0+OpenStack+kvm云平台部署—配置Glance
  6. ComponentBase.createMetaData and manifest.json oRoute
  7. 2016和2017的区别就是昨晚和今早
  8. Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
  9. webstorm 2017 2016 各个版本 激活破解大全 实测可用
  10. java game nokia 5233 model,诺基亚S60/^3完美运行GBA游戏教程 重回孩提时代
  11. python调用手机蓝牙_python bluetooth蓝牙信息获取蓝牙设备类型的方法
  12. Detours库使用与原理分析
  13. 读书和不读书的人,最大的区别是什么?--林语堂
  14. H5手机端ios的缓存
  15. django-simple-captcha的使用
  16. http请求属性 Accept enctype Content-Type
  17. 揭阳计算机短期培训机构,揭阳市PLC自动化速成班
  18. NATAPP内网穿透工具使用说明
  19. NV12与YV12,YUV的主要格式
  20. python 学生信息管理系统(二)

热门文章

  1. 嵌入式开发每天都做什么?
  2. 广告法禁用词语之ASP替换函数
  3. 微信公众号如何接入Java后台
  4. 人工智能对于IT行业的从业者影响分析报告
  5. ubuntu-14.04 源码安装cntk笔记
  6. 手把手教你搭建视觉检测智能车
  7. python表情符号编码大全_表情符号,当文本文件包含utf8和utf16时进行编码/解码...
  8. 利用GAT(图论分析工具箱)构建并分析大脑结构协变网络学习笔记
  9. 看到后台这么多人私信我说:算法越学越扎心,有没啥破解之法?帅地熬夜撸出了这篇学习心得!...
  10. mit 6.828 lab1_exercise12_讲解