ubuntuusers.de

Python- Kopf oder Zahl- spiel

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Pokerface1993

Anmeldungsdatum:
6. Juni 2008

Beiträge: 21

hallo alle zusammen, ich lerne zurzeit python und hatte die idee ein münzwurfspiel zu programmieren. nun kenne ich mich aber noch nicht genau mit den "random" befehl aus. dazu habe ich eine frage an euch: wie speichert man den zufallswert (in diesem fall 1 oder 2) in einer variable (in diesem fall zufall)?

mfg und danke im vorraus ps: ich hatte auch für zufall schon random eingesetzt, aber dann verliert man ständig, da der eingebene wert nie dem zufallswert entspricht.

# kopf oder zahl-spiel
geld = 500
konstant = 1
while geld > 0:
    setzen = 0
    print('sie haben', geld, ' euro')
    while konstant == 1:
        setzen = int(raw_input('Wieviel Geld möchten sie setzen?: \n'))
        if setzen <= geld:
            break
        else:
            print('sie haben nur', geld, ' euro !')
    geld = geld - setzen
    while konstant == 1:
        kopfoderzahl = str(raw_input('Kopf oder Zahl ?: \n'))
        if kopfoderzahl == 'kopf' or kopfoderzahl == 'Kopf' or kopfoderzahl == 'KOPF' or kopfoderzahl == 'zahl' or kopfoderzahl == 'Zahl' or kopfoderzahl == 'ZAHL':
            break
        else:
            print('Geben sie nicht so einen mist ein!')
    if kopfoderzahl == 'kopf' or kopfoderzahl == 'Kopf' or kopfoderzahl == 'KOPF':
        pruef = 1
    else:
        pruef = 2
    import random
    zufall.randint(1,2)
    if pruef == zufall:
        geld = geld + 2 * setzen
        print('Gewonnen!')
    else:
        print('Verloren!')
        
    if geld <= 0:
        break
print('fertig')

dAnjou

Avatar von dAnjou

Anmeldungsdatum:
8. Oktober 2007

Beiträge: 872

Wohnort: Berlin

http://forum.ubuntuusers.de/topic/python-zufallszahlen-erzeugen/

Vielleicht hilft der. Vorher bitte immer recherchieren.

EDIT sagt, dass das hier sehr gut bei ihr funktioniert: http://paste.pocoo.org/show/106093/

jug Team-Icon

Ehemalige
Avatar von jug

Anmeldungsdatum:
19. März 2007

Beiträge: 12335

Wohnort: Berlin

dAnjou schrieb:

http://forum.ubuntuusers.de/topic/python-zufallszahlen-erzeugen/

Vielleicht hilft der. Vorher bitte immer recherchieren.

Die Frage war aber, die man den Rückgabewert von random.randint() einer Variable zuweist. Antwort: Genau so wie man jeder anderen Variable auch einen Wert zuweist:

1
zufall = random.randint(1,2)

Übrigens kannst du an deinem Script noch einiges vereinfachen.

1
if kopfoderzahl == 'kopf' or kopfoderzahl == 'Kopf' or kopfoderzahl == 'KOPF' or kopfoderzahl == 'zahl' or kopfoderzahl == 'Zahl' or kopfoderzahl == 'ZAHL':

du kannst kopfoderzahl einfach mit lower(var) in Kleinbuchstaben konvertieren, dann brauchst du dir um die Schreibweise keine Gedanken machen.

Die selbe Abfrage hast du übrigens zweimal drin, mindestens eine davon ist redundant, wenn du die Variable pruef gleich beim ersten Mal setzt. €dit: Sorry, ist eine ähnliche Abfrage.

~jug

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4773

Wohnort: Berlin

@Pokerface1993: Namen von Konstanten schreibt man per Konvention bei vielen Programmiersprachen komplett in Grossbuchstaben. Allerdings ist Deine Konstante unnötig weil beim Vergleich konstante == 1 immer True heraus kommt – also kann man auch gleich while True: schreiben.

Die runden Klammern bei print sind falsch, weil print eine Anweisung und keine Funktion ist. Bei der Ausgabe von den Geldbeträgen hätte Dir das eigentlich auffallen müssen, denn da wird ja nicht der Text ausgegeben, wie Du ihn wohl gerne hättest, sondern die Tupel, die durch die Klammern und die Kommata erstellt werden. Ab Python 3.0 ist print eine Funktion, aber da gibt's dann kein raw_input() mehr, also benutzt Du offensichtlich eine Version vor 3.0.

