Autor |
Beitrag |
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Fr 03.10.03 17:26
Hallo!
Ich versuche grad so eine art Poker zu proggen. ich geb dem Benutzer also 5 Karten in Images, er darf bis zu 3Karten tauschen, und dann will ich prüfen ob er was erreciht hat. Und das Prüfen ist das Problem.
Ich hab mir gedacht, ob ich die Karten durchnummerier, aber des wird zu kompliziert.
Hat jemand eine IDee, wie ich das anders machen könnte?
Stefan
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
highhatcompy
      
Beiträge: 190
Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
|
Verfasst: Sa 04.10.03 14:25
Hallo, hört sich interessant an! Wie meinst Du prüfen, ist gemeint ob er eine Full House oder sowas hat ? Wenn ja , dann würde ich die Karten nummerieren aber nicht jede, sondern nur jeden Type z.B. alle Bubben 1, alle Könige 2 usw.
Mfg
|
|
StefanH 
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Sa 04.10.03 15:14
Genau, das!
und schauen 88 = 2 Asse? oder wie meinst du das?
Stefan
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
highhatcompy
      
Beiträge: 190
Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
|
Verfasst: Sa 04.10.03 22:37
Ja, genau so habe ich das gemeint!
Aaaaaber es gibt vieleicht noch eine bessere Lösung,wenn du dich ein wenig mit 32Bit Registern und dem BCD-Code aus kennst!
Also mein Ansatz, jede Karte im Spiel wird mittels BCD-Code gecodet(32 Karten entsprechen je einem Bit im 32Bit Register).
Das Herz-Ass entspricht 2^0=1,Herz-König 2^1=2,Herz-Dame 2^2=4,...,Pik 8 2^30=1073741824 und Pik 7 2^31=2147483648, und somit ist jede Karte genau bezeichnet. Bei der Auswertung addierst du alle 5 Karten z.B 3Aesser und 2 zehnen ergeben 269549825 und wenn das Ergebnis stimmt hat der Spieler ein Foul Hous(hoffe ich  ). Du must also nur alle möglichen Karten kombi's mit BCD-Code coden und da vergleichen!
Noch einfache geht's, wenn du das ganze mit einem 32Bit Reg. erledigst!!!
Ich hoffe du verstehst was ich meine!
Mfg
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: So 05.10.03 01:04
highhatcompy hat folgendes geschrieben: | Du must also nur alle möglichen Karten kombi's mit BCD-Code coden und da vergleichen!
|
Also Du gibst jeder Zahl einfach ein Bit. Dadurch entsteht für jede 5er Kombination eine spezielle Zahl. Jetzt musst Du nur noch jeder Zahl eine Gewinnhöhe geben. zB Karo2+Herz2 = 1; Herz2+Pik2 =2;... ... ...
Kligt gut. Aber Du weist schon, daß es ca 2.600.000 Mögliche Kombinationen gibt?
Da es ja auch bei 5 ungleichen Gewisse Gewinnregeln gibt müsstest Du ALLEN eine Gewinnhöhe zuweisen.
Na dann viel Spaß!
Da wäre mir die suggsesive, Stufenweise Abarbeitung der Pokerregeln dann doch lieber zum programmieren. (Und klarer)
Jede Karte hat einen Rang von 1=Ass bis 13=König und eine Farbe 1=Kreuz bis 4=Karo.
Es gibt erstmal 10 verschiedene Gewinngruppen:
Nur wenn beide in der gleichen Gewinngruppe liegen musst weiter vergleichen. zB dann den Rang des Paares,... ...
Die Karten wirst erstmal von 1-52 durchnummerieren müssen. (Schon um per Zufallszahl die Karten zu legen)
Die Farbe bekommst mit Kartennummer DIV 13.
Den Rang mit Kartennummer MOD 13.
Oder Du legst Dir einen
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type TKarte = record Rang : Byte; Farbe: Byte; end;
var Karte: Array[1..52] of TKarte; | an und füllst Dir das 1x aus.
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
StefanH 
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: So 05.10.03 15:12
Also:
1. Ich hab keine Ahnung von Bytes und bits...
2. ich spiele mit 32 Karten
3. es gibt keinen gegner, d.h. du sagst meinem Prog, was du meinst, dass du überbietest, und wenn, dann kriegst du zusatzpunkte.
Wolf68 hat folgendes geschrieben: | Die Farbe bekommst mit Kartennummer DIV 13.
Den Rang mit Kartennummer MOD 13. |
das wäre bei 32 Karten dann wohl 8, oder?
aber dann ist es doch verkehrt, oder? As das kleinste, und 7 das höchste...
Stefan
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
joerg68
      
