Schleifen Problem (evt. wegen "break"?)

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
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

Hey zusammen
Ich bin ein kleines Blackjacksimulationsprogramm am schreiben. Nun habe ich beim ersten Teil (ohne double down und split pairs) ein kleines Problem.

Code: Alles auswählen

def BJpart1(playercards, D=Deck, W=0, L=0, T=0):
    Basic_Deck = [2,3,4,5,6,7,8,9,10,10,10,10,11]
    Deck = 32*Basic_Deck
    for x in range(2,12):     #x= Karten des Dealers
        D.remove(x)
        for s in range(12,21):   # s<= stand, s> draw
            for i in range(1000):
                random.shuffle(Dnew)
                for j in range(6): # Das Ziehen weiteren sieben Karten ist unwahrscheinlich
                    if D[j]+playercards == 21:
                        Pend = 'BJP' # Player hat Blackjack -> "Blackjackplayer"
                    elif D[j]+playercards >= s:
                        Pend = D[j]+playercards #Playerend is erreicht, falls die Summe grösser als der testwert von s ist
                        break
                    else: playercards = D[j]+playercards #Das gleiche wird nun mit dem Dealer gemacht
                for k in range(6,12): #6-11, damit nicht die gleichen Karten wie beim player gezogen werde.
                    if D[k]+x == 21:
                        Dend = 'BJD'  # Dealder hat Blackjack -> "Blackjackdealer"
                    elif D[k]+x >= 17:
                        Dend = D[k]+x#Dealerend erreicht
                        break
                    else: x = Dnew[k]+x
    if Pend > 21:
        L = L + 1
    elif Pend > Dend and Pend <= 21:
        W = W + 1
    elif Pend < Dend and Dend <= 21:   # W=wins, L=losses, T=ties
        L = L + 1
    elif Pend <= 21 and Dend > 21:
        W = W + 1
    elif Pend <= 21 and Pend == Dend:
        T = T + 1
    elif Dend == 'BJD' and Pend != 'BJP':
        L = L + 1
    elif Dend == 'BJD' and Pend == 'BJP':
        T = T + 1
    elif Dend != 'BJD' and Pend == 'BJP':
        W = W + 1
    print(W, L, T)
Ich habe die Spielsituationen zwar für 10 verschiedene Karten des Dealers und 8 verschiedene "stand"-werte 1000 mal durchspielen lassen, doch ich bekomme trotzdem am schluss nu einen wert (hier 1 Loss).

Code: Alles auswählen

BJpart1(13)
0 1 0
Kann es sein dass die "break-Anweisung" alle Schleifen beendet und nicht nur die nächst-übergreifende? wenn ja hätte jemand eine Idee wie ich dieses Problem lösen könnte?
Mfg
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Kann es sein dass die "break-Anweisung" alle Schleifen beendet und nicht nur die nächst-übergreifende?
Nein.

Warum's nicht funktioniert, weiß ich aber leider nicht. Der Code ist mir zu unübersichtlich. Der Trend geht ja zur Zweitfunktion. Die ist auch gar nicht so teuer, und fast jeder kann sich weitere Funktionen leisten. Gleiches gilt für längere Variablennamen.

Stefan
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und bitte lauffähigen Code posten. Mein Python hat leider kein Built-In Objekt namens `Deck` und auch `Dnew` bei `random.shuffle()` wird einen `NameError` werfen.

Dann noch als Ergänzung zu sma: Wenn man sich selbst zu mehr Struktur im Code zwingt (z.B. "sprechende Namen" statt Kommentare in jeder zweiten Zeile, Einsatz von Hilfsfunktionen, ...), dann lösen sich viele Probleme von selbst. Ich weiß nicht so recht, ob du dir über den Ablauf an jeder Stelle des Codes im Klaren bist. Spätestens in 2-3 Monaten bist du es sicherlich nicht mehr. Also, ich blicke da auf Anhieb nicht wirklich durch.
n3xtplayer
User
Beiträge: 37
Registriert: Sonntag 2. Oktober 2011, 12:13

@snafu: Sorry, hab gerade gesehen, dass es fehler darin hat. Habe eben zwei Fenster nebeneinander geöffnet gehabt und das falsche kopiert. Die Unterschiede sind: "Dnew" sind alle durch "D" ersetzt worden. Und "Deck" ist kein Builtin-Objekt: Ich habe es aus der Klammer gelöscht und auf Zeile 4 D = Deck definiert. :) Sorry, mein Fehler.

Aber ihr habt natürlich beide recht. Ich bin ganz neu in Python und im Programmieren (vor einer Woche angefangen) und es ist recht chaotisch. Ich versuche nun mal alles ein wenig übersichtlicher daszustellen und wenn es dann immer noch nicht funktioniert, dann frage ich noch mal :)
LG
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

n3xtplayer hat geschrieben:Und "Deck" ist kein Builtin-Objekt
Das ist mir schon klar. Ich hätte wohl einen Zwinker-Smiley dahinter setzen sollen.
Antworten