Pokerspiel und Zahlenraten

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 15. Dezember 2008, 22:22

Kleine Spielchen ist doch gut! Nur Poker ist eben eher heftig ;-) (Würde man schon mal daran merken, die Regeln simpel asl Prosa aufzuschreiben ...)

Wie wärs mit einem Hangman ... das scheint ja sehr beliebt zu sein bei Anfängern :-D

Ansonsten etwas wie TicTacToe oder Mastermind. Eigentlich relativ simpel aber sicherlich fordernd genug zu Beginn.

Muss ja auch kein Spielchen sein, aber man sollte sich schon selber mit einer spannenden Herausforderung motivieren - sonst verliert man dann doch die Lust!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Montag 15. Dezember 2008, 22:41

Vielleicht sogar noch simpler anfangen mit einem schlichten Zahlenraten:

Dein Computer denkt sich eine Zahl aus, du musst sie raten.
Du wirst jeweils nur darüber informiert, ob dein Rateversuch zu groß oder zu klein war. Sicher, das ist keine aufregende Sache, aber wenn es dir gelingt, das ganz alleine zu programmieren, dann ist das ein echtes Erfolgserlebnis.

Das kann man dann in verschiedene Richtungen erweitern:
- Nicht nur die Anzahl der Rateversuche zählen, sondern auch die benötigte Ratezeit messen
- Eine Highscoreliste führen, die als Datei abgespeichert/eingelesen wird
- Das Spiel - irgendwann! - in eine kleine GUI verpacken, für den Anfang am besten in Tkinter; dazu gibt es in "deinem Buch" rund 100 Seiten!

Dranbleiben, nicht aufgeben. Aller Anfang ist schwer ...
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Montag 15. Dezember 2008, 23:06

Code: Alles auswählen

import random
print "Versuche die vom Programm zufaellig ausgewaehlte Zahl zu erraten,\nschreibe die Zahlen die du angibst bitte in Klammern"

list = [0,1,2,3,4,5,6,7,8,9]
guess = 0
sec = random.sample(list,1)

while guess != sec:
    guess = input("Rate die Zahl: ")
    if guess != sec:

        print "falsch, versuch es nochmal: "
    else:
        print "richtig"
        print "die gesuchte Zahl war: ", sec
        break 
Solch kleine Programme bekomm ich ja schon hin. Hab auch schon ein Hangman programmiert. Und mit Tkinter einen eigenen Taschenrechner gemacht, was bisher mein grösstes und schönstes Projekt war.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 15. Dezember 2008, 23:37

