2017-06-19 7 views
0

私は現在、数学的なカードトリックをプログラムしようとしています。これは、ランダムなカードが何枚あるかをユーザーに尋ねます。仕事をするトリック)、リストのインデックスが範囲外になります。私は正確にどこに問題があるのか​​は不明ですし、現在のバージョンを添付して、より明確に見るためにそれを実行しようとすることができます。ありがとう!2回目の実行で失敗するリスト

import random 

def makedeck(): 
    listy = [] 
    cardsindeck = 0 
    while cardsindeck != 21: 
    suit = random.randint(1,4) 
    if suit == 1: 
     suit = "D" 
    elif suit == 2: 
     suit = "H" 
    elif suit == 3: 
     suit = "S" 
    else: 
     suit = "C" 
    cardtype = random.randint(1,13) 
    if cardtype == 1: 
     card = "A" 
    elif cardtype == 2: 
     card = "2" 
    elif cardtype == 3: 
     card = "3" 
    elif cardtype == 4: 
     card = "4" 
    elif cardtype == 5: 
     card = "5" 
    elif cardtype == 6: 
     card = "6" 
    elif cardtype == 7: 
     card = "7" 
    elif cardtype == 8: 
     card = "8" 
    elif cardtype == 9: 
     card = "9" 
    elif cardtype == 10: 
     card = "10" 
    elif cardtype == 11: 
     card = "J" 
    elif cardtype == 12: 
     card = "Q" 
    else: 
     card = "K" 
    cardandsuit = (card + suit) 
    if cardandsuit not in listy: 
     listy.append(cardandsuit) 
     cardsindeck = cardsindeck + 1 
    return listy 

def dealdeck(listy): 
    list1 = [] 
    list2 = [] 
    list3 = [] 
    for i in range(len(listy)): 
    if i % 3 == 0: 
     list1.append(listy[i]) 
    elif i % 3 == 1: 
     list2.append(listy[i]) 
    else: 
     list3.append(listy[i]) 
    return[list1, list2, list3] 

def makepiles(pile1,pile2,pile3): 
    print("Pile 1\t\tPile 2\t\t Pile 3\t\t") 
    for i in range(7): 
    print(pile1[i],"\t\t",pile2[i],"\t\t",pile3[i],"\t\t") 

def usercardpile(): 
    userinput = input("What pile is your card in?") 
    if userinput == "1" or userinput.title() == "One": 
    return 1 
    elif userinput == "2" or userinput.title() == "Two": 
    return 2 
    elif userinput == "3" or userinput.title() == "Three": 
    return 3 
    else: 
    print("Please only write 1, 2 or 3") 
    return usercardpile() 


listy = makedeck() 
pile1, pile2, pile3 = dealdeck(listy) 
for i in range(1,4): 
    newlisty = makepiles(pile1,pile2,pile3) 
    userspile = usercardpile() 
    if userspile == 1: 
    newlisty = (pile2,pile1,pile3) 
    elif userspile == 2: 
    newlisty = (pile1,pile2,pile3) 
    else: 
    newlisty = (pile1,pile3,pile2) 
    pile1, pile2, pile3 = dealdeck(newlisty) 

print("Your card is",newlisty[10]) 
+2

カードにマッピングすることを考慮して、カードに 'if'の壁を書く必要はありません。 –

+0

私はかなり新しいので、私は本当に理解していない。説明していただけますか? –

答えて

1

一つの問題は、コード行を使用することです:あなたはそれがNoneを返すのに対し、3つのリストを返すようにmakepilesを期待している

newlisty = makepiles(pile1, pile2, pile3) 

(明示的な項目が返されません)。

あなたがその機能からパイルを返却したとしたら、それはうまくいくと思います。

他の事は、あなたはこれをやっているされています

newlisty = (pileX, pileY, pileZ) 

これは、リストのタプルを作成し、あなたはリスト全体ではなく、個々のカードを反復します。私はあなたが望むと信じます

