![]() |
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... |
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. |
Re: Kartenspiel
Hab es soweit!!
Code:
Aber das Funktioniert überhaupt nicht!
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]); @Zecke das müsste ich ja einen neuen array of boolean anlegen, aber es geht doch sicherlich auch anders??? |
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: |
Re: Kartenspiel
Ja TCards hab ich selber erstellt, da sind halt alle Karten drin von [k7(Karo 7) ..ha(Herz Ass)]
|
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. |
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); |
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:
Der cunstructor:
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;
Delphi-Quellcode:
Das sind im Grunde meine Karten. Dann habe ich eine Funktion zum Ziehen für die Farbe jeder Karte.
constructor TKarte.create(Wert : TKartenWert;Farbe : TKartenFarbe;Position : TKartenPosition);
begin inherited create; FWert := Wert; FPosition := Position; FFarbe := Farbe; FUsedBool := UsedBool; end; Die Kartenfarbe:
Delphi-Quellcode:
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):
function drawKartenFarbe(RFarbe : integer):TKartenFarbe;
begin case RFarbe of 1 : result := kfKaro; 2 : result := kfHerz; 3 : result := kfPik; 4 : result := kfKreuz; end; end;
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; |
Re: Kartenspiel
Sry aber durch den Code blick ich ja überhaupt nicht durch!!
Wie könnte das ganze denn für mein Problem aussehen?? |
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:
Das funktioniert hoffentlich, habe es nicht getestet. Du könntest also so weiter machen:
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;
Delphi-Quellcode:
Hoffe das hilft weiter :mrgreen:
repeat
//Karten ziehen until not testdouble(); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz