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.
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Pokerspiel und Zahlenraten

Beitragvon chris27 » Montag 15. Dezember 2008, 11:15

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=]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)[/code]
Zuletzt geändert von chris27 am Dienstag 16. Dezember 2008, 22:06, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Montag 15. Dezember 2008, 11:26

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 ... :wink:
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Montag 15. Dezember 2008, 11:33

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.
Zuletzt geändert von chris27 am Montag 15. Dezember 2008, 11:33, insgesamt 1-mal geändert.
BlackJack

Beitragvon BlackJack » Montag 15. Dezember 2008, 11:33

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()
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Montag 15. Dezember 2008, 11:46

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 15. Dezember 2008, 12:46

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Montag 15. Dezember 2008, 15:23

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.
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Montag 15. Dezember 2008, 18:47

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
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Montag 15. Dezember 2008, 20:28

Warum steht folgendes:
if __name__ == "__main__":
main()

oft am Ende einer Klasse? Seh da irgendwie kein Sinn drin. Habs aber schon öfter gesehn.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Montag 15. Dezember 2008, 20:31

Wirf mal einen Blick ins wiki:
[wiki]Import[/wiki]?highlight=(import)

Weiter unten steht das erklärt :-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Beitragvon derdon » Montag 15. Dezember 2008, 20:39

Das steht nicht am Ende einer Klasse, sondern am Ende eines Moduls. Warum, wird auf der von Hyperion verlinkten Seite erklärt.
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Montag 15. Dezember 2008, 21:32

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Montag 15. Dezember 2008, 21:48

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 durcharbeiten. Und: Die Beiträge anderer auch wirklich lesen ... :wink:
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Montag 15. Dezember 2008, 21:49

__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 ;)
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Montag 15. Dezember 2008, 22:16

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]