AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kartenspiel

Ein Thema von Stillmatic · begonnen am 20. Mai 2007 · letzter Beitrag vom 23. Mai 2007
Antwort Antwort
Seite 1 von 3  1 23      
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#1

Kartenspiel

  Alt 20. Mai 2007, 22:08
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...
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Kartenspiel

  Alt 20. Mai 2007, 22:10


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.
mfg zecke
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#3

Re: Kartenspiel

  Alt 20. Mai 2007, 22:30
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???
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Kartenspiel

  Alt 20. Mai 2007, 22:34


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).
mfg zecke
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#5

Re: Kartenspiel

  Alt 20. Mai 2007, 22:40
Ja TCards hab ich selber erstellt, da sind halt alle Karten drin von [k7(Karo 7) ..ha(Herz Ass)]
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Kartenspiel

  Alt 20. Mai 2007, 22:42


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.
mfg zecke
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#7

Re: Kartenspiel

  Alt 20. Mai 2007, 22:46
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);
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Kartenspiel

  Alt 20. Mai 2007, 22:55
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;
mfg zecke
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#9

Re: Kartenspiel

  Alt 20. Mai 2007, 23:11
Sry aber durch den Code blick ich ja überhaupt nicht durch!!
Wie könnte das ganze denn für mein Problem aussehen??
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Kartenspiel

  Alt 20. Mai 2007, 23:34


Gar nicht 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
mfg zecke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:34 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