Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Skatkartenspiel (https://www.delphipraxis.net/69206-skatkartenspiel.html)

Mobby 11. Mai 2006 17:26


Skatkartenspiel
 
also ich brauch hilfe beim kartenmischen...

ich hab ein kartenspiel das ein normales skatblatt ist und gemischt werden soll!
naja dann kommt halt noch das SINNVOLLE reizen und das "normale" system beim austeilen was grafisch ein bisschen dargestellt werden soll...also dass in der mitte meinetwegen ein memofeld ist in dem dann nacheinander erst 3 mal 3 karten kommen dann der skat dann 3 mal 4 karten und nochmal 3 mal 3 karten...aber ich denk mal es kennen doch so einige skat :mrgreen: außerdem soll das ganze soll auf arrays basieren.
ich hab es schon versucht mit

begin
i:=0;
// alle variablen sind schon eingetragen

for i to 32 do

begin
spielkarten:=nagelneu[random(32)+1];
spieler_1:=spielkarten+' '+spieler_1;

end;

end;

ja und dann weiß ich nicht wirklich wie ich das verhindern soll dass er bei dem random nur einmal z.b. die 10 nimmt und nicht zufällig 3mal... :wall:
und bei dem "sinvollen" reizen seh ich auch keine wirkliche strategie hinter...also ich brauch doch ein bisschen mehr hilfe bei meinem eigentlich simplen kartenspiel.
kann mir vllt jemand helfen?
ich weiß es is bestimmt ziemlich simpel aber ich wollt mal etwas relativ einfaches machen zum einstieg... :lol:

Mavarik 11. Mai 2006 17:37

Re: Skatkartenspiel
 
Zitat:

Zitat von Mobby
begin
i:=0;
// alle variablen sind schon eingetragen
Delphi-Quellcode:
for i to 32 do

 begin
  spielkarten:=nagelneu[random(32)+1];
  spieler_1:=spielkarten+' '+spieler_1;

 end;

end;

Hmmmm kann ggf länger dauern:

Delphi-Quellcode:
var
  weg : array[1..32] of boolean;
  kart : integer;
  c   : integer;
begin
  fillchar(Weg,sizeof(weg),byte(false));

  c := 0;
  repeat
    Kart := random(31)+1; /// 31!!!!
    inc(c);
  Until not(weg[Kart]) or (C > 100)

  if not(weg[Kart]) then // Dann halt die nächste
    begin
      for c:=1 to 32 do
       if not(weg[Kart]) then
         Kart := c;
    end;

  spielkarten:=nagelneu[Kart];
  Weg[Kart] := true;
  spieler_1:=spielkarten+' '+spieler_1;

 
end;
Ungetestet....

Hawkeye219 11. Mai 2006 18:09

Re: Skatkartenspiel
 
Herzlich willkommen in der Delphi-PRAXiS, Mobby.

Das zufällige Ziehen von Karten aus einem immer gleich großen Stapel ist, wie du richtig bemerkt hast, nicht sehr sinnvoll. Bei den letzten Karten kann es sehr lange dauern, weil die "richtigen" Zahlen einfach nicht gezogen werden.

Versuche es doch einmal mit folgender Lösung:

1.) Vereinbare ein Array A mit 32 Elementen und lege dort die Zahlen 1 bis 32 ab.
2.) Erzeuge zwei Zufallszahlen z1 und z2 aus dem Bereich 1..32.
3.) Vertausche die Arrayelemente A[z1] und A[z2].
4.) Wiederhole die Schritte 2 und 3 solange, bis die gewünschte Unordnung im Array A hergestellt ist.

Anschließend enthält das Array A alle Zahlen aus dem Bereich 1..32 in einer zufälligen Reihenfolge. Diese Zahlen kannst du nun als Index für dein Feld nagelneu benutzen, in dem offenbar die Karten abgelegt sind.

Gruß Hawkeye

Mobby 11. Mai 2006 20:32

Re: Skatkartenspiel
 
gut...das mischen klappt jetzt ganz gut...nur das reizen is das probelm...

