@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.
Pokerspiel und Zahlenraten
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.
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.
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:
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"
Du suchst das Äquivalent zu einer do-while Schleife. Das setzt man in der Regel über while True: if .. : break um:
Ergebnis:
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
raw_input liest einen String ein. Den musst du natürlich in den richtigen Typ umwandeln.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
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
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
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:
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
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
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
ah ok. das ist gut zu wissen, da ich des öfteren mit solchen Dingen Ärger hatte. So kann ich allem vorbeugen.thx for tipps
So hab mein Pokerspiel schon fast fertig.
das ist der Hauptteil:
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 "___________________________________________________________________"
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
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.
@chris27: Überhaupt nicht lustig. Eher ziemlich grausam.
Wenn man anfängt Variablennamen durch zu nummerieren will man in der Regel eine Liste verwenden. Und bei den ganzen Namen die von den Daten abhängen magst Du vielleicht mal über Dictionaries nachdenken. Dann werden aus den *vielen* Zeilen die alle fast das gleiche machen, schön kurze schleifen.
Und statt den ganzen "Spass" zweimal zu schreiben, solltest Du eine Funktion schreiben, die so ein `flop` als Argument bekommt und das Endergebis zurück gibt.
Getestet hast Du's anscheinend auch wieder nicht, denn Du erzeugst Karten im Fomat (Farbe, Wert) und beim Zählen suchst Du nach (Wert, Farbe). Da kommt also immer 0 bei heraus.
"Magische" Zahlen sind keine gute Idee -- wie kommen die Zahlen bei den vielen ``if``-Abfragen bei `*_end` zustande? Was bedeuten die? Warum muss man die alle an einen Namen binden statt sie dort gleich aufzusummieren?
Wenn man anfängt Variablennamen durch zu nummerieren will man in der Regel eine Liste verwenden. Und bei den ganzen Namen die von den Daten abhängen magst Du vielleicht mal über Dictionaries nachdenken. Dann werden aus den *vielen* Zeilen die alle fast das gleiche machen, schön kurze schleifen.
Und statt den ganzen "Spass" zweimal zu schreiben, solltest Du eine Funktion schreiben, die so ein `flop` als Argument bekommt und das Endergebis zurück gibt.
Getestet hast Du's anscheinend auch wieder nicht, denn Du erzeugst Karten im Fomat (Farbe, Wert) und beim Zählen suchst Du nach (Wert, Farbe). Da kommt also immer 0 bei heraus.
"Magische" Zahlen sind keine gute Idee -- wie kommen die Zahlen bei den vielen ``if``-Abfragen bei `*_end` zustande? Was bedeuten die? Warum muss man die alle an einen Namen binden statt sie dort gleich aufzusummieren?
@BlackJack
Naja wie gesagt ich kann das alles ja noch nichts so wirklich von dem du da schreibst. Habs mit den Mitteln probiert die ich schon umsetzen kann, weiss auch das mein script alles andere als elegant aussieht. Aber davon ab, ich erzeuge doch erst den Wert und dann die Farbe, also umgekehrt wie du es mir gestern vorgegeben hast. Und gestestet hab ich auch. funktioniert doch.
Zuerst werden die Karten ausgegeben, und zum Schluss die beiden Werte Own und enemy, der höhere hat in dem Fall gewonnen(abgesehn von Strassen und Flushs). Was sind magische Zahlen?
Naja wie gesagt ich kann das alles ja noch nichts so wirklich von dem du da schreibst. Habs mit den Mitteln probiert die ich schon umsetzen kann, weiss auch das mein script alles andere als elegant aussieht. Aber davon ab, ich erzeuge doch erst den Wert und dann die Farbe, also umgekehrt wie du es mir gestern vorgegeben hast. Und gestestet hab ich auch. funktioniert doch.
Zuerst werden die Karten ausgegeben, und zum Schluss die beiden Werte Own und enemy, der höhere hat in dem Fall gewonnen(abgesehn von Strassen und Flushs). Was sind magische Zahlen?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Magic numbers sind Zahlen die in Quellcodes stehen wo nicht klar sind wo sie herkommen und was passiert wenn man sie ändert.chris27 hat geschrieben:Was sind magische Zahlen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ah ok, die Zahlen meinst du, die hab ich mir selbst zusammen gerechnet um den einzelnen Karten, Paaren, Drillingen Werte zu geben. Die haben schon ihren Sinn.
Das Script klappt jedenfalls, werde aber versuchen die Verbesserungsvorschläge umzusetzen.
Das Script klappt jedenfalls, werde aber versuchen die Verbesserungsvorschläge umzusetzen.
Selbst unter der Voraussetzung, dass du Recht hast (die Zeit zum Testen möchte ich mir bei dem Code nicht nehmen): Der Verweis auf die Lauffähigkeit eines Programms als Reaktion auf Kritik am Code ist meistens ein schlechtes Zeichen. Hier auch.chris27 hat geschrieben:Das Script klappt jedenfalls, werde aber versuchen die Verbesserungsvorschläge umzusetzen.
Nimm dir doch mehr Zeit für dein Zahlenraten:
- Rückmeldung, ob die Zahl größer oder kleiner war
- Zeitmessung
- Highscoreliste
- usw.
Ja, vielleicht bekommst du dein Pokerspiel irgendwie hin und fühlst dich durch die (angebliche oder tatsächliche) Lauffähigkeit des Programms auch bestätigt. Trotzdem kann der Code eine Katastrophe sein und daran sollte man (= du) arbeiten: Anständig programmieren zu können (und ich denke mal, dass es dir darum geht) ist nämlich mehr als "Hauptsache es läuft".
Ja klar, werd auch dran arbeiten. Wenn ich gewusst hätte das der hier so auseinandergenommen wird, hätt ich ihn auch gar net reingesetzt. Werd mich aber um besserung was meinen Code angeht bemühen. Und gute Idee, mein Zahlen raten um diese Komponenten zu erweitern, werd ich tun.
mfg
mfg
Zuletzt geändert von chris27 am Dienstag 16. Dezember 2008, 22:06, insgesamt 1-mal geändert.
So hab mein Zahlenspiel nun noch ein wenig ausgebaut.
Habe auch versucht noch eine Art Rangliste zu machen, aber bekomme es nicht hin, das die eingegebenen Namen auch gespeichert werden.
Ihr könnt ja mal sagen wie ihr das Spiel bis jetzt findet.
Code: Alles auswählen
#-------------------------------------------------------------------------------------------------------------------------------
#-Autor: Chris
#-Datum: 16.12.08
#-Funktion: Zahlen Rate Spiel
#-------------------------------------------------------------------------------------------------------------------------------
import random
import time
print "Zahlenraten"
print "Versuchen Sie die vom Programm zufaellig ausgesuchte Zahl zu erraten"
print "------------------------------------------------------------------------------------"
secret = random.randint(1, 100)
nachname = raw_input("Gib deinen Vornamen ein:")
vorname = raw_input("Nun gib bitte deinen Nachnamen ein:")
name = vorname + " " + nachname
vortrag = "Hallo" +" " + vorname + " " + nachname
nachtrag = "Danke" + " " + "fuers " + " " + "spielen" + " " + name
#----------------------------------------------------------------------------------------------------------------------------------
print vortrag
startzeit = time.time() #Zeit startet
while True:
try:
guess = int(raw_input("Bitte geben Sie eine Zahl ein: "))
except ValueError, exception:
print exception.message
continue
zeit = int(time.time() - startzeit) #Zeitzaehler
if guess < secret:
print "zu tief"
elif guess > secret:
print "zu hoch"
else:
print "Richtig, Sie haben das Spiel gewonnen"
break
print u"Fuer die Aufgabe haben sie ", zeit, "Sekunden benoetigt"
print nachtrag
Ihr könnt ja mal sagen wie ihr das Spiel bis jetzt findet.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Am besten keinen Code auf Modulebene! (Hatten wir das hier schon mal? Wenn nicht, einfach mal ins wiki gucken unter dem Stichwort import)
Es gibt print für mehrere Zeilen:
Man kann in print Parameter einbauen:
Ist ja wohl eher mies
Es gibt das =Python Flag bei den code-Blöcken hier im Board. Darum sind unsere Code-Blöcke auch so hübsch gehighlighted
Lange montone Zeichketten kann man erzeugen:
Dann ein paar Vorschläge:
- Versuche ein "Spiel" so in eine Funktion auszulagern, dass man vor und nach einem Spiel in einer Art Menü landet. Dort kann man dann ggf. noch ein Spiel auswählen oder das ganze beenden
- wie wärs mit einer KI? Also der Compu rät und versucht nach einem schlauen (oder zunächst auch dummen) Konzept die Zahl zu erraten?
- wie wäre es dann mit mehreren Spielern, die parallel die selbe Zahl raten?
So, das wäre wohl genug Futter fürs nächste
Und Arbeite noch mal das Tutorial durch. Du willst viel mehr mit Funktionen machen, als Du ahnst!
Auch Listen oder Dictionarys könnten bei meinen Ideen eine Rolle spielen.
Es gibt print für mehrere Zeilen:
Code: Alles auswählen
print "hallo
welt
das ist ein mehrzeiliger Text
"""
Code: Alles auswählen
print "Hallo %s %s, schön, dass Du hier spielen willst" % (vorname, nachname)
Code: Alles auswählen
nachtrag = "Danke" + " " + "fuers " + " " + "spielen" + " " + name
Es gibt das =Python Flag bei den code-Blöcken hier im Board. Darum sind unsere Code-Blöcke auch so hübsch gehighlighted
Lange montone Zeichketten kann man erzeugen:
Code: Alles auswählen
print "-" * 80
- Versuche ein "Spiel" so in eine Funktion auszulagern, dass man vor und nach einem Spiel in einer Art Menü landet. Dort kann man dann ggf. noch ein Spiel auswählen oder das ganze beenden
- wie wärs mit einer KI? Also der Compu rät und versucht nach einem schlauen (oder zunächst auch dummen) Konzept die Zahl zu erraten?
- wie wäre es dann mit mehreren Spielern, die parallel die selbe Zahl raten?
So, das wäre wohl genug Futter fürs nächste
Und Arbeite noch mal das Tutorial durch. Du willst viel mehr mit Funktionen machen, als Du ahnst!
Auch Listen oder Dictionarys könnten bei meinen Ideen eine Rolle spielen.
Im Moments schauts so aus:
[/code]
Zahlen von 1 - 10000 findet er in Sekunden. Aber bei Zahlen von 1 - Millionen, wird es fast zu einer endlos - Schleife. Wie kann ich machen das er die bereits geratenen Zahlen nicht wieder benutzt?
Und wie geht das mit Python Flag?
Code: Alles auswählen
[code=]import random
import time
secret =random.randint(1,1000000)
print "Die gesuchte Zahl ist: ", secret
print "_" * 22
print
guess = 0
i = 1
startzeit = time.time() #Zeit startet
print "Das Programm versucht nun die Zahl zu erraten"
print "-" * 30
while guess != secret:
zeit = int(time.time() - startzeit) #Zeitzaehler
guess = random.randint(1,1000000)
print "Versuch: ", i, "\t-\t", guess
i += 1
print "Das Programm hat ", i, " Versuche gebraucht, in", zeit, " Sekunden"
Zahlen von 1 - 10000 findet er in Sekunden. Aber bei Zahlen von 1 - Millionen, wird es fast zu einer endlos - Schleife. Wie kann ich machen das er die bereits geratenen Zahlen nicht wieder benutzt?
Und wie geht das mit Python Flag?
Zuletzt geändert von chris27 am Dienstag 16. Dezember 2008, 23:19, insgesamt 1-mal geändert.