--->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.
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Dienstag 18. September 2007, 17:54

Hi,

sorry, habe nicht beachtet, dass randint auch die Obergrenze zurückgeben kann. In dem Fall muss man noch 1 von der Länge der Liste abziehen. Habe das mal angepasst.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
AphrodiTe
User
Beiträge: 22
Registriert: Dienstag 18. September 2007, 12:48
Wohnort: Göttingen
Kontaktdaten:

oh

Beitragvon AphrodiTe » Dienstag 18. September 2007, 17:55

@raphael:
thx...habe ich als buch :D ...ich komme nur nich sogut damit klar...

@black:
was soll ich nun nehmen? shuffle oder das andere?

thx
kai
Die Aussage eines Satzes ist reziprok zur Anzahl der kumulierenden Satzzeichen.
BlackJack

Beitragvon BlackJack » Dienstag 18. September 2007, 18:03

Ich würde `shuffle()` zum Mischen nehmen, Slice-Syntax zum "massenweise" Karten austeilen, und zum ziehen einzelner Karten `list.pop()` ohne Index, also von hinten. Das ist am effizientesten.
AphrodiTe
User
Beiträge: 22
Registriert: Dienstag 18. September 2007, 12:48
Wohnort: Göttingen
Kontaktdaten:

lol

Beitragvon AphrodiTe » Dienstag 18. September 2007, 18:11

also...kurz noch zum erlären...ich bin ein anfänger in python....ich kann eine handvoll befehle,mehr nciht.
Das was ich jetzt ahbe ist:

Code: Alles auswählen

from random import randint

def draw_card(lKarten):
    if not lKarten:
        return ()
    return lKarten.pop(randint(0, len(lKarten)-1))
   
lFarben = ["Kreuz", "Pik", "Herz", "Karo"]
lWerte = ["7", "8", "9", "10", "Bube", "Dame", "Koenig", "Ass"]
lKarten = [(sFarbe, sWert) for sWert in lWerte for sFarbe in lFarben]

print "Deine Hand"
for i in xrange(10):
    print "gezogene Karte: %s %s" % draw_card(lKarten)


print "andere hand"
for i in xrange(10):
    print "gezogene Karte: %s %s" % draw_card(lKarten)

print "dritte hand"
for i in xrange(10):
    print "gezogene Karte: %s %s" % draw_card(lKarten)

print "skat"
for i in xrange(10):
    print "gezogene Karte: %s %s" % draw_card(lKarten)


dass das programm den skat ausgibt ist nur zur kontrolle, dass es auch richtig arbeitet.

also. wollte jetzt eigentlich nur dass man selber ("Deine Hand") anfängt eine Karte zu legen und dass die andern jeder auch eine legen und dann überprüft wird welche gewinnt(welche den höchsten wert hat)

Vielen Dank
Kai
Die Aussage eines Satzes ist reziprok zur Anzahl der kumulierenden Satzzeichen.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Re: lol

Beitragvon merlin_emrys » Dienstag 18. September 2007, 18:33

AphrodiTe hat geschrieben:also. wollte jetzt eigentlich nur ...

Das "nur" gefällt mir :-) .

Wie sollen die beiden "KI-Mitspieler" denn Karten legen? Rein willkürlich oder nach irgendeinem Schema?

Und hast Du schon Ideen zum Vergleich, welche Karte den höchsten Wert hat?
AphrodiTe
User
Beiträge: 22
Registriert: Dienstag 18. September 2007, 12:48
Wohnort: Göttingen
Kontaktdaten:

ja habe ich =)

Beitragvon AphrodiTe » Dienstag 18. September 2007, 18:36

ja habe ich =),
also eigentlich genau wie beim skat.
karo<herz<pik<kreuz <----Trumpf lassen wir mal weg...

7<8<9<10<dame<könig<ass<bube

die gegner sollen nach keinem schema ziehen(noch nciht)...sie sollen erstmal von anderen spielern (indem fall mir) gesteuert werden

vielen dank#
kai
Die Aussage eines Satzes ist reziprok zur Anzahl der kumulierenden Satzzeichen.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Dienstag 18. September 2007, 18:49

