python基础-古诗词填词游戏

2023-05-16

很久没写爬虫了,利用这次接单来顺便写一下爬虫。

文章目录

    • 1.项目需求
    • 2.思路梳理
    • 3.诗句处理遇到的问题有
    • 4.目录结构
    • 5.实现步骤
    • 6.收获
    • 7.不足

1.项目需求

用python实现古诗词填词游戏

诗词库的组成
初中古诗

备注: 诗词库参古诗文网https://so.gushiwen.cn/gushi/chuzhong.aspx

游戏功能:

1)以下玩法

  • 诗句对一对:根据上句对下句, 或者根据下句补充上句
    给整首诗词, 名句留白, 玩家补充
  • 猜名句:给出独字20个, 打乱顺序, 组成名句
  • 填词:给出名句, 留白一个字或一个词, 玩家填词
  • 首字接一接:给出首字, 补充完整句子或者整首诗词
  • 猜作者
  • 猜诗名

2.思路梳理

  1. 获取诗词(以字典形式存储)
  2. 实现玩法的API
  3. 实现逻辑

3.诗句处理遇到的问题有

  1. 因为年级不同,所学诗歌不同,所以需要考虑针对年级进行存储
  2. 一些诗句含有\n,需删除
  3. 一些诗句含有注释(下面的‘(随君 一作:随风)’),不利于长句补全,需删除
    我寄愁心与明月,随君直到夜郎西。(随君 一作:随风)

4.目录结构

在这里插入图片描述

5.实现步骤

  • 从网页获取诗词,直接上代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : getPoem.py
# @Author: yph
# @Date  : 2020/9/1

import requests
from lxml import etree


class getPoem:

    def __init__(self):
        self.url = 'https://so.gushiwen.cn/gushi/chuzhong.aspx'
        self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, '
                                      'like Gecko) Chrome/84.0.4147.135 Safari/537.36'}
        self.pl = dict()

    def get_html(self):
        try:
            response = requests.get(url=self.url, headers=self.headers)
            if response.status_code == 200:
                return response.text
            else:
                print('页面获取错误:状态码{}'.format(response.status_code))
        except Exception as e:
            raise ConnectionError('获取网页失败!')

    def parse(self):
        response = self.get_html()
        source = etree.HTML(response)
        chapters = source.xpath('//div[@class="typecont"]')
        return chapters

    def get_poem_list(self):
        for chapter in self.parse():
            grade = chapter.xpath('./div/strong/text()')[0]
            # print(grade)
            titles = chapter.xpath('./span')
            sector = list()
            for title in titles:
                head = title.xpath('./a/text()')[0]
                # print(head)
                poem_link = title.xpath('./a/@href')[0]
                # print(poem_link)
                poem = requests.get(poem_link)
                page = etree.HTML(poem.text)
                author = page.xpath('//p[@class="source"]/a[2]/text()')[0]
                content = [word.strip('\n') for word in page.xpath('//div[@class="left"]/div[@class="sons"]['
                                                                   '1]/div[@class="cont"]/div['
                                                                   '@class="contson"]//text()')]
                sector.append({'title': head, 'author': author, 'content': content})
            self.pl.update({grade: sector})
  • 玩法api实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : play_items.py
# @Author: yph
# @Date  : 2020/9/1

import random
import re


