Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Skatspiel programmieren (https://www.delphipraxis.net/159400-skatspiel-programmieren.html)

Matze1848 26. Mär 2011 15:41

Skatspiel programmieren
 
Moin,moin.

Ich bin derzeit Klasse 11 und möchte mich mal an höheren Aufgaben als Ampeln und Sonnensystemen probieren ;)
Dacht ich mir, probier ich mal ein Skatspiel zu programmieren.
Also erstmal ohne cards.dll, sondern mit Buttons oder so.

Hab ich mir gedacht fang ich ma mitm mischen an, irgendwas in richtung.

randomize;
Karten:=random(34)+1;
Case Karten of
1:
2:
..
34:


Aber wie könnt ichs weiter gestalten, oder bin ich total auf dem holzweg (Also ich wills nich so hardcore kompliziert, weil oft hab ich in den Foren einfach Algorithmen gesehen, die wollt ich gar nicht sehen :-D)
Wahrscheinlich brauch ich einfach nur den richtigen Denkanstoß.. Danke für eure Hilfe schonmal im voraus :)

DeddyH 26. Mär 2011 16:05

AW: Skatspiel programmieren
 
Das Einfachste ist, eine Liste mit 32 (nicht 34) Elementen zu erstellen und solange eine mit einem zufälligen Index zu ziehen, in eine 2. Liste zu kopieren und aus der ersten zu löschen, bis diese leer ist.

wicht 26. Mär 2011 16:10

AW: Skatspiel programmieren
 
Hi,

ich kann zwar kein Skat, aber um die Karten zu mischen und in einer Liste zu haben, würde ich wie folgt vorgehen. Erstmal braucht man ja die Karten, dafür sollte man sich eine Klasse bauen, wenn man es ordentlich machen will.

Delphi-Quellcode:
type
  TFarbe = (Pik, Kreuz, Karo, Herz);
  TWert = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A);
  TKarte = class
  public
    Farbe: TFarbe;
    Wert: TWert;
  end;

procedure ListeBauen;
var
  i, n: Integer;
  Karten: TList;
begin
  Karten := TList.Create;

  for i := 0 to High(TFarbe) do
    for n := 0 to High(TWert) do
    begin
      Karten.Add(TKarte.Create);
      Karten[Karten.Count - 1].Farbe := TFarbe(i);
      Karten[Karten.Count - 1].Wert := TWert(n);
    end;

  Mische(Karten);
end;
Vielleicht passen die Werte für Skat jetzt nicht, aber damit hat man dann alle Karten in der Liste, die mir jetzt einfallen. Du müsstest dann nur noch diese Liste mischen (meine nicht implementierte Mische()-Funktion), über Google habe ich z.B. das hier gefunden.

Tipp: Bevor du, wie in deinem Beispiel, jede Karte nur eine Zahl sein lässt, fang gleich damit an, alles, was ein Objekt sein sollte, auch so zu bauen. Dadurch wird der Code schöner und du kommst später besser damit klar.
Achja, und der Code von mir da oben ist ungetestet.. :)


HTH


Edit: Roter Kasten, aber dieses tolle Beispiel muss unbedingt gepostet werden!

BUG 26. Mär 2011 16:19

AW: Skatspiel programmieren
 
Delphi-Quellcode:
type TWert = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A);
Wenn das so kompilierbar ist, fress ich nen Besen :stupid:
Delphi-Quellcode:
// bei wJ, wQ, wK, wA ist das 'w' unnötig, aber so ist es konsistenter.
type TWert = (w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, wJ, wQ, wK, wA);

wicht 26. Mär 2011 16:43

AW: Skatspiel programmieren
 
Wie ich sagte, ungetestet... habs mir auch irgendwie gedacht, dass das so vielleicht nicht klappt, aber.. Asdf :P

Matze1848 26. Mär 2011 19:20

AW: Skatspiel programmieren
 
okok,erst einmal danke für die Beiträge. ich hab mir das mit der liste zu herzen genommen und erstmal (ohne skat oder so) ein mischalgorithmus erstellt, der in ein Memofeld schreibt. hat aber länger gedauert als ich dachte :D


procedure TForm1.Button1Click(Sender: TObject);
var Karten: Integer;
Ausgabe: String;
x : Integer;
Liste1: TStringList;
begin
Memo1.Lines.Clear;
Randomize;
for x:= 1 to 32 do
begin
Karten:=Random(32)+1;
Liste1:=TStringList.Create;

if Karten=1 then
begin
Ausgabe:='Kreuz Bube';
Liste1.insert(1,'1');
end

[...]

else if Karten=32 then
begin
Ausgabe:='Karo 7';
Liste1.insert(32,'32');
end;

Memo1.Lines.Add(Ausgabe);
end;
Liste1.Free;
end;




Ich krieg jetzt aber leider, nachdem ich das Programm kompiliert habe den Fehler
'List index out of bounds(irgendeine random zahl)'.
Woran kann das liegen, wie kann ich das beheben?

Und noch eine Frage. Mit dem Mischen, werden da ja doppelte angezeigt, also zb. Herz10 doppelt und karoKönig 4mal. Wie behebe ich das, sodass jede nur einmal vorhanden ist?

TonyR 26. Mär 2011 20:45

AW: Skatspiel programmieren
 
also mal prinzipiell:

1. Bitte benutze die DELPHI-Tags um deinen Code besser lesbar zu machen
2. Wenn du eine Fehlermeldung vom Debugger erhälst, muss du immer genau dazuschreiben, wo der Fehler auftritt und wie er exakt lautet
und 3. man sieht ja, dass du noch sehr am Anfang stehst mit deinen Delphi-Kenntnissen, aber du solltest trotzdem versuchen zu verstehen, was andere DP-Mitglieder dir schreiben

Weil so wie du gerade anfängst, ist es ziemlich unsinnig, ich denk mal, du würdest viel mehr Hilfe bekommen, wenn du "wicht" seinen Vorschlag versuchst zu verstehen und Fragen dazu stellst.

Sir Rufo 26. Mär 2011 23:38

AW: Skatspiel programmieren
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Karten: Integer;
  Ausgabe: String;
  x : Integer;
  Liste1: TStringList;
begin
  Memo1.Lines.Clear;
  Randomize; // Nur einmal beim Programmstart aufrufen

  for x:= 1 to 32 do
    begin
      Karten:=Random(32)+1;
      Liste1:=TStringList.Create; // Speicherleck 32x erzeugt und 1x freigegeben (s.u.)

      if Karten=1 then
        begin
          Ausgabe:='Kreuz Bube';
          Liste1.insert(1,'1'); // Liste1 hat zu diesem Zeitpunkt 0 Einträge! ;o)
        end

[...]

      else if Karten=32 then
        begin
          Ausgabe:='Karo 7';
          Liste1.insert(32,'32');
        end;

      Memo1.Lines.Add(Ausgabe);
    end;

  Liste1.Free;
end;
Liste1 als eine temporäre Instanz sollte auch hier wie folgt deklariert werden (dann gibt es auch keine Speicherlecks)
Delphi-Quellcode:
Liste1 := TStringList.Create;
try
  ...
finally
  Liste1.Free;
end;
Generell zu den Karten, dem Mischen und der Problematik mit den doppelten Karten:
Warum gibt es beim Spiel im RealLife keine doppelten Karten?
Wenn du das raus hast, dann hast du auch den Ansatz wie man es programmiert :)

TonyR 27. Mär 2011 01:07

AW: Skatspiel programmieren
 
Warum auch immer, aber Matze hat einen weiteren Thread geöffnet und auch da Antworten erhalten...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 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