Ich hab auch mal ein Kartenspiel geschrieben (ich müsste es mal fertigschreiben), und das mit den Werten ist echt ein kleines Problem...
Ich habe es so gelöst, das ich im Programm die Karten so verarbeitet hab, das eine Karte durch ein Zahlenpaar dargestellt wurde. Eine Zahl für die Farbe und eine für den Wert. Damit kann man gut rechnen und auch leicht bestimmen, welche "wertvoller" ist. Vor der Ausgabe/ nach der Eingabe, wird dann halt noch übersetzt. Aber ich denke das ist einfacher, als jedesmal Strings zu vergleichen. Und so kann man auch leichter kompliziertere Sachen prüfen, zB ob es sich um eine Bildkarte handelt usw.
AphrodiTe
User
Beiträge: 22
Registriert: Dienstag 18. September 2007, 12:48
Wohnort: Göttingen
Kontaktdaten:

ok

Beitragvon AphrodiTe » Dienstag 18. September 2007, 18:58

heißt das z.b alle herz karten zahlen zuzuordnen die durch drei teilbar sind??
Die Aussage eines Satzes ist reziprok zur Anzahl der kumulierenden Satzzeichen.
BlackJack

Beitragvon BlackJack » Dienstag 18. September 2007, 19:09

Er hat jeder Karte ein Zahlen*paar* zugeordnet, am besten in der Reihenfolge (Wert, Farbe), weil die Tupel selbst dann schon einfach vergleichbar sind.

Allerdings sollte man das IMHO schon in Klassen verpacken.
AphrodiTe
User
Beiträge: 22
Registriert: Dienstag 18. September 2007, 12:48
Wohnort: Göttingen
Kontaktdaten:

mhhh

Beitragvon AphrodiTe » Dienstag 18. September 2007, 19:10