class play_items:
    def __init__(self, poem):
        self.poem = poem
        self.clean_poem()

    def clean_poem(self):
        pattern = re.compile(r'(\([^)]*\))')
        self.poem['content'] = pattern.sub('', self.poem['content'][0])

    def fill_sentence(self):
        """
        诗句补全
        :return:
        """
        content = self.poem['content']
        # 删除注解
        content = re.sub(r'(', '(', content)
        content = re.sub(r')', ')', content)
        pattern = re.compile(r'(\([^)]*\))')
        content = [words for words in pattern.sub('', content).split('。') if words != '']
        print(content)
        sentence = random.choices(content)
        target = sentence[0].split(',')[0]
        print('请补全下列横线处的诗句:')
        # print('{},{}'.format(target, '_'*(len(target)*2)))
        response = input('{},'.format(target))
        if response == sentence[0].split(',')[1]:
            print('恭喜你,答对了!')
        else:
            print('很遗憾,你答错了!正确答案是: {}。该句出自{}'.format(sentence[0].split(',')[1], self.poem['title']))

    def recombine(self):
        """
        将单个字组成客观存在或学过的诗句
        :return:
        """
        content = self.poem['content']
        # 删除注解
        pattern = re.compile(r'(\([^)]*\))')
        content = pattern.sub('', content).split('。')
        sentence = random.choices(content)
        _compile = re.compile('[,。]')
        res = _compile.sub('', sentence[0])
        res = list(res)

        # shuffle没有返回值
        random.shuffle(res)
        print('将单个字组成客观存在或学过的诗句: ')
        for s in res:
            print(s, end=' ')
        response = input('\n答案写在这里(使用中文字符):')
        if response == sentence[0]:
            print('恭喜你,答对了!')
        else:
            print('很遗憾,你答错了!正确答案是: {}'.format(sentence[0]))

    def guess_title(self):
        """
        根据诗词猜作者
        :return:
        """
        content = self.poem['content']
        title = self.poem['title']
        print('试根据下面的诗歌猜诗名:')
        print(''.join(content))
        response = input('你的答案是:')
        if response == title:
            print('恭喜你,答对了!')
        else:
            print('很遗憾,你答错了!正确答案是: {}'.format(title))

    def guess_author(self):
        """
        根据诗词猜作者
        :return:
        """
        content = self.poem['content']
        author = self.poem['author']
        print('试根据下面的诗歌猜作者:')
        print(''.join(content))
        response = input('你的答案是:')
        if response == author:
            print('恭喜你,答对了!')
        else:
            print('很遗憾,你答错了!作者是: {}'.format(author))


  • 实现整个游戏框架
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : integration.py
# @Author: yph
# @Date  : 2020/9/1

from getPoem import getPoem
from play_items import play_items
import random
import time

# 1. 获取诗歌
print("{:*^40}".format('正在初始化诗歌信息......'))
instance_api = getPoem()
get_poem = instance_api.get_poem_list()
poem_list = instance_api.pl
print("{:*^40}".format('初始化完成......'))

active = True
while active:
    player_grade = input('请输入你的年级:')
    poem_valid = []
    if player_grade == '七上':
        poem_valid = poem_list['七年级上册'] + poem_list['七年级上册(课外古诗词诵读)']

    elif player_grade == '七下':
        poem_valid = poem_list['七年级下册'] + poem_list['七年级下册(课外古诗词诵读)']

    elif player_grade == '八上':
        poem_valid = poem_list['八年级上册'] + poem_list['八年级上册(课外古诗词诵读)']

    elif player_grade == '八下':
        poem_valid = poem_list['八年级下册'] + poem_list['八年级下册(课外古诗词诵读)']

    elif player_grade == '九上':
        poem_valid = poem_list['九年级上册'] + poem_list['九年级上册(课外古诗词诵读)']

    elif player_grade == '九下':
        poem_valid = poem_list['九年级下册'] + poem_list['九年级下册(课外古诗词诵读)']
    else:
        print('请重新选择年级:')

    # 将诗歌打乱
    random.shuffle(poem_valid)

    if poem_valid:
        while True:
            print('{}'.format('='*40))
            print('当前支持以下游戏:\n')
            print('1.长句补全')
            print('2.诗句重组')
            print('3.猜诗名')
            print('4.猜作者')
            print('5.退出选游戏环节重新选择年级')
            print('0.退出游戏')
            print('{}'.format('='*40))
            game_type = eval(input('你想玩的游戏是(输入相应序号即可):'))
            print('{}'.format('='*40))

            # 随机获取一首诗歌
            poem = random.choices(poem_valid)[0]
            # print(poem)
            # 初始化游戏
            game = play_items(poem)
            # 选择游戏类型
            if game_type == 0:
                active = False
                break
            if game_type == 1:
                game.fill_sentence()
                time.sleep(3)
            if game_type == 2:
                game.recombine()
                time.sleep(3)
            if game_type == 3:
                game.guess_title()
                time.sleep(3)
            if game_type == 4:
                game.guess_author()
                time.sleep(3)
            if game_type == 5:
                break

6.收获

  1. 对正则表达式实现复杂匹配,即处理诗句问题第三个问题
  2. 对xpath解析小小的温习了一波(半年没写爬虫了)

7.不足

  1. 没有采用数据库进行存储,因此每次初始化慢(需要先从网上抓取),且对网站造成一定的影响(主要是我笔记本之前格式化,没有配置MySQL数据库)
  2. 由于词的字数不对称,以‘。’切割,必然存在问题
  3. 这是个半成品,大家如果要借鉴请带着我上面说的诗句清洗,和前面两点进行修改和完善

(等下次再有人找我做,我再好好写吧,\吃瓜)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python基础-古诗词填词游戏 的相关文章

  • 抖音短视频脚本制作的一些技巧,快快收藏起来!

    在抖音上发布一个成功的短视频需要多方面的考虑 xff0c 其中最重要的是脚本的制作 一个好的脚本不仅可以吸引用户观看 xff0c 还可以让用户产生共鸣 xff0c 从而提高视频的传播效果 以下是不若与众科技一些关于抖音短视频脚本制作的技巧
  • java中http请求带cookie

    span class hljs built in String span urlPath 61 span class hljs string 34 你的请求链接 34 span span class hljs built in String
  • Linux系统下使用rpm安装时失败 出现错误:“依赖检测失败” 解决方法

    今天长青在重新安装yum的时候出现了这种错误 xff0c 提示 依赖检测失败 解决方法 xff1a 在命令末尾加上 nodeps force 参数意思 xff1a nodeps xff1a 不检测依赖关系 force xff1a 强制安装
  • springboot的sql日志打印与AOP实现接口调用日志打印

    Springboot的sql日志打印与AOP实现接口调用日志打印 96 1 Springboot与mybatis或者mybatisplus 打印sql执行语句 使用的是springboot中内部嵌入的日志框架 2 接口调用日志 xff0c
  • 双一流博士整理的71个OpenCV实战项目教程开放下载!

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 近期小白学视觉公众号推出了多篇Python 43 OpenCV实战项目的文章 xff0c 深受小伙伴们的喜爱 最近有小伙伴推荐 xff
  • 资料分析之增长量

    一 增长量的计算 识别 xff1a 增长 43 单位 公式 xff1a 1 给出现期 基期 xff1a 增长量 61 现期 基期 2 给出现期 增长率 xff1a 增长量 61 r 现期 1 43 r 速算 xff1a 1 尾数法法 xff
  • Manjaro 基础配置及常用软件安装

    更新源 获取key https mirrors tuna tsinghua edu cn help archlinux https mirrors tuna tsinghua edu cn help archlinuxcn 安装常用工具 x
  • JS中new Date().format("YYYY-mm-dd")提示format is not a function的解决办法

    format方法已经被移除了 xff0c 赶快换个组件 xff01 如果是个懒人 xff0c 就不要再看那些自己写方法大神给的函数了 xff01 xff01 用moment xff0c npm一下子就能装好 xff0c 很好用 xff01
  • python去掉字符串中的指定字符的方法

    我们在使用 Python处理字符串的时候 xff0c 经常会遇到一些字符串中出现了指定字符 xff0c 比如以下代码 xff1a 上面代码中的 就是一个指定字符 xff0c 在 python中 xff0c 如果使用 替换为指定字符 xff0
  • linux使用yum安装JDK8

    安装步骤 xff1a 1 查看是否已安装JDK yum list installed span class token operator span grep java 2 卸载CentOS系统Java环境 yum span class to
  • 图像的边缘检测和缺失修复(附matlab代码)

    最近在数学建模过程中老师给了个图片分别在清晰 有噪声及模糊状态下对其进行边缘检测的题目 xff0c 最后一题是将图片中一部分抠出后将图片按照剩余图片的特征进行修复 xff0c 整个问题涉及到人工智能及计算机视觉的领域较多 xff0c 和队友
  • FileNotFoundError:[Errno 2] No such file or directory :

    FileNotFoundError Errno 2 No such file or directory 1 根本原因 xff1a 路径有问题 2 可能的原因 xff1a 1 xff09 注意Windows与Linux分隔符的区别 Windo
  • Python学习-使用matplotlib画动态多图

    近期经常使用matplotlib进行数学函数图的绘制 xff0c 但是如何使用matplotlib绘制动态图 xff0c 以及绘制动态多图 xff0c 直到今天才学会 1 参考文字 首先感谢几篇文字的作者 xff0c 帮我学会了如何绘制 x
  • VS Code:无法在终端运行命令的解决方法

    1 在VSCode配置好 java 的开发环境后 xff0c 在终端运行时出现如下错误 xff1a 2 刚开始以为是系统环境没配置好 xff0c 结果在 PowerShell 运行没问题 xff1a 3 网上找到了解决方法 xff0c 原因
  • 应用宝sdk跳坑之路 - 1

    这次接入的是ysdk加midas的客户端下单模式 第一次接ysdk xff0c 卡住情况是在对接人员不搭理情况下 登录 0 qq登录未设置调试者账号 和 微信登录签名对不上的就不说了 1 登录的时候返回码一直是3100 xff0c 您尚未登
  • vscode本地同步修改ftp服务器文件

    这里写自定义目录标题 vscode本地同步修改ftp服务器文件搜索插件插件设置本地修改与服务器文件同步 vscode本地同步修改ftp服务器文件 本文记录一下本人使用vscode成功连接远程ftp服务器 xff0c 并成功修改文件的步骤 搜
  • docker拉命令时报错 ERROR: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

    报错 xff1a 关于pull 命令时报错 xff1a get https registry 1 docker io v2 ner http TLS handshake timeout 或者 request canceled while w
  • 2018年App测试流程及要点梳理

    先说说 xff0c 为什么要给大家梳理App测试流程和要点呢 xff1f 主要是缘于有太多同学咨询相关App测试的问题 xff0c 回答的次数多了 xff0c 就不想打字了 xff0c 还不如这样全部帮你们整理好 xff0c 希望各位看到的
  • Java使用FTP时碰到的坑--服务部署到linux时storeFile返回false

    背景 正常情况下 xff0c 我们都是把上传的文件保存到Java服务运行的服务器上 前段时间根据公司正式环境上的情况 xff0c 必须要把文件做成跨服务器存储 xff0c 经过考虑 xff0c 最终采用FTP工具存储文件 因为保存的文件并不
  • 安装了VMwaretools却无法使用

    在很早之前安装了VMwaretools却无法使用 xff0c 不能实现在windows以及ubuntu互相之间的复制粘贴 今天想着彻底解决一下这个问题 xff0c 进行了一番操作 刚开始看到有博主说因为Ubuntu的次怕空间不足了 xff0

