Python实现诗歌互动游戏:基于类继承的完整代码解析
本文详细介绍如何使用Python开发一个包含猜朝代、对下句等玩法的诗歌互动游戏。通过定义Poem基类并利用类继承机制,分别实现DynastyGame和FillGame等功能模块。文章提供了从TXT文件解析诗歌数据到整合所有游戏逻辑的完整代码示例,帮助开发者深入理解Python面向对象编程及文件处理技巧。
本文分享了一个使用Python编写的诗歌游戏完整示例,供读者参考学习。
该游戏包含多种玩法,例如根据上句猜下句、猜测作者、推断朝代以及识别诗名等。
如果您有其他更有趣的创意,也可以尝试自行编写相关代码。
第一步,将收集好的诗歌数据统一存入一个名为poems.txt的文本文件中。
第二步,定义一个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))
第三步,编写代码以加载并解析诗歌文件中的所有数据,实现代码如下:
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()
第四步,开始编写具体的游戏功能逻辑,此处以猜朝代和猜下句两个功能为例进行说明。
(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()
注:猜作者和猜诗名游戏的代码逻辑与猜朝代功能类似,此处不再赘述。
第五步,将所有游戏模块整合到一个Python文件中(注意:每个游戏原本独立为一个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()
以上即为整个项目的全部代码。在这个小项目中,我采用了类继承的方法,在不断的代码修改过程中,也使我更加熟悉了类继承的特点及其具体用法。
以上就是本文的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













