[Delphi] Karten austeilen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von OdinWalhalla, 12. Februar 2007 .

Schlagworte:
  1. 12. Februar 2007
    Karten austeilen

    HI @ all,

    bin grad dabei ein kartenspiel zu programmieren, hab nur folgendes problem:

    ich lasse mir zuerst 40 karten ausgeben, die ich dann mische, das funktionier auch sehr gut. nur wenn ich nun die karten austeile, also 36 karten an 3 spieler dann gehen 6 karten verloren. meine funktion die dies tut sieht wie folgt aus:

    Code:
    function austeilen(karten:TKartenarray; p:integer):TAusgebene;
    var i, j, x :integer;
    begin
    j := 1;
    x := 1;
    for i:=1 to high(karten)-4 do
    begin
     if j <= p then
     begin
     if x <= 12 then
     begin
     result[j, x] := karten[i];
     j := j+1;
     end
     else
     begin
     x := 1;
     end;
     end
     else
     begin
     j := 1;
     x := x+1;
     end;
    end;
    end;
    dabei ist TAusgebene ein mehrdimensionaler Array

    Code:
    type TAusgebene = array[1..12, 1..12] of string;
    TKArtenarray ist ein Array, der die gemischten 40 spielkarten beinhaltet.

    Code:
    type TKartenarray = array[1..40] of string;
    p sind die anzahl der spieler also in dem fall 3. j ist der spieler und ich die karte von 1 bis 12 also result[spieler, karte] hoffe ihr könnt mir helfen!

    Danke im vorraus! MFG Odin
     
  2. 12. Februar 2007
    AW: Karten austeilen

    schau mal, wenn du nur von den 40 karten sozusagen pro spieler 12 karten austeilen willst, dann arbeite doch mit dem modulo-operator, dieser sorgt dafür, dass, wenn der modulo-wertebereich überschritten wird, wieder bei 1 angefangen wird zu zählen.(eigentlich bei 0, aber bei delphi ist das so ne sache, kenn die sprache nicht)

    habe einfach mal deinen quelltext vereinfacht, habe aber noch nie mit delphi programmiert, also es können eventuelle syntax-fehler drin sein.
    desweiteren würde ich dir raten, Variablen richtig zu benennen oder kommentare zu den algorithmen zu schreiben, damit die übersicht behalten bleibt. auch ganz wichtig für übersicht ist das einrücken des textes mittels tab, um so schleifen usw. kenntlich zu machen.

    Code:
    function austeilen(karten:TKartenarray; p:integer):TAusgebene;
    var i, j :integer;//variablen initialisieren
    begin
     for i:=1 to high(karten)-4 do //GEH 36 Karten durch, wenn hight(karten)=41
     begin
     for j=1 to p do // geh alle SPIELER durch
     begin
     result[j,(i%12)] := karten[i]; //gib spieler j als i%12-te karte die i-te karte vom stapel
     end;
     end;
    end;
    
    ciao - Idefix!
     
  3. 12. Februar 2007
    AW: Karten austeilen

    Hi,
    da gibt es wirklich einige Probleme in dem Code (@OdinWalhalla),
    die Funktion Teilt jedem Spieler jeweils eine Karte aus, nachdem allen eine Karte
    ausgeteilt wurde überspringt sie eine Karte und macht teilt beim ersten Spieler
    wieder aus, dh. mit anderen Worten bei jeder "Austeilrunde" geht eine Karte verloren.
    Außerdem teilt er jedes mal nur insgesamt 36 Karten aus egal wie viele Spieler.

    Meine erste Frage dazu ist was ist wenn mehr als drei Spieler mitmachen wollen das wären
    ja (12 * 4) 48 Karten die ausgeteilt werden müssten, wie willst du dass machen oder können nur maximal 3 Spieler mitspielen und die zweite Frage wäre willst du die Karten die dann noch im
    Stapel "übrig" bleiben im weiteren Verlauf des Spieles noch benutzten (dann musst du das ganz anders machen)?

    So jetzt zur Lösung, du willst also jedem Spieler nacheinander jeweils eine Karte austeilen
    bis jeder Spieler 12 Karten hat: (bei mehr als drei Spielern können Fehler auftreten)

    Code:
    [B]function[/B] austeilen(karten:TKartenarray; p:integer):TAusgebene;
    [B]var[/B] i :integer; [COLOR="Blue"]//Variablen deklaratieren[/COLOR]
    [B]begin[/B]
     [B]for [/B]i:=1 [B]to [/B](p*12) [B]do [/B][COLOR="Blue"]//p Spiele * 12 Karten insgesamt austeilen[/COLOR]
     [B]begin[/B]
     [COLOR="Blue"]//initalizierung und Inkrementierung wird durch die For schleife dargestellt[/COLOR]
     Result[((i-1) [B]mod [/B]p) + 1, ((i-1) [B]div [/B]p) + 1] := karten[i];
    
     [COLOR="Blue"] //Karte Spieler NR Geben:
     //Den Indexwert der aktuellen Karte um 1 subtrahieren und
     //dem Rest, der Teilung, durch die Spieleranzahl, 1 addieren.
    
     //Aktuelle Karte Nr die dem Spieler gegeben werden muss:
     //Den Indexwert der aktuellen Karte um 1 subtrahieren und
     //dem Ergebnis der Teilung durch die Spieler Anzahl 1 addieren.[/COLOR]
     [B]end[/B];
    [B]end[/B];
    
    Ist das das was du gesucht hast?

    Mfg

    Rushh0ur
     
  4. 13. Februar 2007
    AW: Karten austeilen

    hmm mal sehen ob ich auch ne Idee hab:

    Code:
    ...
    for j:=1 to p begin //Durchlaufe alle Spieler
     x:=j; //Welche Karte aus dem Stapel
     z:=1; //Zähler für Karten (wievielte karte
     while not x>=high(karten)-4 do begin //Durchlaufe bis zum Ende des Stapels
     result(j,z):=karten(x); //Der Spieler j erhält als zte Karte die Karte x
     Inc(z); //Z wird erhöht (nächste Karte für Spieler)
     x:=x+p; //x wird um die Spieleranzahl erhöht (erklärung unten)
     end;
    end;
     
    
    Durch das x:=x+p erhält der erste Spieler die Karten 1; 4 (1+3); 7 (4+3) und so weiter. Der zweite 2,5,8 und der Dritte 3,6,9. Kann sein das ich das Problem verkehrt verstanden habe, aber das wäre meine Idee die Karten zu verteilen
     
  5. 13. Februar 2007
    AW: Karten austeilen

    @gfz12comment: momentan ist für jeden spieler jede karte gleich, x sollte mit j initialisiert werden, nicht mit 1, dann passt das.

    ciao - Idefix!
     
  6. 13. Februar 2007
    AW: Karten austeilen


    Danke für die Hilfe an alle bw habt ihr alle bekommen! was ich mit den spielern meinte war, das wenn jetzt zb vier spieler da sinn dann soll er jedem spiler nur 9 Karten austeilen.

    und ja die letzten vier karten benötige ich im verlauf des Spiels noch, wie muss ich das dann ganz anders machen?

    Mfg ODIn
     
  7. 13. Februar 2007
    AW: Karten austeilen

    Ok dann ist es ja alles klar, also die von mir aufgelistete Funktion kannst du dann auch für dieses Problem benutzten; musst nur in der For-Schleife den Endwert ändern:

    Code:
    [B]function[/B] austeilen(karten:TKartenarray; p:integer):TAusgebene;
    [B]var[/B] i :integer; [COLOR="Blue"]//Variablen deklaratieren[/COLOR]
    [B]begin[/B]
     [B]for [/B]i:=1 [B]to [/B]high(karten)-4 [B]do [/B]
     [B]begin[/B]
     Result[((i-1) [B]mod [/B]p) + 1, ((i-1) [B]div [/B]p) + 1] := karten[i];
     [B]end[/B];
    [B]end[/B];
    
    Und anders musst du dann auch nichts machen, kannst ja auf die Restlichen vier Karten mit
    "karten[37..40]" zugreifen.

    Bemerkung:
    Aus Optimierungsgründen würde ich für "high(karten)-4" auch die Konstante 36, diese wird
    sowieso nie verändert, direkt angeben, weil erstens der Code kleiner wird und zweitens
    weniger "CPU-Leistung" benötigt wird diesen Wert auszurechnen, aber das ist nicht so wichtig
    da sich die beiden Punkte erst bei größeren Projekten bemerkbar machen.


    Mfg

    Rushh0ur
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.