tigerman33 12. Mai 2006 18:24

Re: Skatkartenspiel
 
Beim Reizen wirst du das Problem haben, dass ja in irgendeiner Art und Weise der "Wert" des Blattes berechnet werden muss. Die zulässige Höchstgrenze zu finden dürfte ja nicht weiter schwer sein, aber anschließend brauchst du eine Bewertungsfunktion für deine Karten, die bestimmt ob und wenn ja wieviel weniger gereizt werden soll. Wenn du überreizen auch noch einbauen willst wird es sogar noch komplizierter.

So aus dem Kopf mal einige Kriterien die diese Funktion überprüfen sollte (wo immer möglich abgestützt auf sinnvolle Hilfsfunktionen):
-gutes Null- (7,8,9) oder Grandblatt (mind. 2 Buben und viele Asse+Zehnen oder eine lange Farbe)
-Anzahl Trümpfe, insbesondere Anzahl Buben sowie Höhe der Trumpfkarten
-Beiblatt, insbesondere Anzahl der Asse sowie der durch Asse gedeckten Zehnen, dazu auch die Anzahl der blanken Zehnen

Das ist aber schon für Menschen ein recht vager Prozess, der auch einiges an Erfahrung fordert, daher dürfte das recht schwierig nachzubilden sein.

Mobby 15. Mai 2006 16:39

Re: Skatkartenspiel
 
Also wir haben ja nun unser mischen und geben hinbekommen...das haben wir dann mit einem Timer verzögert, so dass die Karten nacheinander wie beim Skat gegeben werden...

Nun stellt sich mir mal wieder die schon von tigerman33 angerissenen Frage mit dem reizen...also also mir ist jetzt unverständlich, wie ich einem varaiblen Array, das ja gemischt wird (mehrmals) einen festen Wert zuweisen soll!
Hat vielleicht jemand eine Idee wie man das realisieren könnte?
Also eigentlich hatte ich mir es nicht so schwer vorgestellt :roll:

happyaura 15. Mai 2006 23:14

Re: Skatkartenspiel
 
Ihr könntet erst einmal zu allen möglichen spielen berechnen, wie weit man reizen kann.
also erst einmal die buben beschauen, (mit/ohne 1,2,3,4) * Kreuz, Pik, Herz, Karo, Grange, null Hand ect. dann müßt ihr überlegen wie stark die einzelnden Möglichkeiten wären.
Also mit Kreuz und pik wär ich zu schwach zum spielen, mit herz würd vielleicht gehen, mit karo gehts besser, aber dafür kann man weniger weit reizen.
dann reizen, bis zum höchsten akzeptablen wert
ggf Skat aufnehmen und neu berechnen, welches blatt am tollsten sein könnte und ob man das noch spielen kann (ohne sich zu überreizen). Sowas wie auf Schneider spielen kann man ja erst einmal rauslassen.
Dementsprechend dann Karten drücken.

beim spielen kann man dann noch mal überlegen, welche Karten schon raus sind und welche vorteile man daraus zieht. ebenfalls, wer auf welcher Farbe Blank ist.

in die Bewertungsfunktion muß also irgendwie die anzahl der karten und die höhe der karten eingehen. evtl sogar das beiblatt noch ein wenig.
Ihr könnt ja erst einmal eine provisorische Funktion bauen und dann ein paar mal karten vergeben und sehen, ob ihr mit dem blatt spielen würdet. dementsprechend könnt ihr die bewertungsfunktion anpassen und die grenze, ab welchem Wert man spielen will.
das spielen selber bringt dann sicher auch noch mal 'ne neue herausforderung.

wenn ihr das spielen als erstes baut, könnt ihr auch den computer gegen sich selbst spielen lassen und ihn "lernen" lassen, was gute Blätter sein könnten und was nicht, aber ich denke, das bringt noch mehr aufwand mit sich. vor allem muß man das spielen dann schon ziemlich gut realisieren, damit man zu vernünftigen ergebnissen kommt.

das wären soweit meine gedanken dazu, wünsche noch viel erfolg


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