könnt ihr vielleicht ein beispiel machen weil ich das os nciht verstehe :( sryy
was kommt danahc
Die Aussage eines Satzes ist reziprok zur Anzahl der kumulierenden Satzzeichen.
AphrodiTe
User
Beiträge: 22
Registriert: Dienstag 18. September 2007, 12:48
Wohnort: Göttingen
Kontaktdaten:

Beitragvon AphrodiTe » Dienstag 18. September 2007, 19:54

Code: Alles auswählen

from random import randint

def draw_card(lKarten):
    if not lKarten:
        return ()
    return lKarten.pop(randint(0, len(lKarten)-1))
   
lFarben = ["Kreuz", "Pik", "Herz", "Karo"]
lWerte = ["7", "8", "9", "10", "Bube", "Dame", "Koenig", "Ass"]
lKarten = [(sFarbe, sWert) for sWert in lWerte for sFarbe in lFarben]

print "Deine Hand"
for i in xrange(10):
    print "gezogene Karte: %s %s" % draw_card(lKarten)


wie kann ich die gezogenen karten in eine seperate liste apcken?
Die Aussage eines Satzes ist reziprok zur Anzahl der kumulierenden Satzzeichen.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Beitragvon merlin_emrys » Dienstag 18. September 2007, 20:10

AphrodiTe hat geschrieben:wie kann ich die gezogenen karten in eine seperate liste apcken?

Indem Du zunächst eine leere Liste erzeugst und die Karten dann vor oder nach der Bildschirmmeldung mit append() hinzufügst.

Edit:
Ich habe keine Ahnung von Skat. Pokern kann ich, aber Skat... :-o
Wenn alle Karokarten geringeren "Wert" haben als alle Herzkarten, kann man das "Symbol" als Zehnerstelle einer zweiziffrigen Zahl nehmen und die "Zahl" bzw. das "Bild" als Einerstelle.
Was ich mir vorstellen könnte, ist, daß bei der Tupel-Version etwas ähnliches gemacht wurde. Du kannst für jede Karte ein Tupel ("Symbolwert", "Bildwert") erstellen, wobei Symbolwert z.B. Karo = 1, Herz = 2 usw. ist und Bildwert Sieben = 1, Acht = 2 usw.
Dann kannst Du einfacher als bei der zweiziffrigen Zahl sagen: "Ich möchte jetzt die Symbole vergleichen" oder "Ich möchte den Bildwert vergleichen" - Du nimmst einfach den jeweiligen Tupelwert, indem Du die erste Position oder die zweite abfragst. Dabei mußt Du nur darauf achten, daß die erste Position des Tupels die Nummer "0" hat, also Tupel[1] die zweite Position ist.

Verstehe ich Dich jetzt richtig, daß Du im Grunde alle drei Spieler steuern willst? Oder soll ein anderer Mensch den eigentlichen Spieler darstellen?
AphrodiTe
User
Beiträge: 22
Registriert: Dienstag 18. September 2007, 12:48
Wohnort: Göttingen
Kontaktdaten:

...

Beitragvon AphrodiTe » Dienstag 18. September 2007, 20:37

Also...
die 2 andern spieler sollen erstmal von mir gesteuert werden.wenn das spiel fertig ist will ich dass sie sich sozusagen selber steuern...
aber ncohmal zu den listen.
ich verstehe das mit dem append nciht.
python sagt mir dass append nciht defeniert ist...kannste mir den append() befehl mal mit einbauen in das:

Code: Alles auswählen

from random import randint

def draw_card(lKarten):
    if not lKarten:
        return ()
    return lKarten.pop(randint(0, len(lKarten)-1))
   
lFarben = ["Kreuz", "Pik", "Herz", "Karo"]
lWerte = ["7", "8", "9", "10", "Bube", "Dame", "Koenig", "Ass"]
lKarten = [(sFarbe, sWert) for sWert in lWerte for sFarbe in lFarben]

print "Deine Hand"
for i in xrange(10):
    print "gezogene Karte: %s %s" % draw_card(lKarten)
Die Aussage eines Satzes ist reziprok zur Anzahl der kumulierenden Satzzeichen.
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Dienstag 18. September 2007, 20:59

Hallo BlackJack,

BlackJack hat geschrieben:Nimm um Himmels willen `shuffle()`. Dieses gepoppe ist ja nicht mit anzusehen.

Deine Abneigung gegenüber Poppen kann ich nicht nachvollziehen. Gerade weil das Problem war, von einem Stapel zu ziehen, kommt das pop der Realität doch am nächsten. Du kannst Elemente entnehmen (pop) und auch wieder draufschieben. Dass das Poppen aus der Liste nicht die effektivste Methode ist, sollte beim Ausgeben von Skatkarten nebensächlich sein, selbst auf einem 386er. ;-)
Das Slicen von Teillisten ist kein Ziehen und die Objekte gibt es dann mehrfach.

BlackJack hat geschrieben:@Michael: Was immer Du da über `shuffle()` denkst ist mit Sicherheit falsch. Das ist zum Mischen einer Sequenz gedacht und tut auch genau das.

Ok, Du hast recht. Habe mir das Modul nochmal angesehen und es geht tatsächlich nur einmal durch die Liste (wäre auch extrem dumm, wenn nicht). Ich habe damals nur den Austausch gesehen:

Code: Alles auswählen

x[i], x[j] = x[j], x[i]

... und habe das zu fix überflogen.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 18. September 2007, 21:08

Michael Schneider hat geschrieben:
BlackJack hat geschrieben:Nimm um Himmels willen `shuffle()`. Dieses gepoppe ist ja nicht mit anzusehen.

Deine Abneigung gegenüber Poppen kann ich nicht nachvollziehen. Gerade weil das Problem war, von einem Stapel zu ziehen, kommt das pop der Realität doch am nächsten. Du kannst Elemente entnehmen (pop) und auch wieder draufschieben. Dass das Poppen aus der Liste nicht die effektivste Methode ist, sollte beim Ausgeben von Skatkarten nebensächlich sein, selbst auf einem 386er. ;-)

Es geht nicht um die Performance sondern darum, dass man quasi selbst etwas nachimplementiert, was es schon gibt. Das Problem ist hierbei, dass man damit Zeit verliert, weil man es implementieren muss und möglicherweise eine Fehlerquelle bekommt, wenn der Code sich irgendwie im Index irrt. ``random.shuffle()`` hingegen funktioniert (da es ja auch sehr ausführlich getestetwurde). Definitiv.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder