Python中的囚徒困境

时间:2017-12-19 14:39:25

标签: python

在我的CSE课程学校,我正在研究一个可选项目,这是一个囚徒困境到Python的版本。这是我的代码。当我运行它时,它开始工作,然后一旦它命中if语句,它返回错误'TypeError: 'bool' object is not iterable。我该如何解决这个问题?

import random
def ipd_start():
    print("Welcome to Prisoner's Dilemma. \n If you don't know what Game Theory is, you're in the wrong place. \n \n Enter Collude to collude, or Betray to betray.")
    round_one()

def round_one():
    answer=(input("You and a buddy got caught commiting a crime. Do you keep quiet, or rat on your best friend? \n "))
    a = ["Collude", "Betray"]
    G = random.choice(a)
    print("You chose " + answer + ", and your partner chose " + G + ". ")
    if all(G == "Collude" and answer==("Collude")):
        both_free()
    if all(G == 'Collude' and answer==('Betray')):
        you_free()
    if all(G == 'Betray' and answer=='Betray'):
        both_jail
    if all(G == 'Betray' and answer=='Collude'):
        you_jail

4 个答案:

答案 0 :(得分:3)

all(iterable)期望一个可迭代的参数。 PyDocs。但是你给了它一个布尔值。让我们分解第一个if声明。

if all(G == "Collude" and answer==("Collude")):

因此,如果G == "Collude"将返回布尔值以及answer == ("Collude")。你AND他们在一起产生另一个布尔值。所以最后你要传递一个布尔值,而不是所需的迭代值。

让您的if语句看起来更像这样:

if G == "Collude" and answer==("Collude"):

答案 1 :(得分:1)

你的if语句使用all()函数。这需要一个可迭代的,而不是一个布尔语句。这就是错误的含义。

要修复,请尝试删除all()函数,并将其保留为完整的布尔语句;

if G == 'Betray' and answer == 'Collude':
    you_jail()

答案 2 :(得分:0)

函数all需要一系列布尔值并返回所有布尔值True。你传递了一个布尔表达式,它产生了上面提到的错误。

我想你可以放弃all的电话。

答案 3 :(得分:0)

问题在于all(G == "..." and answer == "...")。选择G == "..." and answer == "..."all(G == "...", answer == "..."),您无法同时执行这两项操作。你得到的确切错误是因为and产生了一个布尔值,而all需要一个列表或它可以迭代/循环的东西。