Beiträge: 116
Win 2000
D5Enterprise
|
Verfasst: Di 07.10.03 09:46
Titel: Spielkarten
Hallo Stefan
Wenn ich Dein letztes Statement richtig interpretiere holst Du Dir Deine Karten nicht über die cards.dll
Aber die Lösung sich die Karten über images zu holen geht ja auch.
Ich sehe allerdings keine Möglichkeit, die überprüfung der Gewinne ohne ausführliche Algorithmen durchzuführen. Ich würde die einzelnen Überprüfungen allerdings in einzelne Funktionen kapseln die dann integerWert als Rückgabewert haben.
z.B. function CHeck_Paar (array of integer) : integer;
Beim Rückgabewert 0 ist kein Paar vorhanden. Falls ein Paar vorhanden ist kannst Du dann den Wert des Paares im Rückgabewert festlegen. Wenn Du die Rückgabewerte für die Einzelnen Gewinnstufen ( Royal Flush Vierling Full House etc.) entsprechend staffelst hast Du es dann nachher beim Verglich wer gewonnen hat etwas leichter.
Außerdem kannst Du etwas Zeit beim ermitteln der Gewinne sparen wenn Du die Funktionen geschickt anordnest. Z.B brauchst Du die Funktionen zum Überprüfen ob es Paare etc. gibt nicht mehr durchführen lassen wenn Du festgestellt hast, das ein Spieler einen Flash hat
Ich hoffe ich habe Dir etwas weitergeholfen
Gruss
Jörg
|
|
StefanH 
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Di 07.10.03 15:23
Also doch einzeln abfragen, uind das ist ja so sch***,
oder verstehe ich dich nIcHT?
Stefan
P.S:
Kennt ihr euch? joerg 68 und Wolff 68? 
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
joerg68
      
Beiträge: 116
Win 2000
D5Enterprise
|
Verfasst: Di 07.10.03 15:34
Ja ein wenig Code mußt Du wohl schon schreiben. Aber so ein schöner Algorithmus macht das programmieren doch erst interessant.
Falls Du bei einem einzelnen Problem nicht weiterkommst kannst Du ja noch mal nachfragen.
Gruss Jörg
PS ich kenne Wolf68 nicht. Ist aber vermutlich auch so ein alter Sack wie ich 
|
|
StefanH 
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Di 07.10.03 15:58
ok.
ich hab aber immer noch das Problem mit den Karten erkennen
mir fällt niks ein *heul* das mit dem ausrechenen von wolff geht nIcHT, weil bei 32, 24, 16 und 8 0 als Frabe raus kommt...
*verzweifel*
Stefan
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
joerg68
      
Beiträge: 116
Win 2000
D5Enterprise
|
Verfasst: Di 07.10.03 16:46
die berechnung von wolf bezieht sich auf ein 52er Kartenspiel und auch auf die Verwendung der cards.dll.
Du kannst ja mal posten wie Du die KArten den Images zuweist und in welcher Form du die KArten abspeicherst (welche Zahl ist welcher wert)
Dann kann ich evtl weiterhelfen
Gruss Jörg
_________________ Aus den Chaos sprach eine Stimme " Lächele und sei froh denn es könnte schlimmer kommen". Und ich lächelte und ich war froh.
UND ES KAM SCHLIMMER
|
|
highhatcompy
      
Beiträge: 190
Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
|
Verfasst: Mi 08.10.03 05:59
Hi,
vieleicht willst Du dich ja doch mit dem BCD-Code beschäftigen!? Damit hättest Du jedenfalls eine eine definierte Ausage über die 5 Karten zur Hand. Ich habe mich auch schon damit beschäftigt, wenn Du willst zeig ich dir auch wie
Highatcompy
|
|
StefanH 
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Mi 08.10.03 15:02
Zitat: | die berechnung von wolf bezieht sich auf ein 52er Kartenspiel und auch auf die Verwendung der cards.dll. |
cards.dll??? was kann man damit machen???
was ist der unterschied bei 52 / 13 und 32 / 8? keiner!
Zitat: | vieleicht willst Du dich ja doch mit dem BCD-Code beschäftigen!? Damit hättest Du jedenfalls eine eine definierte Ausage über die 5 Karten zur Hand. Ich habe mich auch schon damit beschäftigt, wenn Du willst zeig ich dir auch wie |
da kann ich auch meine Zahlen hintereinander schreiben: 1_3_12_24_32
kann ich da was mit anfangen? also sortieren irgendwie, und dann prüfen, ob 1. = 2. usw.?
Stefan
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
joerg68
      
