AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Kartenspiel: Wie Karten "kodieren" (Wert, Farbe)?

Kartenspiel: Wie Karten "kodieren" (Wert, Farbe)?

Ein Thema von Qnkel · begonnen am 21. Mär 2010 · letzter Beitrag vom 22. Mär 2010
Antwort Antwort
Qnkel

Registriert seit: 14. Mär 2004
114 Beiträge
 
FreePascal / Lazarus
 
#1

Kartenspiel: Wie Karten "kodieren" (Wert, Farbe)?

  Alt 21. Mär 2010, 14:38
Moin.

Ich möchte ein Kartenspiel programmieren (Schwimmen) mit bis zu 8 Spielern. Es soll eine KI geben, gegen die man spielen kann. Diese will ich in einer DLL auslagern, damit jeder ne eigene KI schreiben kann.

Dazu hab ich hier schon einen guten Tipp gelesen einfach ne Funktion zu machn, der man ne Klasse "TSituation" übergibt und die "TMove" zurück gibt.

Jetzt muss ich ja im Programm verwalten, welche Karte grade wo ist und das entsprechend auch in TSituation schreiben für die KI.

Wie kann man das am schlauesten kodieren, um Sachen wie case..of zu nutzen.

Dachte an ne einfache Integerzahl "00".
Die erste Zahl ist der Kartenwert: 7-9 für 7-9, 1 = 10, 2=Bube, 3=Dame, 4=König, 5=Ass.
Die zweite Zahl ist die Farbe: 1=Herz, 2=Karo, 3=Pik, 4=Kreuz

Oder als String halt mit 7-9, Z=Zehn, B,D,K,A etc. und Farben genauso, nur dann müsste ich mir für case..of wieder ne kleine Funktion basteln.

Noch dazu gibt es 8 Mitspieler und die Karten in der Mitte, jeweils 3 = 27 Karten, die maximal unterwegs sind.

Oder mach ich eine Klasse TSituation innerhalb des Programmes mit lauter Unterkategorien, die ich entsprechend benenne?

Situation.Spieler1.Karte1.Farbe
Situation.Spieler1.Karte1.Wert

etc.?

Hab da noch nicht viel Erfahrung im Management solcher Daten. Wie würdet ihr es am einfachsten machen? Was würdet ihr, wenn ihr eine KI schreibt, übermittelt bekommen?

Also die KI kriegt jeden "Zug" übermittelt, mehr nicht. Die KI muss dann entsprechend programmiert werden, ob sie sich "merkt" wer welche Karte genommen hat und so weiter. Das wird nicht durch das Programm vorgegeben.

Vielen Dank schonmal für eure Hilfe.
Lazarus v0.9.29 (2010-10-31 SVN 28000)
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#2

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 14:44
Delphi-Quellcode:
type
  TSuit = (suDiamond, suHeart, suClub, suSpade);
  TCardValue = (cvSeven, cvEight, cvNine,...);
  TCard = record
    Suit: TSuit;
    Value: TCardValue;
  end;
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 15:02
Oder einfach per Integer-Division. Wenn die Karten Indizes zwischen 0 und 31 besitzen, bekommt man mit Index div 8 die Farbe und mit Index mod 8 den Wert.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Qnkel

Registriert seit: 14. Mär 2004
114 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 17:01
Die Antwort von Panthrax hilft mir iwie kein Stück bei meinem Problem.

Die von DeddyH schon eher. Klar einfach die Karten durchnummeriern, hab wohl zu kompliziert gedacht. Kannst Du mir das mit Index mod & div zur Farben- und Wertbestimmung näher erläutern? (was mod und div machen, weiß ich) Da steh ich grad aufm Schlauch.
Lazarus v0.9.29 (2010-10-31 SVN 28000)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 17:04
Ganz einfach: die Karo 7 bekommt den Index 0, Karo 8 Index 1 usw. bis zum Kreuz As mit Index 31. Durch die Division bekommst Du nun über diesen Index heraus, um welche Karte es sich handelt. Etwa so:
Delphi-Quellcode:
type
  TKartenIndex = 0..31;

...

procedure ShowCard(Index: TKartenIndex);
const Farben: array[0..3] of string = ('Karo','Herz','Pik','Kreuz');
      Werte: array[0..7] of string = ('7','8','9','10','Bube','Dame','König','As');
begin
  ShowMessage(Format('%s %s',[Farben[Index div 8],Werte[Index mod 8]]));
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Qnkel

Registriert seit: 14. Mär 2004
114 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 17:19
Ah ja klar, logisch.

Das isn genialer Tipp. Vielen Dank!

Es kann manchmal so einfach sein..
Lazarus v0.9.29 (2010-10-31 SVN 28000)
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#7

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 20:05
Zitat von Qnkel:
Das isn genialer Tipp.
Genial? eher prädestiniert für spätere Unverständlichkeiten und eine wunderbare (unnötige und hausgemachte) Fehlerquelle. Was spricht bitte gegen Panthrax' nach Lesbarkeitskriterien eindeutig zu bevorzugenden Lösungsvorschlag?
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 20:12
Zitat von Meflin:
Genial? eher prädestiniert für spätere Unverständlichkeiten...
Endlich sagt das mal jemand, hatte schon echt gezweifelt...

Danke
  Mit Zitat antworten Zitat
Qnkel

Registriert seit: 14. Mär 2004
114 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 21. Mär 2010, 23:03
Wie "mische" ich bei Panthrax Lösung z.B. die Karten?

Ich müsste doch 32mal den Typ TCard definieren für jede Karte und dann entsprechend bei jeder Situation auswerten.
Klar, an die KI muss ich nur einmal komplett eine TCard übergeben, damit er "alle Werte" dieser Karte habe.

Klar birgt die Methode von DeddyH eine Fehlerquelle, aber gut dokumentiert ist das doch kein Problem. Ich schreib mir einmal ne Funktion, um rauszufinden welche Karte angezeigt werden muss und fertig.

Erläutert einfach mal Panthrax Methode näher, vllt. sehe ich dann den Vorteil.
Lazarus v0.9.29 (2010-10-31 SVN 28000)
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#10

Re: Kartenspiel: Wie Karten "kodieren" (Wert, Farb

  Alt 22. Mär 2010, 00:56
Z.B. so:
Delphi-Quellcode:
type
  TCardStack = array[0..31] of TCard;

procedure SetupCardStack(var CardStack: TCardStack);
var
  S: TSuit;
  V: TCardValue;
  I: Integer;
begin
  I := 0;
  for S := Low(TSuit) to High(TSuit) do
    for V := Low(TCardValue) to High(TCardValue) do
    begin
      with CardStack[I] do
      begin
        Suit := S;
        Value := V;
      end;
      Inc(I);
    end;
end;

procedure ShuffleCardStack(var CardStack: TCardStack; R: Integer = 1000);

  procedure ExchangeCards(const Index1, Index2: Integer);
  var
    Temp: TCard;
  begin
    Temp := CardStack[Index1];
    CardStack[Index1] := CardStack[Index2];
    CardStack[Index2] := Temp;
  end;

begin
  while R > 0 do
  begin
    ExchangeCards(Random(32), Random(32));
    Dec(R);
  end;
end;

var
  CardStack: TCardStack;
begin
  SetupCardStack(CardStack);
  ShuffleCardStack(CardStack);
end;
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz