python实现诗歌游戏(类继承)


Posted in Python onFebruary 26, 2019

本文实例为大家分享了python实现诗歌游戏的具体代码,供大家参考,具体内容如下

具体游戏有:根据上句猜下句、猜作者、猜朝代、猜诗名等

如果有更好玩儿的游戏,不妨自己写一下

1.首先,先把搜集到的诗歌全部放到一个txt文件下,命名为poems.txt

2.其次,再定义一个poem类,执行的时候输出诗歌的名字,作者,朝代等,代码如下:

class Poem:
 
  def __init__(self):
    self.title = ''
    self.dynasty = ''
    self.author = ''
    self.sentences = []
 
  def __str__(self):
    return '{}\n{}\n{}\n{}'.format(
      self.title, self.dynasty, self.author, '\n'.join(self.sentences))

3.加载出来诗歌的所有部分,代码如下:

from enum import Enum
from poem import Poem
 
 
Poems = []
 
 
def load():
  class ReadState(Enum):
    Nothing = 0
    Title = 1
    DynastyAndAuthor = 2
    Sentences = 3
 
  print('开始加载诗歌')
 
  f = open('poems.txt', encoding='utf-8')
  lines = f.readlines()
 
  state = ReadState.Title
  poem = None
 
  for ln in lines:
    line = ln.strip()
    if len(line) > 0:
      try:
        if line.startswith('-'):
          if poem is not None:
            Poems.append(poem)
            print('.', end='')
          poem = Poem()
          poem.title = line.lstrip('-')
          state = ReadState.DynastyAndAuthor
          continue
        if state == ReadState.DynastyAndAuthor:
          dynasty_author = line.split(' ')
          poem.dynasty = dynasty_author[0]
          poem.author = dynasty_author[-1]
          state = ReadState.Sentences
          continue
        if state == ReadState.Sentences:
          poem.sentences.append(line)
      except IndexError as e:
        print(line)
  print('\n共加载{}首诗歌'.format(len(Poems)))
  print()
 
 
load()

4.下面开始写具体的功能代码,以猜朝代和猜下句为例。

(1)猜朝代代码如下

# -*- coding: utf-8 -*-
__author__ = 'wj'
__date__ = '2018/7/20 9:54'
 
from game import Game
 
 
class DynastyGame(Game):
 
  def __init__(self, poems):
    super(DynastyGame, self).__init__(poems)
    self.name = '猜朝代'
    self.rules = '根据诗歌猜作者所处的朝代,猜对加10分,猜错不扣分。'
 
  def design_question(self):
    """设计问题及答案"""
    self.answer = self.poem.dynasty
 
    # 打印题目
    print(self.poem.title)
    print(self.poem.author)
    print()
    # enumerate() 会将列表中的索引和数据一一对应取出
    # i 数据的索引  s数据
    for i, s in enumerate(self.poem.sentences):
      print(s)
      if i > 5:
        print('...')
        break
    print()
 
  def get_answer(self):
    """获取答案"""
    # 1.输出问题
    print('这首诗的作者是:{}'.format(self.poem.author))
 
    while True:
      self.user_answer = input('请输入他/她所在的朝代:')
      # 2.判断是否输入了内容
      if self.user_answer:
        break
 
  def judge(self):
    """判断答案"""
    is_ok = super(DynastyGame, self).judge()
 
    if is_ok:
      self.score += 10
 
      print('回答正确!')
    else:
      print('回答错误!')
      print('{}所在的朝代是:{}'.format(self.poem.author, self.poem.dynasty))
 
    print('您目前的得分为:{}'.format(self.score))
 
 
if __name__ == '__main__':
  from load_poems import Poems
  dynasty = DynastyGame(Poems)
  dynasty.run()

(2)根据上句猜出下一句的具体代码如下:

# -*- coding: utf-8 -*-
__author__ = 'wj'
__date__ = '2018/7/20 10:45'
 