raw_input() gibt schon eine Zeichenkette zurück, da muss man also nicht noch einmal str() drauf anwenden.

Zur Überprüfung der Eingabe wurde ja schon etwas gesagt. Zusätzlich zum Umwandeln kann man noch die beiden Möglichkeiten in ein Tupel stecken und den in-Operator zum Testen verwenden statt zwei Tests mit or zu verknüpfen.

Vielleicht sollte man die Eingabe auch nur auf den Anfangsbuchstaben prüfen, dann braucht der Benutzer nicht so viel eingeben. Und statt Zahlen zu verwenden, könntest Du auch mit random.choice() aus einer Sequenz ein zufälliges Element auswählen.

gkuhl

Avatar von gkuhl

Anmeldungsdatum:
1. Dezember 2007

Beiträge: 99

Wohnort: Hong Kong

Importe gehoehren, aus Grunden der Uebersichtlichkeit, an den Anfang des Skripts.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2148

Wohnort: Gelsenkirchen

Wobei der Pseudozufall bei so wenigen Zahlen gerne mal zu häufigen Wiederholungen neigt. Hier eine Funktion für Ergebnisse, die mehr dem "alltäglichen" Verständnis von Zufall entsprechen, indem sie auftretende Wiederholungen begrenzt:

1
2
3
4
5
6
7
8
9
import random
from itertools import groupby

def get_random_numbers(values, size=10, max_repeat=3, max_tries=10):
    for _ in range(max_tries):
        numbers = random.choices(values, k=size)
        if all(len(list(group)) <= max_repeat for _, group in groupby(numbers)):
            return numbers
    raise ValueError("Could not find suitable numbers")

EDIT: Warum ich jetzt in einem so alten Beitrag gelandet bin, weiß ich nicht. Gerade stand der Thread noch ganz oben. Vermutlich ist jemandem das gleiche passiert und der Beitrag wurde entfernt. Meinen lasse ich jetzt jedenfalls stehen. ☺

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 8002

snafu1 schrieb:

EDIT: Warum ich jetzt in einem so alten Beitrag gelandet bin, weiß ich nicht. Gerade stand der Thread noch ganz oben. Vermutlich ist jemandem das gleiche passiert und der Beitrag wurde entfernt. Meinen lasse ich jetzt jedenfalls stehen. ☺

Der Thread wurde mit Spam nach oben geholt.

Also lasst die Leiche jetzt bitte in Ruhe.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4773

Wohnort: Berlin

@snafu1: Damit fördert man doch aber ein falsches Verständnis von Zufall. Das ist doch dann eine Erfahrung, die falsche Annahmen über Zufall bestätigt. In einer Zeit wo Aluhut-Träger zu allem möglichen sagen, dass kann nie und nimmer nicht Zufall sein, finde ich das nicht ganz ungefährlich. Auf die Frage: „Jetzt wurde 10 mal Kopf geworfen; wie hoch ist die Wahrscheinlichkeit beim nächsten Münzwurf Kopf zu bekommen?” sollte jeder die Antwort „50/50“ verstanden haben. Und nicht irgendwie glauben da gäbe es magische Wesen, die mitzählen, und Kopf jetzt nicht die gleiche Wahrscheinlichkeit hat, wie bei jedem vorhergehenden Wurf.

Zum ursprünglichen Quelltext: setzen sollte eigentlich einsatz heissen und muss nicht auf eine 0 gesetzt werden, die nie irgendwo verwendet wird.

Die ganzen bisherigen Anmerkungen mal umgesetzt und das Programm in die Gegenwart (Python 3) geholt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python3
import random

CHOICES = ["kopf", "zahl"]


def main():
    geld = 500
    while geld > 0:
        print("Sie haben", geld, "Euro.")
        while True:
            einsatz = int(input("Wieviel Geld möchten Sie setzen?: \n"))
            if einsatz <= geld:
                break
            print("Sie haben nur", geld, "Euro!")

        geld -= einsatz

        while True:
            tipp = input("Kopf oder Zahl?\n").lower()
            if tipp in CHOICES:
                break
            print("Geben Sie nicht so einen Mist ein!")

        if tipp == random.choice(CHOICES):
            geld += 2 * einsatz
            print("Gewonnen!")
        else:
            print("Verloren!")

    print("fertig")


if __name__ == "__main__":
    main()

Nächster Schritt: Sinnvoll damit umgehen wenn der Benutzer bei der Frage nach dem Einsatz keine (ganze) Zahl eingibt.

Antworten |