#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 + Multi-Zitat Zitieren
#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! + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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! + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren