Hilfe für Glücksspielcode komme nicht weiter :(

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
M&M's_Knabberer
User
Beiträge: 34
Registriert: Sonntag 27. September 2015, 17:05

Kann mir jemand helfen?
Ich komme nicht weiter :(

Ziel ein Glücksspiel mit 3 Zahlen die ausgegeben werden, bei richtiger Kombination hat man Gewonnen etc..
Das hatte soweit auch geklappt aber ich wollte dann wenn man kein Geld mehr hat die While Schleife beenden..
hat soweit auch geklappt.
Dann wollte ich aber das wenn man per raw_input() neues Geld aufbucht weiterspielen kann.. und das hatte nicht geklappt dann kam ne Fehlermeldung von int/str etc..
Dann dachte ich pack ich das halt in ne Funktion und ruf dann die Funktion neu auf wenn Geld gebucht wurde, aber das geht irgendwie auch nicht, mein Hirn ist jetz irgendwie ausgelutscht :(


Code: Alles auswählen

import random

def Spiel():
    
    
    
    a = raw_input('Geld Einwerfen: ')
    Konto = a
    while active:
        x1 = random.randint(1,5)
        x2 = random.randint(1,5)
        x3 = random.randint(1,5)
        Konto = Konto - 10
        print x1, x2, x3
        print 'Konto: ',Konto

        if x1 == x2 and x2 == x3:
            print 'Gewonnen'
            Konto = Konto + 20
            print 'Konto: ', Konto
            print''

        if x1 == 5 and x2 == 5 and x3 == 5:
            print 'Jackpott'
            Konto = Konto + 100
            print 'Konto: ', Konto
            print ''
        a = raw_input()
        if Konto <= 0:
            active = False
            print 'Geld einwerfen'
            b = raw_input('Geld ? ')
            print 'eingabe ist: ', b
            Konto = b
            print 'Konto: ',Konto
            if Konto >=10:
                Spiel()


active = True    
Konto = 0
print 'Konto: ' ,Konto
Spiel()
BlackJack

@M&M's_Knabberer: Versuchs mal mit tatsächlichen Funktionen. Eine Funktion ist nicht einfach nur ein benannter Code-Block, sondern sollte ein in sich geschlossenes Stück Code sein, dass nicht versucht auf irgendwelche Werte von ausserhalb (ausser Konstanten) zuzugreifen und die schon gar nicht verändern. Werte betreten eine Funktion als Argumente und verlassen sie als Rückgabewerte.

Und Funktionen sollten sich nicht rekursiv aufrufen wenn es nicht tatsächlich darum geht eine rekursives Problem zu lösen. Ein Funktionsaufruf ist keine einfache Sprunganweisung die man als GOTO missbrauchen kann weil man den Code nicht ordentlich strukturiert hat. Um etwas zu wiederholen gibt es Schleifen.

Du musst auch ein bisschen mehr darauf achten welchen Datentyp die Werte haben und was deshalb damit machen kann und was nicht. `raw_input()` liefert Zeichenketten. Wenn Du damit rechnen willst, musst Du die in eine Zahl umwandeln.
BlackJack

@M&M's_Knabberer: Das ganze liesse sich ohne separate Funktionen so ausdrücken:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from random import randint


def main():
    stake = 10
    balance = 0
    try:
        while True:
            while balance < stake:
                print('Kontostand:', balance)
                try:
                    amount = int(raw_input('Geld einwerfen: '))
                except ValueError:
                    print('Bitte eine Zahl eingeben!')
                else:
                    if amount < 0:
                        print('Bitte eine positive Zahl eingeben.')
                    else:
                        balance += amount
            while balance >= stake:
                print('Kontostand:', balance)
                balance -= stake
                a, b, c = (randint(1, 5) for _ in xrange(3))
                if a == b == c:
                    print('Gewonnen')
                    balance += stake * 2
                    if a == 5:
                        print('Jackpot')
                        balance += stake * 10
                raw_input()
    except KeyboardInterrupt:
        print('Bye...')


if __name__ == '__main__':
    main()
Das ist aber schon ziemlich komplex und unübersichtlich. Darum sollte man den Code sinnvoll auf Funktionen aufteilen. Eine Funktion macht genau eine, in sich geschlossene Sache.

Die Hauptfunktion kann man grob in das Aufladen des Kontos und spielen des Spiels einteilen. Schon hätte man zwei Funktionen die man auslagern kann.

Ein Teil des Aufladens ist es den Benutzer nach einer positiven, ganzen Zahl zu fragen. Auch das kann man in eine Funktion heraus ziehen.

Aus dem Spiel selbst kann man eine Funktion herausziehen die *eine* Spielrunde durchführt.

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from random import randint


def ask_for_positive_int(prompt):
    while True:
        try:
            value = int(raw_input(prompt))
        except ValueError:
            print('Bitte eine Zahl eingeben!')
        else:
            if value < 0:
                print('Bitte eine positive Zahl eingeben.')
            else:
                return value


def recharge_balance(balance, minimum_amount):
    while balance < minimum_amount:
        print('Kontostand:', balance)
        balance += ask_for_positive_int('Geld einwerfen: ')
    return balance


def play_round():
    result = 0
    a, b, c = (randint(1, 5) for _ in xrange(3))
    if a == b == c:
        print('Gewonnen')
        result += 2
        if a == 5:
            assert b == 5 and c == 5
            print('Jackpot')
            result += 10
    return result


def play_game(balance, stake):
    while balance >= stake:
        print('Kontostand:', balance)
        balance -= stake
        balance += play_round() * stake
        raw_input()
    return balance


def main():
    stake = 10
    balance = 0
    try:
        while True:
            balance = recharge_balance(balance, stake)
            balance = play_game(balance, stake)
    except KeyboardInterrupt:
        print('Bye...')


if __name__ == '__main__':
    main()
Damit hat man jetzt mehrere kleinere Funktionen die sich leicht verstehen lassen.

Optimal ist das noch nicht, weil das nicht wirklich gut automatisiert testbar ist und weil Benutzerinteraktion und Programmlogik vermischt sind.
M&M's_Knabberer
User
Beiträge: 34
Registriert: Sonntag 27. September 2015, 17:05

Danke für den Tipp mit dem int()
jetzt funktioniert das Glücksspiel einwandfrei :) Und ich brauchte mich auch garnicht mit den seltsamen unverständliegen Klassen auseinanderzusetzen^^ :mrgreen:

Code: Alles auswählen

import random


active = True    
Konto = 0
print 'Konto: ' ,Konto
a = raw_input('Geld Einwerfen ') 
a =int(a)
Konto = Konto + a
print 'gebucht: ', Konto
print ''
print 'starten', 'Spieleinsatz 10'
raw_input()
while active:
    x1 = random.randint(1,4)
    x2 = random.randint(1,4)
    x3 = random.randint(1,4)
    Konto = Konto - 10
    print x1, x2, x3
    print 'Konto: ',Konto
    raw_input()

    if x1 == x2 and x2 == x3:
        print 'Gewonnen'
        Konto = Konto + 20
        print 'Konto: ', Konto
        print''
    
    if x1 == 5 and x2 == 5 and x3 == 5:
        print 'Jackpott'
        Konto = Konto + 500
        print 'Konto: ', Konto
        print ''

    if Konto <= 0:
        active = False
        print 'Spiel zuende'
        b = raw_input('Geld einwerfen ')
        b = int(b)
        Konto = Konto + b
        print 'gebucht: ' , Konto
        if Konto >= 10:
            raw_input()
            active = True
        else:
            raw_input('Spiel Zuende')
            
BlackJack

@M&M's_Knabberer: Bevor Du Dich mit Klassen auseinander setzt, solltest Du Dich mit Funktionen beschäftigen. Und zwar wirklich dringend. Du hast da schon eine Codewiederholung zur Eingabe von einem Geldbetrag die nicht sein sollte und insgesamt ist es nur sehr beschränkt was man ohne Funktionen sinnvoll umsetzen kann.
M&M's_Knabberer
User
Beiträge: 34
Registriert: Sonntag 27. September 2015, 17:05

Nagut das klingt sinnvoll danke :)
Antworten