newlisty = pile1 + pile3 + pile2` 

これは、小さな杭を直線的に組み合わせて21の要素の複合リストを作成します。


その他のコメント:

dict秒であなたのdecktypeとカードタイプを保存することを検討してください。そうすれば、ifステートメントの長いセットを書くことなく、素早くルックアップしてパイルを生成することができます。例:

あなたは

cardtype = random.randint(1,13) 
if cardtype == 1: 
    card = "A" 
elif cardtype == 2: 
    card = "2" 
elif cardtype == 3: 
    card = "3" 
elif cardtype == 4: 
    card = "4" 
elif cardtype == 5: 
    card = "5" 
elif cardtype == 6: 
    card = "6" 
elif cardtype == 7: 
    card = "7" 
elif cardtype == 8: 
    card = "8" 
elif cardtype == 9: 
    card = "9" 
elif cardtype == 10: 
    card = "10" 
elif cardtype == 11: 
    card = "J" 
elif cardtype == 12: 
    card = "Q" 
else: 
    card = "K" 

へ...

cardtype_lookup = { 1 : 'A', 2 : '2', 3 : '3', .... 12 : 'K' } 

card = cardtype_lookup[random.randint(1, 13)] 

...などなどを減らすことができます。

+0

本当にありがとう!本当に私を助けてくれました:D私は将来的にルックアップについてのアドバイスを使うようになるでしょう:) –

+0

もう一つの改善点:ランダムなカードを選ぶのではなく、すでにデッキに入っているかどうかをチェックするだけです。すべてのカードを含むデッキを生成し、 'random.shuffle'を使ってシャッフルします。 –

+1

@BłotosmętekOoh、良いアイデア。 'itertoolsからインポート製品。ランダムインポートシャッフルから。リスト(製品(リストDHSC ')、リスト(' A123456789JQK ')+ [' 10 ']))]内のxのためのcards = [' '。シャッフル(カード); cards [:21] ' –

0

最終的な反復を超えてコードにいくつかの問題が発生していると思います。以下は私があなたの目的を達成すると信じているコメントと共にいくつかの提案です。

from random import shuffle 

# Function for generating 21 random cards 
def makedeck(): 

    # Create 52 cards by suit and cardtype 
    listy = [card + suit for card in ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] for suit in ['D','H','S','C']] 

    # Shuffle the list 
    shuffle(listy) 

    # Choose only the first 21 items of that list 
    listy = listy[:21] 

    return listy 

# Function for dividing 21-card deck into 3 equally-sized piles 
def dealdeck(listy): 

    # Iterate over listy, stepping by 3, starting with the first, second, and third item 
    list1 = listy[::3] 
    list2 = listy[1::3] 
    list3 = listy[2::3] 

    # Return the three lists as three items to correspond to the three piles of the call 
    return list1, list2, list3 

# This works 
def makepiles(pile1,pile2,pile3): 
    print("Pile 1\t\tPile 2\t\t Pile 3\t\t") 
    for i in range(7): 
     print(pile1[i],"\t\t",pile2[i],"\t\t",pile3[i],"\t\t") 

# This works 
def usercardpile(): 
    userinput = input("What pile is your card in?") 
    if userinput == "1" or userinput.title() == "One": 
     return 1 
    elif userinput == "2" or userinput.title() == "Two": 
     return 2 
    elif userinput == "3" or userinput.title() == "Three": 
     return 3 
    else: 
     print("Please only write 1, 2 or 3") 
     return usercardpile() 

listy = makedeck() 
pile1, pile2, pile3 = dealdeck(listy) 
for i in range(1,4): 
    # Because this function does not return anything, it should be run on its own, and not assigned to a variable 
    makepiles(pile1,pile2,pile3) 

    userspile = usercardpile() 

    # Now you want to re-order the piles based on user input. Because these are lists, you can simply add them together in a new order to create a newly arranged list 
    if userspile == 1: 
     newlisty = pile2 + pile1 + pile3 
    elif userspile == 2: 
     newlisty = pile1 + pile2 + pile3 
    else: 
     newlisty = pile1 + pile3 + pile2 

    # Now you create new piles based on the re-sorted list and re-iterate 
    pile1, pile2, pile3 = dealdeck(newlisty) 

# Uses .format method instead 
print("Your card is {}".format(newlisty[10])) 
関連する問題