首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我用 Python 自制成语接龙小游戏,刺激!

我用 Python 自制成语接龙小游戏,刺激!

作者头像
杰哥的IT之旅
发布于 2021-09-27 02:11:13
发布于 2021-09-27 02:11:13
78700
代码可运行
举报
文章被收录于专栏:GitHub专栏GitHub专栏
运行总次数:0
代码可运行

作者:小小明 原文链接: https://blog.csdn.net/as604049322/article/details/118154687 本文为读者投稿

在 https://github.com/pwxcoo/chinese-xinhua 项目中可以下载到中华成语的语料库,该项目收录包括 14032 条歇后语,16142 个汉字,264434 个词语,31648 个成语。

结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chinese-xinhua/
|
+- data/ <-- 数据文件夹
|  |
|  +- idiom.json <-- 成语
|  |
|  +- word.json <-- 汉字
|  |
|  +- xiehouyu.json <-- 歇后语
|  |
|  +- ci.json <-- 词语

可以直接从网络读取该github的json文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd

chengyu = pd.read_json(
    "https://github.com/pwxcoo/chinese-xinhua/blob/master/data/idiom.json?raw=true")

不过有可能网络不佳导致读取失败,下载好之后读取本地文件更佳:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np

chengyu = pd.read_json("idiom.json")
chengyu.head(2)

该库有很多列,word列是我们需要的成语,pinyin列已经帮我们转换出了对应的拼音。下面我们整理出我们需要的数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
t = chengyu.pinyin.str.split()
chengyu["shoupin"] = t.str[0]
chengyu["weipin"] = t.str[-1]
chengyu = chengyu.set_index("word")[["shoupin", "weipin"]]
chengyu

测试获取任意一个成语的接龙结果集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
word = "阿党比周"

words = chengyu.index[chengyu.shoupin == chengyu.loc[word, "weipin"]]
words

Index(['舟车劳顿', '舟水之喻', '舟中敌国', '诌上抑下', '侜张为幻', '周而不比', '周而复始', '周公吐哺', '周规折矩',
       '周急继乏', '周郎顾曲', '周情孔思', '周穷恤匮', '周游列国', '诪张变眩', '诪张为幻', '粥少僧多', '粥粥无能'],
      dtype='object', name='word')

然后随机任取一个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.choice(words)
'诪张为幻'

测试没有问题,我们可以写一个批量接龙程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
word = input("请输入一个成语:")
flag = True
if word not in chengyu.index:
    print("你输入的不是一个成语,程序结束!")
    flag = False
while flag:
    n = input("接龙的次数(1-100次的整数,输入任意字母表示结束程序)")
    if not n.isdigit():
        print("程序结束")
        break
    n = int(n)
    if not (0 < n <= 100):
        print("非法数字,程序结束")
        break
    for _ in range(n):
        words = chengyu.index[chengyu.shoupin == chengyu.loc[word, "weipin"]]
        if words.shape[0] == 0:
            print("没有找到可以接龙的成语,程序结束")
            flag = False
            break
        word = np.random.choice(words)
        print(word)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
请输入一个成语:周郎顾曲
接下来程序自动接龙的次数(1-100次的整数,其他情况表示结束)10
曲尽奇妙
妙趣横生
声应气求
求人不如求己
掎挈伺诈
诈痴不颠
颠乾倒坤
昆山之玉
玉叶金枝
织当访婢
接下来程序自动接龙的次数(1-100次的整数,其他情况表示结束)no
结束

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np

chengyu = pd.read_json("idiom.json")
t = chengyu.pinyin.str.split()
chengyu["shoupin"] = t.str[0]
chengyu["weipin"] = t.str[-1]
chengyu = chengyu.set_index("word")[["shoupin", "weipin"]]

word = input("请输入一个成语:")
flag = True
if word not in chengyu.index:
    print("你输入的不是一个成语,程序结束!")
    flag = False
while flag:
    n = input("接龙的次数(1-100次的整数,输入任意字母表示结束程序)")
    if not n.isdigit():
        print("程序结束")
        break
    n = int(n)
    if not (0 < n <= 100):
        print("非法数字,程序结束")
        break
    for _ in range(n):
        words = chengyu.index[chengyu.shoupin == chengyu.loc[word, "weipin"]]
        if words.shape[0] == 0:
            print("没有找到可以接龙的成语,程序结束")
            flag = False
            break
        word = np.random.choice(words)
        print(word)

