--->Kartenspiel programmieren<----

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.
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

Oh, das wusst ich nich mit input() ... naja wieder was gelernt :D
und in meim Programm is ein Fehler, das hab ich erst nach dem Posten gemerkt, hab aber keine Zeit gehabt, den zu berichtigen...
Ausserdem können da bei Falscheingaben genau so Fehler entstehen wie bei `raw_input()`
raw_input kann Fehler auslösen? naja wenn man eingabe abbricht, aber gibts noch andere Fehler, die möglich sind?
Naja erst mal wieder das int(raw_input()) angewöhnen und wenn der Lehrer wieder meckert sag ich ihm bescheid...
Und danke für den Rat für Klassennamen. Wo finde ich die Konventionen?

so, zu meinem Fehler...

Code: Alles auswählen

import random
müsste heißen

Code: Alles auswählen

from random import *
sonst löst er bei randint einen Fehler aus.
Alternativ könnte es natürlich auch so bleiben und man ändert randint zu random.randint

Ich korrigier das mal...

Edit: Hab schon ne Idee, wie man das anders regeln könnte, is aber noch in Ausarbeitungsphase...
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

Boah ich hab Programmiersucht^^

Code: Alles auswählen

from random import randint

class Kartenstapel:
    def __init__(self):
        self.inhalt=["Karo 7","Karo 8","Karo 9","Karo 10",
                     "Karo Bube","Karo Dame","Karo Koenig",
                     "Karo Ass","Herz 7","Herz 8","Herz 9",
                     "Herz 10","Herz Bube","Herz Dame",
                     "Herz Koenig","Herz Ass","Pik 7","Pik 8",
                     "Pik 9","Pik 10","Pik Bube","Pik Dame",
                     "Pik Koenig","Pik Ass","Kreuz 7","Kreuz 8",
                     "Kreuz 9","Kreuz 10","Kreuz Bube","Kreuz Dame",
                     "Kreuz Koenig","Kreuz Ass",]
        # Die Liste mit den Karten, mehr wird für den Stapel ja nicht gebraucht
    def nehmen(self):
        return self.inhalt.pop(randint(0,len(self.inhalt)-1))
class Hand:
    def __init__(self,stapel,name="Spieler"):
        self.inhalt=[]
        self.stapel=stapel
        self.name=name
        print "Spielerhand %s initialisiert"%self.name
    def ziehen(self):
        gezogen=self.stapel.nehmen()
        self.inhalt.append(gezogen)
        print "%s: Sie haben %s gezogen."%(self.name,gezogen)
class Gegnerhand:
    def __init__(self,stapel,name="Gegner"):
        self.inhalt=[]
        self.stapel=stapel
        self.name=name
        print "Gegnerhand %s initialisiert"%self.name
    def ziehen(self):
        gezogen=self.stapel.nehmen()
        self.inhalt.append(gezogen)
        print "Der Gegner '%s' hat eine Karte gezogen."%self.name

if __name__=="__main__":
    print "Demonstration"
    print
    stapel=Kartenstapel()
    spielerhand=Hand(stapel,"Hans-Dieter")
    gegnerhand=Gegnerhand(stapel,"Klaus-Peter")
    print
    spielerhand.ziehen()
    gegnerhand.ziehen()
Habs diesmal getestet, es funzt.

EDIT: Hab noch ne Klasse Gegnerhand hinzugefügt, die beim Ziehen nur sagt, dass gezogen wurde, aber nicht, was gezogen wurde (ja ein feiner Buchstabe macht den Unterschied :D )

Wie macht ihr diese schrägen Anführungsstriche?
Zuletzt geändert von Vingdoloras am Montag 3. Dezember 2007, 16:10, insgesamt 2-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vingdoloras hat geschrieben:Und danke für den Rat für Klassennamen. Wo finde ich die Konventionen?
PEP 8.
Vingdoloras hat geschrieben:so, zu meinem Fehler...

Code: Alles auswählen

import random
müsste heißen

Code: Alles auswählen

from random import *
sonst löst er bei randint einen Fehler aus.
Alternativ könnte es natürlich auch so bleiben und man ändert randint zu random.randint
Nutze lieber die längere Form, ohne Stern-Import. Denn Stern-Imports sind, vereinfacht gesagt, böse. Kannst du unter [wiki]Import[/wiki] nachlesen sowie in den hunderten von Posts die dazu geschrieben worden sind.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

