Frage zu einem Blackjackprogramm (Anfänger)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
firede
User
Beiträge: 1
Registriert: Dienstag 14. September 2010, 21:19

Hallo,
ich bin ein Anfänger und möchte gerne ein Programm schreiben, welches die Wahrscheinlichkeit berechnet, dass der Dealer sich beim Blackjack überkauft (und wie oft er auf 17,18,19,20,21 endet). Die Regeln für den Dealer lauten: So lange ein Karte ziehen bis er bei 17 oder höher landet. Liegt er bei über 21 hat er sich überkauft. Ich gehe dabei von unendlich vielen Karten aus (sozusagen Ziehen mit zurücklegen).

Die hv-Funktion ist dafür da, dass die Asse korrekt behandelt werden, da sie sowohl als 1 als auch als 11 zählen. Ich bin mir ziemlich sicher, dass die Funktion korrekt funktioniert. Man übergibt ihr den Wert der Hand vor der neuen Karte, die neue Karte und die Anzahl der Asse (ohne das aktuelle Ass zu berücksichtigen).

Die bj-Funktion bereitet mir viel mehr Probleme. Aufgerufen werden soll das Programm mit den Werten 2 bis 11 (welches die erste Karte vom Dealer darstellen soll). Ich möchte das Problem kombinatorisch lösen und daher soll das Programm alle möglichen Kombinationen durchgehen. Ich wollte dies mittels einer rekursiven Funktion lösen. Da ergibt sich für mich auch schon das erste Problem:
Ich löse das Problem mit dem Hochzählen von der Bust-Variable mit einer globalen Variable was aber anscheinend sehr unschöner Programmierstil ist. Wie kann ich dieses Problem anders lösen? Was kann ich sonst noch besser/eleganter lösen?

Die berechneten bust/notbust Werte stimmen mit Online-Quellen überein.

Code: Alles auswählen

def hv(hvalue, card, aces):     # Calculates the new hand value depending
        if card == 11:          # on previous count, new card, number of aces
            aces += 1
        if hvalue + card > 21 and aces > 0:
            aces -= 1
            return hvalue + card - 10, aces
        else:
            return hvalue + card, aces

def bj(hvalue, aces = 0, card = 0, cycle = 0):
        global bust
        global notbust

        if cycle == 0 and hvalue == 11:
            aces = 1
        
        hvalue, aces = hv(hvalue, card, aces)
        
        if hvalue >21:
            bust = bust + 1.0/(13 ** cycle)
        if hvalue >= 17 and hvalue <= 21:
            notbust[hvalue-17] = notbust[hvalue-17] + 1.0/(13 ** cycle)
        if hvalue < 17:
            for x in [2,3,4,5,6,7,8,9,10,10,10,10,11]:
                bj(hvalue, aces, x, cycle + 1)


for x in range(2,12):
    bust = 0
    notbust = [0,0,0,0,0]
    bj(x)
    print "dealer busts showing %d: %.2f%%" % (x, bust*100)
Antworten