Seite 1 von 5
Pokerspiel und Zahlenraten
Verfasst: Montag 15. Dezember 2008, 11:15
von chris27
Hallo Leute, hab vor ungefähr 2 Wochen angefangen Python zu lernen. Bin also noch ziemlich am Anfang. Hab mir auch mehrere Bücher zugelegt aber nirgends kann ich wirklich Hilfe auf folgende Frage finden. Also bin gerade bei einer kleinen Übung wo ich ein Kartenspiel(Poker) programmiere.
Ich hab erstmal das random Modul importiert und eine Liste erstellt. Mein Problem ist nun wenn ich mit >>eigene = random.sample(karten, 2)<< zwei zufällige Karten aus der Liste hole, will ich das diese danach aus der Hauptliste gelöscht werden um nicht ein zweites mal ins Spiel zu geraten.
Habs mit remove und pop versucht aber da kann man nur Zahlen Parameter mitgeben. Wäre euch sehr dankbar für ein paar kleine Tipps. Danke im Vorraus, mfg chris
Code: Alles auswählen
import random
karten = ["KreuzAs", "Kreuz10", "KreuzK", "KreuzD", "KreuzB", "Kreuz9", "Kreuz8", "Kreuz7",
"Kreuz6", "Kreuz5", "Kreuz4", "Kreuz3", "Kreuz2", "PikAss", "PikK", "PikD", "PikB",
"Pik10", "Pik9", "Pik8", "Pik7", "Pik6", "Pik5", "Pik4", "Pik3", "Pik2", "HerzAss",
"HerzK", "HerzD", "HerzB", "Herz10", "Herz9", "Herz8", "Herz7", "Herz6", "Herz5",
"Herz4", "Herz3", "Herz2", "KaroAss", "KaroK", "KaroD", "KaroB", "Karo10", "Karo9",
"Karo8", "Karo7", "Karo6", "Karo5", "Karo4", "Karo3", "Karo2"]
def list(seq):
eigene = random.sample(karten, 2)
print eigene
#karten = karten - eigene, oder sowas, hier ist mein Problem, wie kann ich eigene aus der Liste entfernen???
list(karten)
Verfasst: Montag 15. Dezember 2008, 11:26
von numerix
Es gibt mehrere Möglichkeiten, dieses Problem zu lösen.
Ich würde es so machen, dass ich die Liste als ganze mische (mittels der Listenmethode shuffle()) und dann mittels pop() mir die benötigten Elemente abhole. Dann sind sie automatisch aus der Liste entfernt.
Mittels remove() hätte es aber auch funktioniert ...

