Problem beim Spiel "SicBo"

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
CoOny91
User
Beiträge: 5
Registriert: Mittwoch 7. Oktober 2009, 14:36

Tag Leute,

also ich habe folgendes Programm zum asiatischen Glücksspiel "SicBo" geschrieben.. Allerdings habe ich das Problem, dass das Programm nicht mehr funktioniert, sobald mehr als ein Spieler daran teilnimmt (anzahl > 1).
Außerdem lässt das Programm den Spieler noch einmal eine Runde "spielen", obwohl dieser einen Kontostand von 0 besitzt, anstatt das Programm direkt zu beenden.
Könntet ihr mir -wenn möglich- in diesen beiden Punkten weiterhelfen?

P.S: Bin absoluter Anfänger auf dem Python-Gebiet, wie ihr vll auch am Quelltext erkenenn werdet.

Code: Alles auswählen

#Unterprogramm(e)

#Unterprogramm zur Auszahlung bei den Wetten auf bestimmte Summen

def gewinn (konto,k2,einsatz2,zahl2,z2):                                                
    if zahl2 == var:
        konto[k2] = konto[k2] + z2*einsatz2[k2]
        g.append(z2*einsatz2[k2])                                                  
    else:
        konto[k2] = konto[k2] - einsatz2[k2]
        einsatz2[k2] = einsatz2[k2] * int(-1)
        g.append(einsatz2[k2])
        if konto[k2] < 0:
            konto[k2] = 0

# Einleitung in das Spiel (Spielregeln)
 
print("Hallo zum asiatischen Würfelspiel SicBo!")
print(" ")
print("Lesen Sie sich bitte vor Beginn des Spiels die Spielregeln durch:")
print(" ")
print("Das Ziel des Spiels ist es, die Kombination von Nummern, die auf den 3 Würfeln erscheinen werden, vorherzusagen.")
print("Dabei gibt es verschiedene WettmöglichKeiten: ")
print(" ")
print("Zahlenwette: Der Spieler gewinnt, wenn genau die Augensumme gewürfelt wird, auf die er gewettet hat. Die Auszahlung erfolgt dabei - je nach Zahl - bis zu einem Verhältnis von 60:1.") 
print(" ")
print("Wette UNDER 10: Der Spieler gewinnt, wenn die Gesamtsumme auf den drei Würfeln zwischen 4 und 10 liegt. Die Auszahlung erfolgt im Verhältnis 1:1. ")
print(" ")
print("Wette OVER 11: Der Spieler gewinnt, wenn die Gesamtsumme auf den drei Würfeln zwischen 11 und 17 liegt. Die Auszahlung erfolgt im Verhältnis 1:1.")
print(" ")
print("Wette Triple: Der Spieler gewinnt, wenn ein Triple gewürfelt wird, also drei Würfel mit der gleichen Augenzahl(Summe 3,6,9,12,15,18). Die Auszahlung erfolgt im Verhältnis 30:1.") 
print(" ")


# Beginn des Programms

import random

random.seed()

runde = 1
anzahl = int(input('Wie viele Spieler gibt es? '))


# Spieler initialisieren

k = 0
name = []
while k < anzahl:
    print('Spieler',k + 1,':')
    name.append(str(input('Bitte geben sie ihren Namen ein! '))) 
    print("Hallo",name[k],"!")
    k = k + 1
    print()

konto = int(input('Geben Sie bitte das Startguthaben ein: '))


# Konto initialisieren

g = 0
sk = []
while g <= anzahl:
    sk.append(konto)
    g = g + 1


