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:

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)
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

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:

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

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:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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:

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:

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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:

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

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
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

__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:

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

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

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:

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
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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:

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.
Antworten