Verfasst: Montag 15. Dezember 2008, 11:33
von chris27
Vielen Dank für die schnelle Antwort. Hatte auch schon mit shuffle die Liste gemischt, aber trotzdem es nicht hinbekommen. Könntest du mir vielleicht etwas genauer sagen wie das mit pop oder remove funktioniert.
immer wenn ich karten.pop(eigene) oder karten.remove(eigene) eingebe bekomme ich eine Fehlermeldung.
Konnte zB. karten.remove("KreuzAs") eingeben, aber das bringt mich ja nicht weiter. Und bei pop konnte ich nur Zahlen eingeben. zB. pop(0) für die erste Karte usw.
Verfasst: Montag 15. Dezember 2008, 11:33
von BlackJack
Ich würde `random.shuffle()` zum Mischen verwenden und dann mit der `pop()`-Methode Karten ziehen.
Das eingebaute `list` ist ein Name, den man nicht mit einer eigenen Funktion verdecken sollte.
Die Kartenliste würde ich mit einer "list comprehension" anlegen, dann muss man weniger schreiben.
Und eine einzelne Karte sollte nicht mit einer Zeichenkette beschrieben werden. So eine Karte enthält zwei Informationen, Farbe und Wert, die später auch getrennt verarbeitet werden müssen. Also sollte man die nicht in einer Zeichenkette verschmelzen, die man später dann dauernd wieder irgendwie auseinander nehmen müsste. Ich hab's mal mit Tupeln gemacht, aber im Endeffekt wäre ein Objekt IMHO besser.
Code: Alles auswählen
import random
CARDS = [(s, v) for s in ['Kreuz', 'Pik', 'Herz', 'Karo']
for v in ['As', 'K', 'D', 'B', '10', '9',
'8', '7', '6', '5', '4', '2']]
def main():
cards = list(CARDS)
random.shuffle(cards)
own = [cards.pop() for dummy in xrange(2)]
print own
if __name__ == "__main__":
main()
Verfasst: Montag 15. Dezember 2008, 11:46
von chris27
Jo danke BlackJack, genauso was wollt ich haben:), wenn ich so programmieren könnte.Hab fast noch nichts mit Klassen gemacht, komm damit noch nicht so klar. Aber wird auch noch werden,mfg.
Mal ne andere Frage, wie lange habt ihr gebraucht bis ihr einigermassen Programme schreiben konntet. Hab wie gesagt vor 2,3 Wochen angefangen und es ist meine erste Programmiersprache. Tu mir zur Zeit noch ziemlich schwer, hab zwar ein paar Bücher aber find nicht richtig rein. Liegt bestimmt daran das ich Null Vorerfahrung habe. Besonders mit der OOP komm ich gar nicht klar.
Verfasst: Montag 15. Dezember 2008, 12:46
von Leonidas
chris27 hat geschrieben:Mal ne andere Frage, wie lange habt ihr gebraucht bis ihr einigermassen Programme schreiben konntet.
In Python wurden meine Programme nach 2 Jahren halbwegs brauchbar. Aber davor hatte ich noch einige Jahre Erfahrung in VB und Pascal etc.
Verfasst: Montag 15. Dezember 2008, 15:23
von numerix
chris27 hat geschrieben:Mal ne andere Frage, wie lange habt ihr gebraucht bis ihr einigermassen Programme schreiben konntet. Hab wie gesagt vor 2,3 Wochen angefangen und es ist meine erste Programmiersprache. Tu mir zur Zeit noch ziemlich schwer, hab zwar ein paar Bücher aber find nicht richtig rein. Liegt bestimmt daran das ich Null Vorerfahrung habe. Besonders mit der OOP komm ich gar nicht klar.
Wie beim Lernen im allgemeinen ist das von Mensch zu Mensch natürlich unterschiedlich. Grundsätzlich bist du zu beglückwünschen, wenn Python dein Einstieg in die Programmierung ist.
Warum aber gleich ein paar Bücher? Ich würde zunächst mit
einem beginnen, das dann aber auch wirklich gründlich
durcharbeiten, nicht nur
lesen. Das dauert eben ein wenig, aber wichtig ist, dass du dich mit den einzelnen Sprachelementen praktisch auseinandersetzt. Viele kleine Snippets schreiben, viel mit der interaktiven Shell arbeiten und experimentieren. Für ein Pokerspiel ist es vielleicht noch etwas zu früh.
Falls unter deinen Büchern auch "Objektorientierte Programmierung mit Python" von Michael Weigend ist: Fang damit mal an. Damit bekommt du gleichzeitig auch einen ganz guten Einstieg in algorithmische Grundstrukturen und -begriffe. Und anders als der Titel vermuten lassen könnte, geht es nicht in der Hauptsache um OOP, sondern ist eine allgemeine Einführung in Python. Nach 2-3 Wochen muss es vielleicht noch nicht unbedingt OOP sein, zumal sich ein sinnvoller Einsatz von OOP in der Regel erst bei Programmen ergibt, die über ein paar Dutzend Zeilen Quelltext hinausgehen.
Verfasst: Montag 15. Dezember 2008, 18:47
von chris27
Ich habe tatsächlich das Buch OOP von Michael Weigend und bin dieses auch gerade am durcharbeiten. Bin von der Programmiersprache Python echt fazinierd. Wollte vor einiger Zeit auch mal mit C anfangen, aber hab dies gleich wieder aufgegeben . Bei Python wiederum hab ich ziemlich schnell nen kleinen Einstieg geschafft. Zur Zeit hängt halts ein bisschen und ich komm nicht wirklich weiter, werd aber so schnell nicht aufgeben. Danke für die Tipps, mfg Chris
Verfasst: Montag 15. Dezember 2008, 20:28
von chris27
Warum steht folgendes:
if __name__ == "__main__":
main()
oft am Ende einer Klasse? Seh da irgendwie kein Sinn drin. Habs aber schon öfter gesehn.
Verfasst: Montag 15. Dezember 2008, 20:31
von Hyperion
Wirf mal einen Blick ins wiki:
[wiki]Import[/wiki]?highlight=(import)
Weiter unten steht das erklärt