Beiträge: 116
Win 2000
D5Enterprise
|
Verfasst: Mi 08.10.03 15:21
Titel: KArtenspiel
Also in der Cards.dll sind die KArten drin die z.B. im Solitäre verwendet werden. Wenn Du die cards.dll verwendest kannst Du dir also die Suche nach Bitmaps mit Karten im Internet sparen. Außerdem sind in der Cards.dll auch schon einige nützliche Funktionen drin die die Arbeit erleichtern. Zu dem thema wie man damit in Delphi arbeitet hatte ich vor kurzem auch eine Frage hier gestellt. Müßte unter der Rubrik Spiele sein. Kannst Dir das ganze mal ansehen.
Das mit dem durch 13 teilen hängt mit der Nummerierung der KArten in der cards.dll zusammen.Bei der ganzzahligen Division (auch als Modulo Operator in C++) bekannt kann man den KArtenwert der KArte ermitteln. HAt man die KArte Nr14 so ergibt 14 Mod 13 den Rest der ganzzahligen Division durch 13 also 1 und man weiß das es sich um eine 1 ( also ein As) handelt)
Gruß
Jörg
_________________ Aus den Chaos sprach eine Stimme " Lächele und sei froh denn es könnte schlimmer kommen". Und ich lächelte und ich war froh.
UND ES KAM SCHLIMMER
|
|
Wolff68
      
Beiträge: 302
Erhaltene Danke: 1
WinXP home
D6 Prof
|
Verfasst: Mi 08.10.03 22:19
Hallo. Bin auch mal wieder da...
Also Dein Problem mit DIV und MOD basiert ja wohl nur auf DEINER Definition was ein AS und was ein König ist.
Wenn Du die Cards.dll nicht verwendest, ist es doch völlig Dir überlassen ob ein As nun die 0te oder die 7te Karte ist.
Bei 32 Karten nummerierst Du die von 0 bis 31.
DIV8 gibt dir die Farbe von 0 bis 3, MOD8 die Karte 0 bis 7
(Sorry. Hatte oben aus Versehen 1..52 gepostet. Richtiger wäre 0..51 gewesen)
PS: Joerg68 und ich haben warscheinlich das Geburtsjahr gemeinsam. Ansonsten kennen wir uns meines wissens nicht.
Mir ist noch immer schleierhaft, wie highhatcompy eine Lösungsmatrix aufbauen will.
Auch bei 32 Karten sind es 2^32 (4Giga) Möglichkeiten. Dann brauchst noch einen 32-Bit Wert für die Gewinnhöhe (Wenn man mal davon ausgeht, daß jede Kombination eine andere Gewinnhöhe hat.)
Also müsstest Du 2*2^32 Bit = 8GigaBit speichern und jedesmal 4 Gigabit davon vergleichen vergleichen, oder hab ich Dich da irgendwo falsch verstanden?
_________________ "Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Do 09.10.03 00:19
ich habe das hier jetzt alles nur überflogen, aber du könntest die Karten so einsortieren:
(bessere Übersichtlichkeit):
Delphi-Quelltext 1:
| Karten : array[1..4] of array[1..8] of boolean; |
das erste array gibt die Farbe an und das zweite die KArte selbst (z.B. 5 für Bube...)
|
|
highhatcompy
      
Beiträge: 190
Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
|
Verfasst: Do 09.10.03 07:25
Hallo an alle...
@Wollf68:
Ich glaube du verstehst mich falsch! Ich würde nur den Zahlen Wert der Potenz nutzen. Ich versuchs nochmal zu erklären: Es git 32 Karten von der Kreuz 7 bis zum Herz Ass, K7 =1,K8=2, K9=4, K10=8, K-Bube=16 usw.,das ist in etwa das System wie bei den Dateiatributen. Wenn jetzt 5 Karten ausgespielt sind z.B. K7 bis K-Bube werden die Werte der Karten addiert 2^0+2^1+2^2+2^3+2^4=31 oder 1+2+4+8+16=31. Mit dem Auswertloga. für den BCD-Code kann man feststellen welche Karten liegen und ob ein Gewinn vorliegt. Auswertung ... 31-2^5=0 weil 31-32<0 ist -> K-Dame wurde nicht gelegt,31-2^4=1 rest 15 -> K-Bube wurde gelegt, 15-2^3=1 rest 7 -> K10 wurde gelegt usw..
Im Programm würde ich mit Hex Werten arbeiten und in Register laden und dort die Vergleichsoperationen durch führen(in Assembler).
Mfg
Highhatcompy
_________________ Bist Du ein Programmierer, so wirst Du gegen Computer, Hardwarehersteller und Anwender verlieren. (Quelle: Murphy's Computer-Gesetz)
|
|