Eine saubere Lösung ist es, Module generell nie mit Stern einzubinden, außer man weiß genau was man tut.
Ich weiß genau, was ich tue, da ich in diesem Fall nur ein Modul importiere :wink:
Trotzdem danke für den Tipp, ich werd das ändern und mir angewöhnen den Stern zu meiden, sobald ich mehrere Sachen importiere oder das Programm/-teil zb. hier ins Forum schreibe, wo es jeder kopieren kann und dadurch Fehler erzeugen könnte mit weiteren *-Importen

Wie macht ihr das, dass er bei Zitaten anzeigt, wer das gesagt hat :?:

Edit: So hab die Sachen umgeschrieben
Edit²: Hab Noch ne Klasse 'Gegnerhand' in den zweiten Code eingefügt...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vingdoloras hat geschrieben:Ich weiß genau, was ich tue, da ich in diesem Fall nur ein Modul importiere :wink:
Trotzdem danke für den Tipp, ich werd das ändern und mir angewöhnen den Stern zu meiden, sobald ich mehrere Sachen importiere oder das Programm/-teil zb. hier ins Forum schreibe, wo es jeder kopieren kann und dadurch Fehler erzeugen könnte mit weiteren *-Importen
Das sollte man sich generell angewöhnen, da es auch einem selbst Hilft. So weiß man genau, wo die Namen herkommen, weil sie durch die Import-Zeile definiert werden. Wenn man etwas mit dem *-Import lädt, hat man diese Hilfe nicht mehr.
Vingdoloras hat geschrieben:Wie macht ihr das, dass er bei Zitaten anzeigt, wer das gesagt hat :?:
Nach dem quote noch ein ="Nickname" also in deinem Fall `[ quote="Vingdoloras" ]`.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Vingdoloras hat geschrieben:
Eine saubere Lösung ist es, Module generell nie mit Stern einzubinden, außer man weiß genau was man tut.
Ich weiß genau, was ich tue, da ich in diesem Fall nur ein Modul importiere :wink:
Hi Vingdoloras!

Genau da gehen die Probleme los. Nicht nur, dass (getreu dem Grundsatz "Quellcode wird wesentlich öfter gelesen als geschrieben/bearbeitet") ein späterer Leser ewig nach den Namen sucht - was ab zwei Sternchenmodulen einen besonderen Reiz bekommt.

Dazu kommen noch potentielle Namensraumkonflikte.
Zu den besten Beispielen gehört PhotoImage, das es sowohl in ImageTk als auch in Tkinter gibt (wenn man sowas noch verwendet ;-)). Das zuletzt importierte Modul gewinnt.

Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

Michael Schneider hat geschrieben:Das zuletzt importierte Modul gewinnt
Das überall geltende Naturgesetz ist erneut bewiesen :D
Michael Schneider hat geschrieben:Zu den besten Beispielen gehört PhotoImage, das es sowohl in ImageTk als auch in Tkinter gibt (wenn man sowas noch verwendet :wink: )
Ich hab die meisten meiner Kenntnisse über Python aus dem Buch "Python 2.x", ein paar aus dem Unterricht und ein paar aus Eigenversuchen oder diesem Forum. Ich nutze Python 2.4 .
Das Buch behandelt leider (naja, ich komm damit gut zurecht :D ) nur Tkinter zur GUI-Programmierung und ich bin erst in der neunten Klasse. Der Unterricht war mir "etwas" zu langsam * und deswegen hab ich das Buch gelesen, das mir von meinem Lehrer empfohlen wurde. nun müsste ich die Grundzüge des Stoffes für das nächste Jahr kennen, der Nachteil ist aber, dass ich wirklich nur die Grundzüge kenne. Deswegen werde ich mich erstmal auch an Tkinter halten, damit ich damit erstmal üben kann. Wenn ich das dann einigermaßen beherrsche, kann ich mich ja noch an was anderes ranwagen...


* falls mein Lehrer das liest: ist nicht persönlich gemeint, das ist für mich in allen Fächern so, die mich interessieren... ich kann einfach nicht genug kriegen :twisted: !!!
Wenn ich meine Mitschüler auffordere, durch vollständige Induktion zu beweisen, dass man eine Menge von n Elementen in n Fakultät Reihenfolgen anordnen kann, können sie nichtmal den Satz wiederholen...
Das Problem dabei ist, dass ich mein Wissen über Mathematik vom Mathematischen Schülerzirkel an der Humboldt Uni beziehe, aber so einen Zirkel gibt es (soweit ich weiß) nicht für Informatik. Und wenn, dann würde der Zirkel auch nicht 100%ig Python behandeln, weshalb ich warten muss, bis wir im Unterricht das jeweilige Thema durchnehmen...
Antworten