Verfasst: Montag 15. Dezember 2008, 20:39
von derdon
Das steht nicht am Ende einer Klasse, sondern am Ende eines Moduls. Warum, wird auf der von Hyperion verlinkten Seite erklärt.
Verfasst: Montag 15. Dezember 2008, 21:32
von chris27
Jo habs gelsen, aber komm trotzdem nicht wirklich dahinter wozu das gut sein soll. Habe auch noch nicht viel erfahrung mit Klassen. Muss es eine Definition def main(): geben um diesen "Trick" benutzen zu können.
Man kann das Script doch auch einfach mit main() aufrufen oder. Und was genau soll kritischer Code sein an dem Programm von BlackJack z.B.
Entschuldigt meine Unwissenheit. Naja will auch net die Leute hier nerven, werd schon noch selbst dahinter kommen, bin wirklich noch ganz am Anfang, mfg
Verfasst: Montag 15. Dezember 2008, 21:48
von numerix
Es hat nichts mit Klassen zu tun! Darauf wurde schon hingewiesen!
Sinn der Sache ist der, dass man ein und dasselbe Skript sowohl als Modul als auch als eigenständiges Programm einsetzen kann - und zwar mit unterschiedlichem Verhalten. Wird es als Modul eingebunden (dann ist __name__ != "__main__"), dann wird dieser Teil nicht ausgeführt; startet man es als eigenes Skript, dann schon.
Vielleicht solltest du in deinem Buch nochmal weiter vorne einsteigen und das, was du schon gelesen hast, nochmal durch
arbeiten. Und: Die Beiträge anderer auch wirklich lesen ...

Verfasst: Montag 15. Dezember 2008, 21:49
von cofi
__main__ ist der Name eines Skripts, wenn es direkt aufgerufen wurde und nicht importiert wurde.
`python myprogram.py' -> myprogram.__name__ = "__main__"
importiert myprogram mymodule.py, so ist der Name von mymodule "mymodule" (wenn ich mich da jetzt recht erinner

)
Der Sinn des Ganzen ist, dass du in einem Modul Funktionen allgemein bauen kannst und nur zu einem Programm zusammensteckst, wenn es wirklich direkt aufgerufen wurde.
Wichtig ist aber, dass man sich an die Konvention hält, dass auch wirklich nur auf oberster Ebene und dann ganz am Ende verwendet, denn das erleichtert die Bugjagd ungemein

Verfasst: Montag 15. Dezember 2008, 22:16
von chris27
Hast schon recht bin gestern im Buch(ooP v. M.W.) wieder zwei Kapitel zurück gesprungen. Bin jetzt wieder bei Funktionen angelangt. Ob man es liest oder wirklich kann ist natürlich ein entscheidende Unterschied.
Bin wirklich sehr motiviert diese Sprache, auch wenn das heisst das ich das Buch 5 mal lesen muss. Hatte erst mit "How to think like a computer scientist" Tutorial angefangen, aber das ging mir alles viel zu schnell. Muss mich erstmal innerlich damit abfinden das es sehr sehr lange dauern wird bis ich "gute" Ergebnisse erziele. Davon ab les ich die postings anderer User genau und bin auch dankbar für die wirklich "schnellen" und kompetenten Antworten hier, nur kann nicht alles wirklich verstehn. Sollte vielleicht doch wieder komplett von vorne anfangen, anstatt jetzt schon zu versuchen kleine "Spielchen" zu programmieren:), das ist mir schon klar.
Hatte eben übrigens nicht Klassen gemeint, klar das es damit nichts zu tun hat, meinte Funktionen, als ich Klassen schrieb.mfg
Verfasst: Montag 15. Dezember 2008, 22:22
von Hyperion
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
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!
Verfasst: Montag 15. Dezember 2008, 22:41
von numerix
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 ...
Verfasst: Montag 15. Dezember 2008, 23:06
von chris27
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.
Verfasst: Montag 15. Dezember 2008, 23:37
von cofi
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

Verfasst: Dienstag 16. Dezember 2008, 00:57
von chris27
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"