我们还可以写一个与机器对战的成语接龙小游戏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np

chengyu = pd.read_json("idiom.json")
t = chengyu.pinyin.str.split()
chengyu["shoupin"] = t.str[0]
chengyu["weipin"] = t.str[-1]
chengyu = chengyu.set_index("word")[["shoupin", "weipin"]]

is_head = input("是否先手(输入N表示后手,其他表示先手)")
if is_head == "N":
    word2 = np.random.choice(chengyu.index)
    print(word2)
    weipin = chengyu.loc[word2, "weipin"]
else:
    weipin = ''
while True:
    word = input("请输入一个成语(认输或离开请按Q):")
    if word == "Q":
        print("你离开了游戏,再见!!!")
        break
    if word not in chengyu.index:
        print("你输入的不是一个成语,请重新输入!")
        continue
    if weipin and chengyu.loc[word, 'shoupin'] != weipin:
        print("你输入的成语并不能与机器人出的成语接上来,你输了,游戏结束!!!")
        break
    words = chengyu.index[chengyu.shoupin == chengyu.loc[word, "weipin"]]
    if words.shape[0] == 0:
        print("恭喜你赢了!成语机器人已经被你打败!!!")
        break
    word2 = np.random.choice(words)
    print(word2)
    weipin = chengyu.loc[word2, "weipin"]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
是否先手(输入N表示后手,其他表示先手)
请输入一个成语(认输或离开请按Q):妙趣横生
生米煮成熟饭
请输入一个成语(认输或离开请按Q):饭来开口
口呆目钝
请输入一个成语(认输或离开请按Q):遁名匿迹
计功谋利

由于成语积累量较少,几局就已经快玩不下去,于是我打算再写个成语查询器方便开挂后再上,而不是疯狂的百度,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from gooey import Gooey, GooeyParser
import pandas as pd

chengyu = pd.read_json("idiom.json")
t = chengyu.pinyin.str.split()
chengyu["shoupin"] = t.str[0]
chengyu["weipin"] = t.str[-1]
chengyu = chengyu.set_index("word")[["shoupin", "weipin"]]


@Gooey
def main():
    parser = GooeyParser(description="成语接龙查询器 - @小小明")
    parser.add_argument('word', help="被查询的成语")
    args = parser.parse_args()
    word = args.word
    if word not in chengyu.index:
        print("你输入的不是一个成语,请重新输入!")
    else:
        words = chengyu.index[chengyu.shoupin == chengyu.loc[word, "weipin"]]
        if words.shape[0] > 0:
            print("满足条件的成语有:")
            print("、".join(words))
        else:
            print("抱歉,没有找到能够满足条件的成语")
        print("-----" * 10)


if __name__ == '__main__':
    main()

这里我使用了Gooey,需要pip安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install Gooey

项目地址:https://github.com/chriskiehl/Gooey

体验一把:

点击start后:

要重新开始查询只需点击Edit按钮即可。Gooey支持的组件还挺多的,可以参考GitHub项目说明。虽然Gooey远不如专业的图形化框架专业,但对于简单的需求也挺简单便捷,能快速把命令行程序转换为图形化程序。

参考