Zu Zeile 2: Es gibt multiline Strings, `\n' in Lauftext ist doch sehr ... schlecht lesbar.

Zu Zeile 9: Solang du nicht Python 3 benutzt, solltest du von input Abstand halten und raw_input benutzen.

Und sec? *hust* Sprechende Variablen wären toll ;)
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Dienstag 16. Dezember 2008, 00:57

Ok, habs nochmal ausgebessert, war auch schnell dahin geklatscht.

Code: Alles auswählen

import random
print "Zahlenraten"
print "Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten zwischen 1 und 100"
print "--------------------------------------------------------------------"


secret = random.randint(1, 100)
print secret
guess = 0
while guess != secret:

    guess = raw_input("Bitte geben Sie eine Zahl ein: ")

    if guess != secret:
        print "Falsch, versuchen Sie es nocheinmal"
    else:
        print "Richtig, Sie haben das Spiel gewonnen"
            
Zuletzt geändert von chris27 am Dienstag 16. Dezember 2008, 01:41, insgesamt 5-mal geändert.
BlackJack

Dienstag 16. Dezember 2008, 01:05

@chris27: Du benutzt ja immer noch `input()`. Und ein ``except`` ohne eine konkrete Ausnahme -- das ist keine gute Idee.

`list` ist der Name eines Standardtypen, den sollte man nicht verdecken. Ausserdem ist das mit der Liste reichlich umständlich. Das `random`-Modul besitzt auch Funktionen um Zufallszahlen zu erstellen.

Falls die 0 ausgewählt wird, ist das Spiel sofort vorbei.
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Dienstag 16. Dezember 2008, 01:11

Hab mein letzten Eintrag nochmals berichtigt. jetzt müsst es stimmen soweit.
Die Liste hab ich rausgeschmissen. Nun generiert es selbst eine Zufallszahl zwischen 1 und 100.
Zuletzt geändert von chris27 am Dienstag 16. Dezember 2008, 01:27, insgesamt 2-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 16. Dezember 2008, 01:18

Es gilt immer noch, dass wenn zufällig die Null gewählt wird, das Spiel sofort vorbei ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Dienstag 16. Dezember 2008, 01:27

Ja das Problem ist das er jetzt mit raw_input alles als falsch interpretiert, auch wenn ich die richtige Zahl eingebe
Hab mal vorher secret ausdrucken lassen.

Zahlenraten
Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten
--------------------------------------------------------------------
45
Bitte geben Sie eine Zahl ein: 45
Falsch, versuchen Sie es nocheinmal
Bitte geben Sie eine Zahl ein: 45
Falsch, versuchen Sie es nocheinmal
Bitte geben Sie eine Zahl ein: "45"
Falsch, versuchen Sie es nocheinmal
Bitte geben Sie eine Zahl ein:


Im Buch steht für diesen Fall(Ausnahme) folgende Lösung:

Code: Alles auswählen

import random
print "Zahlenraten"
print "Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten"
print "--------------------------------------------------------------------"

secret = random.randint(1, 100)

print secret
guess = 0
while guess != secret:
    
    try:
        guess = input("Bitte geben Sie eine Zahl ein: ")
        print "Danke fuer die Eingabe"
    except NameError:
        print "Bitte Ziffern eingeben."
    except TypeError:
        print "Ihre eingabe kann man nicht in eine Ganzzahl umwandeln"
    except:
        print "Eingabe nicht in Ordnung"
    
    
    
    if guess != secret:
        print "Falsch, versuchen Sie es nocheinmal"
    else:
        print "Richtig, Sie haben das Spiel gewonnen"
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Dienstag 16. Dezember 2008, 01:42

Du suchst das Äquivalent zu einer do-while Schleife. Das setzt man in der Regel über while True: if .. : break um:

Code: Alles auswählen

import random
print "Zahlenraten"
print "Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten"
print "--------------------------------------------------------------------"

secret = random.randint(1, 100)

print secret
while True:   
    try:
        guess = int(raw_input("Bitte geben Sie eine Zahl ein: "))
    except NameError:
        print "Bitte Ziffern eingeben."
    except TypeError:
        print "Ihre eingabe kann man nicht in eine Ganzzahl umwandeln"
    except:
        print "Eingabe nicht in Ordnung"
   
    if guess != secret:
        print "Falsch, versuchen Sie es nocheinmal"
    else:
        print "Richtig, Sie haben das Spiel gewonnen"
        break
Ergebnis:
Zahlenraten
Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten
--------------------------------------------------------------------
7
Bitte geben Sie eine Zahl ein: 5
Falsch, versuchen Sie es nocheinmal
Bitte geben Sie eine Zahl ein: 8
Falsch, versuchen Sie es nocheinmal
Bitte geben Sie eine Zahl ein: 7
Richtig, Sie haben das Spiel gewonnen
raw_input liest einen String ein. Den musst du natürlich in den richtigen Typ umwandeln.
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Dienstag 16. Dezember 2008, 01:58

aber da du jetzt int() davor gesetzt hast bricht das Spiel bei der Eingabe von Buchstaben wieder ab.



Zahlenraten
Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten
--------------------------------------------------------------------
12
Bitte geben Sie eine Zahl ein: auto
Eingabe nicht in Ordnung
Traceback (most recent call last):
File "ZahlenRateSpiel2.py", line 19, in <module>
if guess != secret:
NameError: name 'guess' is not defined
>Exit code: 1
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Dienstag 16. Dezember 2008, 02:07

Ja natürlich. Auto eingeben hat ja auch keinen Zweck. Daß du jetzt mit einem NameError konfrontiert bist, liegt daran, das du alle Exceptions mit "except:" schluckst. Genau deswegen wird davor gewarnt, man fängt einfach alles ab, und am Ende kommt dann sowas bei raus, zusammen mit einer nichtssagen Fehlermeldung wie "Das ist nicht korrekt."

Die Tücke umgehst du indem du
a. Entweder nicht alles mit except abfängst und die Exception den Terror verbreiten lässt (das macht man meist bei größeren Programmen, da man dort sowieso selten mit print und gar nicht mit raw_input arbeitet)
b. Den ValueError abfängt und danach die Schleife neu beginnst. Das kann du mit dem Statement "continue" machen:

Code: Alles auswählen

import random
print "Zahlenraten"
print "Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten"
print "--------------------------------------------------------------------"

secret = random.randint(1, 100)

print secret
while True:   
    try:
        guess = int(raw_input("Bitte geben Sie eine Zahl ein: "))
    except ValueError, exception:
        print exception.message
        continue
   
    if guess != secret:
        print "Falsch, versuchen Sie es nocheinmal"
    else:
        print "Richtig, Sie haben das Spiel gewonnen"
        break
Zahlenraten
Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten
--------------------------------------------------------------------
59
Bitte geben Sie eine Zahl ein: auto
invalid literal for int() with base 10: 'auto'
Bitte geben Sie eine Zahl ein: bla
invalid literal for int() with base 10: 'bla'
Bitte geben Sie eine Zahl ein: 59
Richtig, Sie haben das Spiel gewonnen
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Dienstag 16. Dezember 2008, 02:21

ah ok. das ist gut zu wissen, da ich des öfteren mit solchen Dingen Ärger hatte. So kann ich allem vorbeugen.thx for tipps
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Dienstag 16. Dezember 2008, 09:33

So hab mein Pokerspiel schon fast fertig.

das ist der Hauptteil:


Code: Alles auswählen

import random


CARDS = [(s, v) for s in["AS", "K", "D", "B", "10", "9", "8", "7", "6", "5", "4", "3", "2"]
                        for v in["kreuz", "pik", "herz", "karo"]]
                        
def main():
    cards = list(CARDS)
    random.shuffle(cards)
    own = [cards.pop()for dummy in xrange(2)]
    karten = [cards.pop()for dummy in xrange(5)]
    enemy = [cards.pop()for dummy in xrange(2)]
    flop = own + karten
    flop1 = enemy + karten
    print "Ihre Karten:"
    print "-------------"
    print own
    print "___________________________________________________________________"
    print "Der Flop, die Turn- und die River-Card"
    print "--------------------------------------"
    print karten
    print "___________________________________________________________________"
    print "Die Karten Deines Gegners"
    print "-------------------------"
    print enemy
    print "___________________________________________________________________"
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Dienstag 16. Dezember 2008, 09:35

dann hab ich ein kleines Zähler - System entwickelt und programmiert:

hier der Code:
http://paste.pocoo.org/show/95573/

So, lustig oder:), aber mir fiel mit meinen Möglichkeiten nichts anderes ein. Das Ergebnis, des Gewinners stimmt nun zu gut 80 Prozent.
Das letzte Problem ist halt noch mit Straasen, Flushs, und Full Houses. Werd mir da noch was überlegen. Ihr könnt ja mal sagen was ihr davon haltet, oder vielleicht hat jemand Verbesserungsvorschläge. mfg
Zuletzt geändert von chris27 am Dienstag 16. Dezember 2008, 11:57, insgesamt 4-mal geändert.
Antworten