from game import Game
import random
 
 
class FillGame(Game):
  def __init__(self, poems):
 
    super(FillGame, self).__init__(poems)
    self.name = '对下句'
    self.rules = '根据上一句,对出下一句,答对得10分,答错不扣分'
 
  def design_question(self):
    # 随机取出索引
    index = random.randint(0, len(self.poem.sentences)-2)
    # 取出问题答案
    answer = self.poem.sentences[index + 1]
    # 切片 切出不带标点的诗句
    self.answer = answer[:-1]
 
    # 题目
    print('{}_____________'.format(self.poem.sentences[index]))
    print()
 
  def get_answer(self):
 
    while True:
 
      self.user_answer = input('请写出这句诗的下一句:')
      if self.user_answer:
        break
 
  def judge(self):
 
    if super(FillGame, self).judge():
      self.score += 10
      print('回答正确!')
    else:
      print('回答错误!')
      print('正确答案是:{}'.format(self.answer))
 
    Game.print_line()
    print('您目前的得分为:{}'.format(self.score))
 
 
if __name__ == '__main__':
  from load_poems import Poems
  fill = FillGame(Poems)
  fill.run()

注:猜作者游戏和猜诗名游戏的代码和猜朝代类似

5.最后把所有游戏整合到一个py文件里(注意:一个游戏是一个py文件,自己在里边声明类,最后只需要调用一下就行),整合后的代码如下所示:

from load_poems import Poems
from game import Game
from dynasty_game import DynastyGame
from fill_game import FillGame
from author_game import AuthorGame
from title_game import TitleGame
 
 
class PoemGame(object):
  """诗词游戏"""
 
  def __init__(self):
 
    self.version = '1.0'
    self.games = [DynastyGame(Poems), FillGame(Poems),AuthorGame(Poems),TitleGame(Poems)]
 
  def list(self):
    """列出所有游戏玩法"""
    print('请选择玩法:')
    Game.print_double_line()
    for i, g in enumerate(self.games):
 
      print('{:<10}{}'.format(i+1, g.name))
 
    Game.print_line()
 
  def play(self):
    """根据用户选择的玩法执行游戏"""
    while True:
      self.list()
      idx = input('请输入游戏编号,输入q退出:')
      if idx == 'q':
        print('Bye Bye~')
        break
      Game.print_line()
 
      # 根据索引取出图形对象
      idx = int(idx)
      g = self.games[idx - 1]
      g.run()
 
  def run(self):
    """运行游戏"""
    print('欢迎来到诗词诗词大会')
    print('v{}'.format(self.version))
 
    self.play()
 
 
if __name__ == '__main__':
 
  g = PoemGame()
  g.run()

以上就是整个项目的所有代码了,在这个小项目中,我使用了类继承的方法,在不断修改代码的同时,也让我更加熟悉了类继承的特点和用法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
使用Python脚本对Linux服务器进行监控的教程
Apr 02 Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 Python
python构建自定义回调函数详解
Jun 20 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
python中abs&amp;map&amp;reduce简介
Feb 20 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
解决yum对python依赖版本问题
Jul 05 Python
Python中的xlrd模块使用原理解析
May 21 Python
python 发送get请求接口详解
Nov 17 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 Python
Python实现简单查找最长子串功能示例
Feb 26 #Python
基于Python实现用户管理系统
Feb 26 #Python
python selenium firefox使用详解
Feb 26 #Python
Django实现学员管理系统
Feb 26 #Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 #Python
Django实现学生管理系统
Feb 26 #Python
python爬取微信公众号文章的方法
Feb 26 #Python
You might like
php列出一个目录下的所有文件的代码
2012/10/09 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
JavaScript中的闭包
2016/02/24 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python实现感知器算法详解
2017/12/19 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
电子信息毕业生自荐信
2013/11/16 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
活动主持人开场白
2015/05/28 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL
Python操作CSV格式文件的方法大全
2021/07/15 Python
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