随机推荐

  • Java去掉数字字符串开头的0 四种方法 000010

    推荐方法一 方式一 xff1a String str 61 34 000010 34 int result 61 Integer parseInt tempStr System out println result 输出 xff1a 10
  • Ubuntu apt 安装gedit,报错 E: Unable to correct problems, you have held broken packages.

    Ubuntu apt 安装gedit xff0c 报错 E Unable to correct problems you have held broken packages 在安装软件的时候报错 xff1a 网上查询了很多资料 xff0c
  • rhel 7 yum源错误提示以及解决方式

    在 etc yum repos d 写好 repo 执行yum repolist之后出现以下错误提示 This system is not registered with an entitlement server You can use
  • C++——三种继承方式与三种访问权限的相互组合

    三种访问权限 public 可以被任意实体访问 protected 只允许子类及本类的成员函数访问 private 只允许本类的成员函数访问 三种继承方式 public 继承 protect 继承 private 继承 组合结果 基类中 继
  • Maven setting.xml国内镜像仓库(全)

    打开setting xml 位置在apache maven 3 6 1 conf下面 Ctrl 43 F 查找mirror标签位置加入即可 lt maven官方镜像 gt lt mirror gt lt id gt mirrorId lt
  • Android Studio创建项目

    一 创建新项目 二 选择空白页项目类型 三 设置项目信息 四 下载SDK 只有初次创建时会下载 下载完成 五 初始化项目工程 初始化完成
  • 解决MATLAB"尝试将 SCRIPT open 作为函数执行"的问题

    解决MATLAB 34 尝试将 SCRIPT open 作为函数执行 34 的问题 当关闭MATLAB一个脚本的时候 xff0c 再次双击打开 xff0c 会出现下图的情况 xff1a 脚本无法打开 xff0c 只能用实时脚本的方式打开 x
  • SMM(Spring+SpringMVC+MyBatis)

    Spring amp SpringMVC amp MyBatis 一 Spring的体系结构 自下往上 xff1a TestCore Container 核心容器 Beans xff1a 容器Core xff1a 核心Context xff
  • 二、SpringBoot基础配置

    二 SpringBoot基础配置 二 SpringBoot基础配置1 复制工程2 属性配置3 配置文件分类3 1 配置文件优先级3 2 教你一招 xff1a 自动提示功能消失解决方案 4 yaml文件5 yaml数据读取5 1 读取单一数据
  • FSK和ASK区别

    简介 市面上的遥控器常见的有FSK和ASK两种 xff0c 一种是有应答 xff0c 一种无应答 xff0c 现将主要区别罗列如下 FSK和ASK区别 FSK xff1a 频率调制 ASK xff1a 振幅调制 ASK IC一般只发射不接受
  • 关闭集群机器命令脚本

    背景 没有脚本时 xff0c 关闭集群里的Linux机器 xff0c 需要分别在每台机器执行关机命令 xff0c 费时费力 hadoop 64 node2 sudo init 0 hadoop 64 node3 sudo init 0 ha
  • ubuntu系统如何建立可执行文件

    第一步 xff1a 在桌面建立一个新建文档 gt 空文件 xff0c 文档重命名为test txt 第二步 xff1a 打开test txt xff0c 在文档的最顶端写入 bin bash xff08 独占一行 xff09 如 xff1a
  • 自己动手写操作系统(高清图书+源代码)分享

    很喜欢 自己动手写操作系统 这本书 xff0c 但现在这本书已经绝版了 在这里分享一下这本书的高清电子版和源代码 xff0c 感兴趣的人可以下载一下 链接 xff1a https pan baidu com s 1lPXg Airu2NFj
  • Android Studio闪屏页

    现在很多 App 启动都有闪屏页和功能引导页 xff0c 那么接下来我们就来先看看闪屏页是怎么实现的吧 首先创建一个新的工程 xff0c 然后创建一个新的Empty Activity xff0c 在这我就命名为SplashActivity
  • layui图标显示方框

    解决方法 检查一下class里面是不是少了一个图标的默认class layui icon
  • win10下python代码打包成exe文件并作为服务后在后台运行,开机自启

    1 pip安装pyinstaller pip install pyinstaller 2 打包python文件 打开cmd xff0c cd到项目文件夹 xff0c 并将主文件 xff08 我这里是web py xff09 用pyinsta
  • ubuntu为软件设定图标

    第一步 xff1a 进入到usr share applications 文件夹下 cd usr share applications 第二步 xff1a 创建桌面图标 xff1a sudo touch clion desktop 第三步 x
  • ubuntu18.04.1 开机默认进入命令行模式/用户图形界面

    一 开机默认进入命令行模式 1 输入命令 xff1a sudo systemctl set default multi user target 2 重启 xff1a reboot 要进入图形界面 xff0c 只需要输入命令startx 从图
  • ftp上传图片损坏怎么办?

    ftp不适用于普通的传输文件 xff0c 必须使用二进制的传输格式才可以保证图片上传不被损坏 添加这两行代码即可 xff01
  • python基础-古诗词填词游戏

    很久没写爬虫了 xff0c 利用这次接单来顺便写一下爬虫 文章目录 1 项目需求2 思路梳理3 诗句处理遇到的问题有4 目录结构5 实现步骤6 收获7 不足 1 项目需求 用python实现古诗词填词游戏 诗词库的组成 初中古诗 备注 xf