基于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()












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

猜你喜欢

转载自blog.csdn.net/qq_42598133/article/details/81134080
今日推荐