Delphi-PRAXiS

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:

.chicken 21. Mai 2007 12:00

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 ;-)

Stillmatic 21. Mai 2007 16:14

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:
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)));
Wie bekomme ich jetzt diesen Gewinn in die Hauptunit???

Apollonius 21. Mai 2007 16:33

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.

Stillmatic 21. Mai 2007 16:35

Re: Kartenspiel
 
Ich darf die Funktion nicht verändern!!!
Kann man das nicht mit ner getFunktion machen???
Ich probiere es aber es klappt nicht!!

Gremlin 21. Mai 2007 16:52

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.

Stillmatic 21. Mai 2007 16:54

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???

Gremlin 21. Mai 2007 17:44

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?

Stillmatic 21. Mai 2007 17:46

Re: Kartenspiel
 
Ich darf alles ändern ausser die vorgegebenen Funktionen und ich darf keine globalen Variablen anlegen!!!

Gremlin 21. Mai 2007 17:55

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

Stillmatic 22. Mai 2007 12:43

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.....

http://de.wikipedia.org/wiki/Schlesische_Lotterie

zecke 22. Mai 2007 13:25

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)

Stillmatic 22. Mai 2007 13:30

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

.....

zecke 22. Mai 2007 15:00

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:

Stillmatic 23. Mai 2007 14:51

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