![]() |
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 :) |
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.
|
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:
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.
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; ![]() 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! |
AW: Skatspiel programmieren
Delphi-Quellcode:
Wenn das so kompilierbar ist, fress ich nen Besen :stupid:
type TWert = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A);
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); |
AW: Skatspiel programmieren
Wie ich sagte, ungetestet... habs mir auch irgendwie gedacht, dass das so vielleicht nicht klappt, aber.. Asdf :P
|
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? |
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. |
AW: Skatspiel programmieren
Delphi-Quellcode:
Liste1 als eine temporäre Instanz sollte auch hier wie folgt deklariert werden (dann gibt es auch keine Speicherlecks)
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;
Delphi-Quellcode:
Generell zu den Karten, dem Mischen und der Problematik mit den doppelten Karten:
Liste1 := TStringList.Create;
try ... finally Liste1.Free; end; 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 :) |
AW: Skatspiel programmieren
Warum auch immer, aber Matze hat einen
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 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