2017-12-19 5 views
0

私のCSEクラスの学校で、私はオプションのプロジェクトに取り組んでいます。これは、PrisonerのジレンマをPythonに組み込んだものです。これは私のコードです。私はそれを実行すると、それが動作するようになってから、if文にヒットすると、エラーである'TypeError: 'bool' object is not iterableを返します。これをどうやって解決するのですか?Prisoner's Dilemma in Python

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 
+2

あなたは 'all'の使用を誤解していると思いますが、この場合は削除できます。 –

+0

また、 'input'と文字列定数' 'Betray''と' 'Collude''に余分な括弧をつけることもできます。 – Omni

答えて

0

機能allは、それらのすべてがTrueあるかどうかをブール値とリターンの順序を期待しています。上記のエラーを生成する単一のブール式を渡しました。

allの電話を離れることができると思います。

3

all(iterable)は、反復可能な引数が必要です。 PyDocs。しかし、あなたはブール値を与えました。その最初のifステートメントを分解しましょう。

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

のでG == "Collude"は、ブールを返すだけでなく、answer == ("Collude")するかどうか。 AND一緒に別のブール値を生成します。だから最後には、すべての人に必要な反復可能なものではなくブール値を渡しています。

は、あなたのif文はより次のようになり行います

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

ありがとうございます。それは完璧に働いた。 –

0

問題がall(G == "..." and answer == "...")にあります。 G == "..." and answer == "..."またはall(G == "...", answer == "...")のいずれかを選択すると、両方を行うことはできません。正確なエラーは、andがブール値を生成し、allがリストやそれ以上の繰り返しができるリストを必要とするためです。

1

if文はall()関数を使用します。これは、booleanステートメントではなく、iterableをとります。それがエラーの原因です。

修正するには、all()関数を削除して完全なブールステートメントにしてください。

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