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 ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
python字典多条件排序方法实例
Jun 30 Python
Python 模拟购物车的实例讲解
Sep 11 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python逆序打印各位数字的方法
Jun 25 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
Django 多环境配置详解
May 14 Python
python安装pil库方法及代码
Jun 25 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
使用Python实现牛顿法求极值
Feb 10 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日期处理函数 整型日期格式
2011/01/12 PHP
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
vue.js计算属性computed用法实例分析
2018/07/06 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
Python抽象类的新写法
2015/06/18 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python实现抢购IPhone手机
2018/02/07 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
EJB的激活机制
2013/10/25 面试题
创业计划书中要认真思考的问题
2013/12/28 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
小学数学课后反思
2014/04/23 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
建议书的格式及范文
2015/09/14 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL