Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kartenspiel (https://www.delphipraxis.net/92487-kartenspiel.html)

Stillmatic 20. Mai 2007 22:08


Kartenspiel
 
Guten Abend!!!

Ich möchte ein Kartenspiel namens "Schlesische Lotterie" programmieren!

Ich muss auf einen Buttonklick so reagieren......
Er werden neun zufallsKarten(von einem Skat Kartenspiel) gezogen nach denen nachher die Punkteverteilung berechnet wird!
Nun ist mein Problem folgendes!!!

Ich habe einen array vom Typ TCards( also K7(Karo 7 ),H7(Herz 7) usw...)
Karten : array[0..8] of TCards;

Eine zufallsKarte generiert man so....
Karten[i]:= TCards(random(UConst.cCardCount));

Wenn ich jetzt mit einer for Schleife den Array mit Zufallskarten fülle, werden möglicherweise Karten doppelt in den array geschrieben, was aber nicht sein darf!!!

Wie kann ich das Problem lösen???

Meine Idee war es eventuell, einen KomplettenKartenstapel zu deklarieren und jede Karte aus dem Stapel zu entfernen die generiert wurde und dann zu überprüfen ob die Karte noch im Stapel vorhanden ist, dann erst die Karte in den Array schreiben!!--Aber das klappt net wirklich...

zecke 20. Mai 2007 22:10

Re: Kartenspiel
 
:hi:

Würde vorschlagen eine bool'sche Variable mit hineinzunehmen. Wenn eine Karte geszogen wird auf true setzen und beim Ziehen der Karten nur aus denen die auf false sind wählen.

Stillmatic 20. Mai 2007 22:30

Re: Kartenspiel
 
Hab es soweit!!
Code:
for i := 0 to 8 do
  Begin
   Karte := TCards(random(UConst.cCardCount));
   if (Karte in newDeck) then
    newDeck:= newDeck - [Karte] else
    Begin
      repeat
       Karte := TCards(random(UConst.cCardCount));
      until (Karte in newDeck) ;
    end;
    Karten[i] := Karte;
    Ziehung[i]:= cardtoStr(Karten[i]);
Aber das Funktioniert überhaupt nicht!
@Zecke
das müsste ich ja einen neuen array of boolean anlegen, aber es geht doch sicherlich auch anders???

zecke 20. Mai 2007 22:34

Re: Kartenspiel
 
:hi:

Mmh, evtl habe ich etwas verpasst, aber TCards ist doch von dir selbst erstellt oder täusche ich mich? (Ich kenn mich da nicht so aus, vielleicht benutzt Du ja die cards.dll .. kA). :mrgreen:

Stillmatic 20. Mai 2007 22:40

Re: Kartenspiel
 
Ja TCards hab ich selber erstellt, da sind halt alle Karten drin von [k7(Karo 7) ..ha(Herz Ass)]

zecke 20. Mai 2007 22:42

Re: Kartenspiel
 
:hi:

Zeig doch mal, wie das genau ausschaut.

Du könntest dann eine Eigenschaft 'Used' mit zu jeder Karte nehmen, kommt drauf an, wie dein TCards aussieht. Ich hab's mal so für ein Pokerspiel gemacht. Wenn ich den Code finde kann ichihn dir Posten. Bei kommen keine doppelten Karten vor.

Stillmatic 20. Mai 2007 22:46

Re: Kartenspiel
 
Ja schau mal nach, bitte!!!

TCards = (k7, k8, k9, kb, kd, kk, k10, ka,
h7, h8, h9, hb, hd, hk, h10, ha,
p7, p8, p9, pb, pd, pk, p10, pa,
kr7, kr8, kr9, krb, krd, krk, kr10, kra);

zecke 20. Mai 2007 22:55

Re: Kartenspiel
 
Also das sieht mir etwas umständlich aus :)

Ich habe meins gefunden:

So ich habe noch was gefunden:

Ich habe eine Klasse TKarte die so aussieht (für deine Zwecke angepasst):

Delphi-Quellcode:
type
  TKartenWert = 1..13; // 1 = AS, 11 = Bube, 12 = Dame, 13 = König
  TKartenFarbe = (kfKaro, kfHerz, kfPik, kfKreuz);
  TKartenPosition = 1..8;

TKarte = class(TObject)
    private
      FWert: TKartenWert;
      FFarbe: TKartenFarbe;
      FPosition: TKartenPosition;
      FUsedBool: Boolean;
    public
      constructor Create(Wert : TKartenWert;Farbe : TKartenFarbe;Position : TKartenPosition);
      property Wert: TKartenWert read FWert write FWert;
      property Farbe: TKartenFarbe read FFarbe write FFarbe;
      property Position: TKartenPosition read FPosition write FPosition;
      property UsedBool: Boolean read FUsedBool write FUsedBool;
    end;
Der cunstructor:
Delphi-Quellcode:
constructor TKarte.create(Wert : TKartenWert;Farbe : TKartenFarbe;Position : TKartenPosition);
begin
  inherited create;
  FWert := Wert;
  FPosition := Position;
  FFarbe := Farbe;
  FUsedBool := UsedBool;
end;
Das sind im Grunde meine Karten. Dann habe ich eine Funktion zum Ziehen für die Farbe jeder Karte.

Die Kartenfarbe:
Delphi-Quellcode:
function drawKartenFarbe(RFarbe : integer):TKartenFarbe;
begin
  case RFarbe of
    1 : result := kfKaro;
    2 : result := kfHerz;
    3 : result := kfPik;
    4 : result := kfKreuz;
  end;
end;
Dann ziehe ich die Karten und prüfe auf doppelte, wenn doppelte vorhanden sind ziehe ich nochmal, bis es keine doppelten Karten gibt. Die Karten stecke ich in ein Array von TKarte (Karten ziehen):
Delphi-Quellcode:
for a := 1 to 8 do
    begin
      ABlatt[a]:=TKarte.Create((random(13)+1),drawKartenFarbe((random(4)+1)),a); //(random(13)+1) = KartenWert!
    end;

Stillmatic 20. Mai 2007 23:11

Re: Kartenspiel
 
Sry aber durch den Code blick ich ja überhaupt nicht durch!!
Wie könnte das ganze denn für mein Problem aussehen??

zecke 20. Mai 2007 23:34

Re: Kartenspiel
 
:hi:

Gar nicht :mrgreen: Das war nur ein Vorschlag, wie Du es machen kannst. Dann weißt Du jederzeit exakt welche Karte wo ist.

Für dein Problem, ohne meinen Code zu verwenden:

Wenn Du eine Karte ziehst, bekommst Du dann ja zB k7 zurück. Wenn Du das jetzt in ein Array speicherst, dann hast Du ein Array[1..8] mit z.B. den Werten k7,h8,k9,ka,p9,pb,pd,pa. Wenn Du das getan hast, prüfst Du die Werte auf doppelte. Dazu würde ich Dir in deinem Fall eine Funktion empfehlen, die einen bool'schen Wert zurück gibt. Negativ, wenn keine doppelten vorhanden sind:
Delphi-Quellcode:
function testdouble():boolean;
var a,b : integer;
    double : boolean;
begin
 for a := 1 to 8 do begin
  for b := 1 to 8 do begin
   if a<>b then begin
    if DeinArray[a]=DeinArray[b] then begin
     result:=true;
    end
    else begin
     result:=false;
    end else begin
              break;
   end;
  end;
 end;
end;
Das funktioniert hoffentlich, habe es nicht getestet. Du könntest also so weiter machen:
Delphi-Quellcode:
repeat
//Karten ziehen
until
not testdouble();
Hoffe das hilft weiter :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr.
Seite 1 von 3  1 23      

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