# Beginn des eigentlichen Spiels

   
while runde > 0:
    global var
    var = random.randint(3,18)                                                               # die Zahl wird festgelegt
    einsatz = []
    g = []
    k = 0
    while k < anzahl:
        if sk[k] <= 0:                                                                       # Überprüfen ob ein Spieler den Kontostand 0 besitzt, wenn ja setzt dieser aus, ansonsten beginnt für ihn das Spiel
            print(name[k],'hat kein Geld mehr auf seinem Konto. Er hat verloren und kann daher nicht mehr am Spiel teilnehmen.')
            einsatz.append(0)
            g.append(0)
            runde = 0
            k = 10000
        else:
            print(name[k],'ist an der Reihe.')
            print("Ihr Kontoguthaben beträgt: ",sk[k])
            einsatz.append(int(input('Wie viel möchten Sie setzen? ')))                     # Einsatz des Spielers wird gesetzt
            
            while  einsatz[k] < 1 or einsatz[k] > sk[k]:
                print('Der Einsatz übersteigt Ihr Budget oder ist zu niedrig!')
                einsatz[k] = int(input('Wie viel möchten Sie setzen? '))                     # Schleife die ein Zuviel- oder Zuwenig-Setzen verhindert
    
            wette = str(input("Möchten Sie auf eine bestimmte Summe setzen (j/n)? "))       # Einschränkung der Wette beginnt (bestimmte Summe) --> Wette: bestimmte Summe

            if wette == 'j':
                zahl = int(input("Bitte die gewünschte Summe eingeben (4-17): "))            # der Spieler muss auf eine Zahl zwischen 4 und 17 wetten
                
                while  zahl < 4 or zahl > 17:
                    print('Diese Summe existiert nicht beim SicBo!')
                    zahl = int(input("Bitte die zahl eingeben (4-17): "))                    # Schleife die ein Falschsetzen verhindert
                    
                if zahl == 4 or zahl == 17:
                    z = 60
                elif zahl == 5 or zahl == 16:
                    z = 30
                elif zahl == 6 or zahl == 15:
                    z = 18
                elif zahl == 7 or zahl == 14:                                                #Festlegung der Auszahlungsquoten bei den bestimmten Summen
                    z = 12
                elif zahl == 8 or zahl == 13:
                    z = 8
                elif zahl == 9 or zahl == 12:
                    z = 7
                elif zahl == 10 or zahl == 11:
                    z = 6
                gewinn(sk,k,einsatz,zahl,z)                                                  #Aufruf Unterprogramm --> Auszahlung der Wette auf die bestimmte Summe
      
            else:
                art = input ('Möchten sie auf Under 11 (under), Over10 (over) oder auf ein unbestimmtes Triple (triple) setzen?')   # weitere Einschränkung der Wette, falls der Spieler nicht auf eine bestimmte Summe wetten möchte
                if art == 'under':                                                           # Wette "Under11"
                    if var < 11:
                        sk[k] = sk[k] + einsatz[k]
                        g.append(0 + einsatz[k])
                    else:
                        sk[k] = sk[k] - einsatz[k]
                        g.append(0 - einsatz[k])
                else:
                    if art == 'over':                                                        # Wette "Over10"
                        if var > 10:
                              sk[k] = sk[k] + einsatz[k]
                              g.append(einsatz[k])
                        else:
                             sk[k] = sk[k] - einsatz[k]
                             g.append(0-einsatz[k])
                    else:
                        if art == 'triple':                                                  # Wette "Triple"
                            if var == 3 or var == 6 or var == 9 or var == 12 or var == 15 or var == 18:
                                sk[k] = sk[k] + 30*einsatz[k]
                                g.append(30*einsatz[k])
                            else:
                                sk[k] = sk[k] - einsatz[k]
                                g.append(0-einsatz[k])
        k = k + 1
        print()
        print("Die Zahl ",var," ist gefallen!")                                              # Ausgabe der gewürfelten Zahl

        k = 0
        while k < anzahl:
            if  g[k] > 0:
                print(name[k],'hat',g[k],'Gewinn gemacht!')                                  #Ausgabe des Gewinn des Spielers           
                print('neuer Kontostand ',name[k],': ',sk[k])                                #Ausgabe des neuen Kontostands
            else:
                print(name[k],'hat',g[k]*int(-1),'Verlust gemacht!')                         #Ausgabe des Verlusts des Spielers
                print('neuer Kontostand ',name[k],': ',sk[k])                                #Ausgabe des neuen Kontostands
            k = k + 1 
               
        if sk[k] == 0 :
            print("Der Spieler ",k," hat das Spiel verloren!")
        else:
            runden = input("Möchten Sie noch eine Runde spielen (j/n)?")                    # Abfrage nach einer weiteren Runde
            if runden == 'n':
                runde = 0
                print ('Auf Wiedersehen!')


        print()


