![]() |
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(); |
Re: Kartenspiel
Vorschlag. Lege im Oncreate alle Karten in ein Array, also jede Karte einmal. Und dann mischt du einfach immer bevor du ziehst, indem du zB 1000mal zufällige Karten vertauscht ;-)
|
Re: Kartenspiel
Ich hab gerade ein Problem!!
Also ich berechne in einer Function den Gewinn! Nun möchte ich diesen Gewinn in einer anderen Unit(Hauptunit) nutzen! Die Hauptunit hat Zugriff auf alle anderen Units, jedoch hat die Unit in der die Funktion ist, die den Gewinn beinhaltet keinen Zugriff auf andere Units!!! Wie bekomme ich jetzt den Wert des Gewinns in die Hauptunit??? INFO::: Die Function die den Gewinn beinhaltet liefert keinen integer zurrück, also muss ich mir ja höchst wahrscheinlich eine HilfsFunktion schreiben, aber das Funktioniert dann nicht wirklich!!! BEISPIEL:::: HIER WIRD DER GEWINN BERECHNET
Code:
Wie bekomme ich jetzt diesen Gewinn in die Hauptunit???
FUNCTION BLAHBLAHBLAH : boolean;
{GewinnÜberprüfung} Gewinn := 0; {Paar1} if ((Karten[0] in OwnDeck) or (Karten[1] in OwnDeck)) then Gewinn := (Gewinn+(CWinFactors[0] * (Maechtigkeit * UConst.cCardCost))); {Paar2} if ((Karten[2] in OwnDeck) or (Karten[3] in OwnDeck)) then Gewinn := (Gewinn+(CWinFactors[1] * (Maechtigkeit * UConst.cCardCost))); {Paar3} if ((Karten[4] in OwnDeck) or (Karten[5] in OwnDeck)) then Gewinn := (Gewinn+(CWinFactors[2] * (Maechtigkeit * UConst.cCardCost))); {Paar4} if ((Karten[6] in OwnDeck) or (Karten[7] in OwnDeck)) then Gewinn := (Gewinn+(CWinFactors[3] * (Maechtigkeit * UConst.cCardCost))); {GroßesLos} if (Karten[8] in OwnDeck) then Gewinn := (Gewinn+(CWinFactors[4] * (Maechtigkeit * UConst.cCardCost))); |
Re: Kartenspiel
Du kannst deine Funktion so deklarieren: FUNCTION BLAHBLAHBLAH(out gewinn:integer) : boolean;
Das heißt, dass du beim Funktionsaufruf eine Variable mit angeben musst, in die dann der Gewinn reingeschrieben wird. Du musst im Funktionsrumpf einfach Gewinn auf einen bestimmten Wert setzen. |
Re: Kartenspiel
Ich darf die Funktion nicht verändern!!!
Kann man das nicht mit ner getFunktion machen??? Ich probiere es aber es klappt nicht!! |
Re: Kartenspiel
@Stillmatic
Wie meinst du das mit der "getFunktion". Der vernünftigste Weg wäre wie @Apollonius schon meinte über einen Out-Parameter. Wenn dies bei dir nicht möglich sein sollte, dann kannst du zb. auch den Gewinn in einer globalen Variable im Interface-Abschnitt speichern und vom Hauptprogramm darauf zugreifen, ist aber wohl der schlechteste Weg. |
Re: Kartenspiel
Das ist schlecht!!
Ich darf keine globalen Variablen anlegen und die Funktionen nicht verändern!! mit getGewinn meine ich..... Das einer Funktion den Wert des Gewinnes übergeben wird??? |
Re: Kartenspiel
Hab ich mir gedacht, aber wenn du nichts ändern darfst, wie
kannst du dann ein lokale Variable innerhalb einer Funktion zurückgeben. Was darfst du denn jetzt wirklich ändern? |
Re: Kartenspiel
Ich darf alles ändern ausser die vorgegebenen Funktionen und ich darf keine globalen Variablen anlegen!!!
|
Re: Kartenspiel
:o und Gewinn ist eine Variable innerhalb der Funktion getGewinn oder ist die eventuell
woanders deklariert. Wäre es möglich die komplette Funktion anzusehen, denn ich kann mir nicht vorstellen, das eine Funktion zur Gewinnermittlung den Gewinn nicht zurückgeben kann :-D |
Re: Kartenspiel
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leutz!!
Ich hab das Programm (als .exe) mal hochgeladen!! Wenn sich ein paar freiwillige mal zum testen opfern könnten, wäre dies sehr nett!! Über Meinungen würd ich mich freuen! :lol: Falls wer die Spielregeln nicht kennt..... ![]() |
Re: Kartenspiel
:hi:
Wenn ich vier gewinne und danach bei der Frage für ein neues Blatt auf nein klicke, werden mir nur 2 gut geschrieben, anstatt die gewonnenen 4. :gruebel: (reproduzierbar) |
Re: Kartenspiel
Dann hast du sicherlich 2 Karten gekauft die bei klick auf Nein natürlich wieder bezahlt werden müssen!!
Also::: Guthaben = 20 Karten = 2 NeuesGuthaben = 18 Paar4 getroffen Neues Guthaben = 22 Neue Karten = Nein Neues Guthaben = 20 ..... |
Re: Kartenspiel
Aha ok, aber warum muss ich 2 mal die Karten bezahlen obwohl ich nur ein mal spielen will? :gruebel:
edit: Achso jetzt hab ichs verstanden. das gilt quasi als noch mal spielen mit den selben Karten. Dachte, das heisst sowas wie aufhören ;). dann ist ja gut :mrgreen: |
Re: Kartenspiel
Sonst ist keinem was aufgefallen???
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 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