2016-05-07 32 views
0

Ich versuche, ein Spiel von Blackjack in Python zu debuggen, aber ich kann nicht herausfinden, wie Ace durch König umzusetzen, sobald die Hand ausgeteilt wird. Ich brauche einen Hinweis oder etwas ... übersehe ich vielleicht etwas Offensichtliches?Python Blackjack Listen und spezielle Werte

MAX = 21 


# main function 

def main(): 
    # Local variables 

    hand1 = 0 

    hand2 = 0 

    deck = create_deck() 

    while hand1 <= 21 and hand2 <= 21: 
     card1, value1 = deck.popitem() 

     hand1 = update_hand_value(hand1, value1, card1) 

     card2, value2 = deck.popitem() 

     hand2 = update_hand_value(hand2, value2, card2) 

     print('Player 1 was dealt', card1) 

     print('Player 2 was dealt', card2) 

     print() 

    # Determine the winner. 

    if hand1 > MAX and hand2 > MAX: 

     print("There is no winner.") 

    elif hand1 > 21: 

     print("Player 2 wins.") 

    else: 

     print("Player 1 wins.") 


def create_deck(): 
    # Set up local variables 

    suits = ['Spades', 'Hearts', 'Clubs', 'Diamonds'] 

    # unused currently, needs to be implemented 
    special_values = {'Ace': 1, 'King': 10, 'Queen': 10, 'Jack': 10} 

    numbers = ['Ace', 'King', 'Queen', 'Jack'] 

    for i in range(2, 11): 
     numbers.append(str(i)) 

    # Initialize deck 

    deck = {} 

    for suit in suits: 

     for num in numbers: 

      # Values 2-10. 

      if num.isnumeric(): 
       deck[num + ' of ' + suit] = int(num) 
      else: 
       deck[num + ' of ' + suit] = str(num) 
      # values 1 and 11 

    return deck 


def update_hand_value(hand, value, card): 
    if not card == 'Ace': 

     return hand, value 

    # Adding 11 would cause to go over the maximum. 

    elif hand > 10: 

     # Value is 1 by default. 

     return hand, value 

    else: 

     return hand + 11 


# Call the main function. 

main() 


# Call the main function. 

main() 

Karten werden ausgeteilt, bis ein Spieler gewinnt.

Beispielausgabe:

Spieler 1 2 von Diamanten behandelt wurde 2 Player 8 Pik

Spieler 1 behandelt wurde 6 of Diamonds Spieler 2 behandelt wurde 5 von Diamanten behandelt wurde

Spieler 1 wurde 4 von Clubs ausgeteilt Spieler 2 wurde 8 von Diamanten

ausgeteilt Spieler 1 wurde 7 der Clubs ausgeteilt Spieler 2 wurde 3 von ausgeteilt Spaten

Spieler 1 gewinnt.

EDIT: Ich habe mein Programm geändert, aber ich bekomme einen neuen Fehler.

Traceback (jüngste Aufforderung zuletzt): Datei "C: /Users/Sean/PycharmProjects/SeanPython/ISY150/Demo/Blackjack.py", Linie 99, in main() Datei „C:/Users /Sean/PycharmProjects/SeanPython/ISY150/Demo/Blackjack.py“, Zeile 17, in dem Haupt während hand1 < = 21 und hand2 < = 21: Typeerror: unorderable Typen: Tupel() < = int()

Ich verstehe nicht, in Zeile 17 Ich vergleiche kein Tupel mit einem Int, soweit ich weiß ...

+0

könnte hilfreich sein http://stackoverflow.com/questions/30698740/treating-a-string-as-an-integer/30698781#30698781 –

+0

Hatte mein Programm zu bearbeiten. Außerdem stelle ich mir vor, dass dieses Programm auf eine bestimmte Art und Weise durchgeführt werden muss. Ich habe ein anderes funktionierendes Blackjack-Programm. Dieser muss nur so gemacht werden. Ich muss es als Übung debuggen. – Powerwaffe

Antwort

0

Die wichtigsten pr Problem ist, dass Sie verschiedene Rückgabetypen mit Ihrer update_hand_value Funktion haben. Sie geben ein Tupel innerhalb Ihrer if- und elif-Anweisungen zurück, aber eine Ganzzahl innerhalb der else.

Es gibt eine Reihe anderer Probleme, also werde ich ein paar Vorschläge durchgehen, um Ihnen zu helfen.

1) Sie verwenden .pop() aus einer dict, die in der Reihenfolge erstellt wurde. Daher erhalten Sie immer die gleiche Reihenfolge der Karten. Versuchen Sie, das Deck zu mischen, indem Sie verwenden, bevor Sie das Diktat aus diesen Listen erstellen. Insbesondere tun np.random.shuffle(suits) und np.random.shuffle(numbers) rechts, bevor Sie Ihre for Schleife tun dies in create_deck()

2) Verwendung: if type(num) == int: deck[str(num) + ' of ' + suit] = int(num) else: deck[num + ' of ' + suit] = str(num) #here ace, queen, and king, have strings as value in key:value pairs

3) Sie eigentlich nie die Hand-Wert in update_hand_value() aktualisieren diese so versuchen:

if card != 'Ace': #complete all cases where card was not an ace 
     if type(value) == int: #a number was drawn - add number to hand 
     hand = hand + value 
     return hand 
     elif type(value) == str: #this is a jack, queen, or king - add ten to hand 
     hand = hand + 10 
     return hand 

    else: #card was an ace 
     if hand + 11 == 21: #stop 
      hand = hand + 11 
      return hand 
     elif hand + 11 > 21: #only add one 
      hand = hand + 1 
      return hand 

4) Schließlich müssen Sie die Gesamtanzahl der Karten eines Spielers im Auge behalten. Eine 11 für Ass kann zu einer Eins wechseln, wenn eine Karte 21 bringt. Ich überlasse dir dies, um herauszufinden, aber versuche, eine Liste zu übergeben, um die Hand zu aktualisieren und sie nach Assen zu durchsuchen.

Prost

+0

Bitte markieren Sie dies als abgeschlossen oder nicht – XtremeJake

Verwandte Themen