k = 0   

print() 
Zuletzt geändert von CoOny91 am Mittwoch 7. Oktober 2009, 19:04, insgesamt 4-mal geändert.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Benutz' Code-Tags, oder hier vielleicht gleich einen Paste-bin! - Ich bin bestimmt nicht der einzige, der nicht versucht, deinen Code aus dem HTML-Quelltext zu kopieren 8)
CoOny91
User
Beiträge: 5
Registriert: Mittwoch 7. Oktober 2009, 14:36

so besseR?^^ danke :P
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Nicht wirklich Code-Tags für Python-Code: [ code=py ][ /code ]
the more they change the more they stay the same
CoOny91
User
Beiträge: 5
Registriert: Mittwoch 7. Oktober 2009, 14:36

ok danke^^
und mit dem problem wie siehts da aus?
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Ich will hier nicht extra negativ rüberkommen, aber
- Dein Code sieht gruselig aus:
- viel zu breit
- nichtssagende und/oder unlogische Namen (k, k2, 'konto' für den Einstiegsetrag)
- die 'Struktur' ist, naja, 'schwer durchschaubar' (Spielernamen und -konten getrennt?)
- unnötige 'global' Variable

Hast du z.B. mal von multiline strings("""Beliebiger Text""") und dict()s (statt der vielen if:elif:elif:else) gehört?

Ich knabbere noch daran, wie dein Programm funktionieren soll (hab kein Python 3, und werde auch jetzt nicht damit anfangen) - aber ich bau 'ne funktionierende Version.

hth, Jörg
ps.: Als Debug-Hilfe, lass dir mal deine konten-Liste jede runde ausgeben
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
CoOny91
User
Beiträge: 5
Registriert: Mittwoch 7. Oktober 2009, 14:36

keine angst, genau dieses negative möchte ich ja hören^^
es ist einfach so, dass ich wirklich ein absoluter anfänger bin und deshalb z.b. von dict() oder multistrings noch nie gehört habe weshalb ich den code mit hilfe anderer leute so einfach wie möglich gestaltet habe auch wenn es gruselig aussieht... ich würde das programm einfach nur gern richtig zum laufen bringen^^
das programm soll so funktionieren dass eine bestimmte summe gewürfelt wird, auf die der spieler bestimmte wetten (under10, over11 usw.) platzieren kann..

danke schonmal für deine hilfe =)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Statt

Code: Alles auswählen

if foo == 23 or foo == 42:
    pass
kann man auch kürzer

Code: Alles auswählen

if foo in (23, 42):
    pass
schreiben.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Ich hab's mal für python 2.6 nachgebaut.
Das ist aber nicht vollständig: nur die Summen-wette und Over/under funktionieren - außerdem gehen keine Umlaute in den Spielernamen (da war ich zu faul).
Aber ich finde es deutlicher 'pythonesker', mit einer Klasse, flexiblen callbacks, lauter for-schleifen, list-comprehensions, aber quasi ohne Kommentare :twisted:

hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Als absoluter Anfänger wäre es vermutlich besser, erstmal das Tutorial durchzuarbeiten, als fremden Quellcode per Copy'n'Paste zusammenzufrickeln. Auch A Byte of Python ist zu empfehlen.
CoOny91
User
Beiträge: 5
Registriert: Mittwoch 7. Oktober 2009, 14:36

danke für eure hilfe schonmal =)
Antworten