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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
python验证码识别实例代码
Feb 03 Python
pycharm设置注释颜色的方法
May 23 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
如何使用Python标准库进行性能测试
Jun 25 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
python2 对excel表格操作完整示例
Feb 23 Python
OpenCV 之按位运算举例解析
Jun 19 Python
Python读写压缩文件的方法
Jul 30 Python
Python的Tqdm模块实现进度条配置
Feb 24 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
进一步理解Python中的函数编程
2015/04/13 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
python如何实现int函数的方法示例
2018/02/19 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
Python get获取页面cookie代码实例
2018/09/12 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
大学生求职简历的自我评价
2013/10/14 职场文书
音乐专业应届生教师求职信
2013/11/04 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
《确定位置》教学反思
2016/02/18 职场文书
详解python网络进程
2021/06/15 Python
Pytest中skip skipif跳过用例详解
2021/06/30 Python