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中的日志模块logging
Jun 19 Python
python 删除列表里所有空格项的方法总结
Apr 18 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
python爬虫获取百度首页内容教学
Dec 23 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
图文详解matlab原始处理图像几何变换
Jul 09 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&amp;mysql(二)
2006/10/09 PHP
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
JS删除数组指定值常用方法详解
2020/06/04 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
Python 中的with关键字使用详解
2016/09/11 Python
python中字符串类型json操作的注意事项
2017/05/02 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
校园活动策划书范文
2014/01/10 职场文书
2014年计生工作总结
2014/11/21 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
创业计划书之面包店
2019/09/12 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js
vue中data里面的数据相互使用方式
2022/06/05 Vue.js