1

我想用 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)

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

如何将一个列表链接到另一个列表并制作琐事游戏?它需要问一个问题,然后用户输入答案。如果正确,他们会得到一分,在 4 个问题之后,它会询问他们是否想再玩一次,然后是 3 个回合的 4 个新问题,并且必须记录他们做对的次数。

4

2 回答 2

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

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

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

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

del questions[0]

从列表中删除第一项,

questions.append(Question("What is a new question", 1, ["This is."]))

在列表末尾添加一个新问题,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))

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

questions.remove(Question("How many legs on a horse", 0, []))

删除马腿问题。

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

于 2013-10-10T16:06:22.873 回答
2

使用数组数组。

每个问题一个数组

在每个数组中,第一个元素是问题,第二个元素是正确答案的索引,其余的是可能的答案选项

我没有将问题随机化,因为您已经可以这样做

import sys

questions=[
  ['How many legs on a horse',4, 1, 2, 3, 4 ,5],
  ['How many wheels on a bicycle',2,'one','two','three','twenty six'],
  ['What colour is a swan in Australia',1, 'black', 'white', 'pink']
  ]

for ask in questions:
    print ask[0]+'?'
    n = 1
    for options in ask[2:]:
        print "%d) %s" % (n,options)
        n = n + 1
    response = sys.stdin.readline().strip()
    if int(response) == ask[1]:
        print "CORRECT"
    else:
        print "wrong"

或者,根据以下评论中的建议(感谢 Don)使用 dict。

import sys

questions = [
  {
  'question': 'How many legs on a horse',
  'answer': 4,
  'options': [1, 2, 3, 4, 5]},
  {
   'question': 'How many wheels on a bicycle',
   'answer': 2,
   'options': ['one', 'two', 'three', 'twenty six']},

  {
   'question': 'What colour is a swan in Australia',
   'answer': 1,
   'options': ['black', 'white', 'pink']}
  ]

for ask in questions:
    print ask['question'] + '?'
    n = 1
    for options in ask['options']:
        print "%d) %s" % (n, options)
        n = n + 1
    response = sys.stdin.readline().strip()
    if int(response) == ask['answer']:
        print "CORRECT"
    else:
        print "wrong"

希望这可以帮助

于 2013-10-10T13:40:22.123 回答