《文本数据挖掘——基于R语言》黄天元

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杰哥的IT之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
SAP EWM学习笔记之某个交货单创建后未能进入EWM,在inbound queue里面又被人误删除了,该如何处理?
SAP EWM学习笔记之某个交货单创建后未能进入EWM,在inbound queue里面又被人误删除了,该如何处理?
SAP虾客
2025/05/25
1140
SAP EWM学习笔记之SMQ2处理未能传入EWM系统的内向交货单
在SAP项目实践中,如果我们发现SAP ERP里的某个Inbound delivery创建后未能如预期传入SAP EWM系统,可以执行事务代码SMQ2, 看这个INBOUND DELIVERY 是否在队列里面。
SAP虾客
2025/05/25
1060
SAP EWM学习笔记之EWM系统对于INBOUND DELIVERY如何确定暂存区(Staging Area)?
那SAP EWM系统是如何在Inbound Delivery产生的时候自动确定这个Staging Area?
SAP虾客
2025/05/26
570
SAP EWM学习笔记之EWM系统对于OUTBOUND DELIVERY如何确定集货区(Staging Area)?
事务代码:/SCWM/STADET_OUT – Staging Area and Door Determination(Outbound),
SAP虾客
2025/05/26
730
SAP EWM 学习笔记之如何使得EWM里面的内向交货单与S4里面的内向交货单号码相同?
会使得EWM里的Inbound Delivery号码跟S4里面的INBOUND DELIVERY号码相同。
SAP虾客
2025/05/26
510
SAP EWM学习笔记之EWM里面的INBOUND DELIVERY
SAP虾客
2025/05/26
710
SAP EWM初阶之Inbound Delivery的PPF Action
SAP EWM(Extended Warehouse Management)是一个强大的仓库管理系统,它提供了一系列的工具和功能,以支持复杂的仓储操作和供应链执行。随着业务需求的多样化和复杂化,对EWM系统中业务流程的监控与控制提出了更高的要求。为了解决这些问题,SAP引入了PPF(Process Control Framework,流程控制框架),它是一种灵活、可配置的架构,用于管理和监控SAP EWM中的业务流程。
SAP虾客
2025/06/08
650
SAP EWM学习笔记之WM仓库号和EWM仓库号的LINK
在后台配置里,这个三位字符的仓库号与Plant + Storage Location组合关联,
SAP虾客
2025/05/21
670
SAP EWM初阶之通过定义Storage Bin Structure的方式批量创建Storage BIN
然后在前台以事务代码/SCWM/LS10去批量创建Storage Bin Master.
SAP虾客
2025/06/08
830
SAP EWM初阶之批量上传STORAGE BIN主数据
事务代码/SCWM/SBUP可以通过上传文件的方式批量创建storage bin 主数据,
SAP虾客
2025/06/08
340
SAP MM 关于事务代码VL04的一个测试 II
=====================================================
SAP虾客
2022/08/17
2750
SAP MM 事务代码VL04为STO创建外向交货单
在SAP MM模块的流程中,公司间STO或者公司内STO都是非常常见的流程。在这些流程里,笔者习惯于使用事务代码VL10B去为STO单据创建外向交货单。
SAP虾客
2022/07/25
6250
SAP顾问初阶之事务代码SMQ2
事务代码SMQ2用于查询通过RFC与外部系统接口的RFC的日志信息。执行事务代码SMQ2,进入如下界面,
SAP虾客
2025/05/01
550
SAP MM 关于事务代码VL04的一个测试
加入DC项目之前,笔者从没有使用过VL04这个事务代码。在项目中,笔者有注意到项目上的同行有使用VL04去为公司间STO单据创建外向交货单。而笔者之前一直使用VL10B这个事务代码来创建外向交货单的,所以VL04这个事务代码,引起了笔者的关注。
SAP虾客
2022/08/17
3820
SAP RETAIL 通过自动补货功能触发采购申请
这段时间,笔者试图想在SAP RETAIL系统里,通过自动补货的事务代码WRP1R来触发一个采购申请单据,但是一直都没有成功。
SAP虾客
2021/11/12
4930
SAP WM 高阶之2-Step Picking for Outbound Delivery
SAP WM 高阶之2-Step Picking for Outbound Delivery
SAP虾客
2022/03/31
4320
SAP WM 高阶之2-Step Picking for Outbound Delivery
SAP HUM 嵌套HU初探 III
,进入包装界面。对于该物料嵌套HU的场景下,在这个界面可以通过相关操作让系统自动生成嵌套HU。
SAP虾客
2021/02/20
6420
SAP WM初阶之事务代码LL01 - Warehouse Activity Monitor
SAP WM初阶之事务代码LL01 - Warehouse Activity Monitor
SAP虾客
2022/04/14
6550
SAP SD初阶之VL10A为销售订单创建外向交货单
SAP SD模块中销售订单的外向交货单创建,有很多种方法。其中之一就是使用VL10A这个事务代码。
SAP虾客
2022/07/11
1.4K0
SAP S4HANA 实战LTMC - 打响了第一炮!
随着SAP S/4HANA 1610版本的推出,SAP不再建议使用LSMW 作为数据迁移工具了,而是推出了新工具LTMC。LTMC与传统的LSMW比较起来,变化还是不小的,SAP顾问会LSMW不一定就自然会LTMC。对于这么一个新的数据导入工具,SAP顾问是需要掌握。
SAP虾客
2021/12/01
5630
SAP S4HANA 实战LTMC - 打响了第一炮!
推荐阅读
相关推荐
SAP EWM学习笔记之某个交货单创建后未能进入EWM,在inbound queue里面又被人误删除了,该如何处理?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档