Python 问答游戏

1 python

我想使用 2 个数组或列表制作一个问答游戏。如何将一个列表中的项目链接到另一个列表?我有这个代码:

import random

mylist = ['A','B','C']
answer = ['1','2','3']
value = random.choice(mylist)
print (value)
input()
mylist.remove(value)
value = random.choice(mylist)
mylist.remove(value)
print (value)
input()
value = random.choice(mylist)
print(value)
mylist.remove(value)
Run Code Online (Sandbox Code Playgroud)

我知道如何从mylist(问题)中随机选择一个变量,但如何将 A 表示为 1 并让用户输入 1 使其正确?

如何将一个列表链接到另一个列表并制作一个问答游戏?它需要提出问题,然后用户输入答案。如果正确,他们会得到一分,在 4 个问题之后,系统会询问他们是否想再玩一次,然后 3 轮中会出现 4 个新问题,并且必须记录他们答对了多少个问题。

Jim*_*ski 5

这个程序正好处于可接受的列表/列表字典和最好用类编写之间的边界。如果它有可能增长,您可能希望将其重新组织为面向对象程序(OOP),如下所示:

import sys
import random

class Question(object):
    def __init__(self, question, answer, options):
        self.question = question
        self.answer = answer
        self.options = options

    def ask(self):
        print self.question + "?"
        for n, option in enumerate(self.options):
            print "%d) %s" % (n + 1, option)

        response = int(sys.stdin.readline().strip())   # answers are integers
        if response == self.answer:
            print "CORRECT"
        else:
            print "wrong"

questions = [
    Question("How many legs on a horse", 4, ["one", "two", "three", "four", "five"]),
    Question("How many wheels on a bicycle", 2, ["one", "two", "three", "twenty-six"]),

    # more verbose formatting
    Question(question="What colour is a swan in Australia",
             answer=1,
             options=["black", "white", "pink"]),    # the last one can have a comma, too
    ]

random.shuffle(questions)    # randomizes the order of the questions

for question in questions:
    question.ask()
Run Code Online (Sandbox Code Playgroud)

这使得数据结构如何使用的逻辑更接近数据结构的定义位置。另外(解决您原来的问题),很容易将问题与答案关联起来,因为它们不再位于单独的列表中。

没有理由不这样做,因为 Python 不需要太多额外的工作来创建一个类。这与列表字典解决方案(它所基于的)长度大致相同,并且可以说更容易阅读,更接近您坐下来开始编程之前的想法。即使在四行程序中,我也经常使用类:OOP 不一定是一个大问题。

编辑:您可以像操作整数或字符串列表一样操作类实例列表。例如,

del questions[0]
Run Code Online (Sandbox Code Playgroud)

从列表中删除第一项,

questions.append(Question("What is a new question", 1, ["This is."]))
Run Code Online (Sandbox Code Playgroud)

在列表末尾添加一个新问题,pop让您将列表用作堆栈等。(有关更多信息,请参阅 Python 教程。)如果您想使用列表的remove方法删除特定问题,而不是通过索引删除它(什么del确实如此),那么您需要告诉 Python 两个问题相同意味着什么。

尝试将这两个方法添加到类中:

    def __eq__(self, other):
        return self.question == other.question

    def __repr__(self):
        return "<Question: %s? at %0x>" % (self.question, id(self))
Run Code Online (Sandbox Code Playgroud)

第一个定义Question如果两个实例的问题字符串相同,则它们相等。您可以通过要求他们的答案相同来扩展定义,但您明白了。它允许您执行以下操作:

questions.remove(Question("How many legs on a horse", 0, []))
Run Code Online (Sandbox Code Playgroud)

删除马腿问题。

第二个在 Python 命令行上漂亮地打印问题对象,以便您在尝试这些命令时可以看到自己在做什么。最好的学习方法是反复试验,这使得反复试验更有成效。