Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kartenspiel Algorithmus (https://www.delphipraxis.net/15750-kartenspiel-algorithmus.html)

Ömmel 3. Feb 2004 16:47


Kartenspiel Algorithmus
 
Tag!
Ich habe ein ziemliches Problem einen Algorithmus zum sortieren eines Kartenspiel zu entwerfen! Es geht in dem Programm darum, dass 10 zufällige Zahlen aus einem Kartenstapel (54 Karten) gezogen werden. Diese Karten müssen nun in der hand des Spielers sortiert werden. Frage: Wie sieht der Algorithmus aus, wenn ich ein Arrayfeld von 54 habe??? :?: :!: :gruebel:
MFG Ömmel

fkerber 3. Feb 2004 16:50

Re: Kartenspiel Algorithmus
 
Hi!

Geht es dir drum, die 54 Karten zu sortieren, oder nur die 10 gezogenen?
Willst du das Ganze mit Delphi machen? (Wenn ja ==> Falsche Kategorie).

Ciao fkerber

Matze 3. Feb 2004 16:50

Re: Kartenspiel Algorithmus
 
Delphi-Quellcode:
randomize;

...

for i := 1 to 10 do
  Karte := array[random(54)+1];
Sortieralgos gibt's in der CodeLib.

Stanlay Hanks 3. Feb 2004 16:56

Re: Kartenspiel Algorithmus
 
Du könntest jeder Karte eine Art ID verpassen (Vielleicht mit einem Type und dann eine Eigenschaft "ID" und damit ein Array). Dann könntest du anhand dieser ID die Karten sortieren.

Man liest sich, Stanlay :hi:

Michael Leyhe 3. Feb 2004 17:12

Re: Kartenspiel Algorithmus
 
HI

Ich würde es so machen wie Stanley Hanks es beschrieben hat.
Alle Karten bekommen eine Nummer wobei die niedrigste Karte die niedrigste Nummer bekommt und die höchste Karte die höchste Nummer.
Wenn du nun die Nummern sortierst(Sortierverfahren stehen in der Cod.lib.), dann sind die Karten in aufsteigender Reihenfolge sortiert.

Jelly 3. Feb 2004 17:47

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von Matze
Delphi-Quellcode:
randomize;

...

for i := 1 to 10 do
  Karte := array[random(54)+1];

Bedenke aber noch bei dem Code keine Karten doppelt zu ziehen, sonst hast du plötzlich 5 Asse :lol:

Gruß,
Tom

d3g 3. Feb 2004 18:24

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von Jelly
Bedenke aber noch bei dem Code keine Karten doppelt zu ziehen, sonst hast du plötzlich 5 Asse :lol:

Und dazu nimmst du am besten Sets, das beste an Pascal überhaupt.

Delphi-Quellcode:
function PickCards(): String;
var
  Picked, i: Integer;
  Cards: set of 1..54;
  s: String;
begin
  Cards := [];
  for i := 1 to 10 do begin
    Picked := Randomize(54) + 1;
    if (not (Picked in Cards)) then
      Cards := Cards + [Picked];
  end;

  Result := '';
  for i := 1 to 54
    if (i in Cards) then begin
      case (i div 13) of
        0: Result := 'Kreuz ';
        1: Result := 'Pik ';
        2: Result := 'Herz ';
        3: Result := 'Karo ';
      end;
      case (i mod 13) of
        1:    Result := Result + 'As';
        2..10: Result := Result + IntToStr(i mod 13);
        11:   Result := Result + 'Bube';
        12:   Result := Result + 'Dame';
        0:    Result := Result + 'König';
      end;
    end;
end;
[edit]Zum Sortieren kannst du das Sortier-Tutorial hier aus dem Forum zu Rate ziehen.[/edit]

Matze 3. Feb 2004 18:26

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von Jelly
Bedenke aber noch bei dem Code keine Karten doppelt zu ziehen, sonst hast du plötzlich 5 Asse :lol:

Jo, neue Spielregeln :mrgreen:


[Edit]Cool, ich bin ja Gold-Member :)[/Edit]

Nico1 3. Feb 2004 18:51

Re: Kartenspiel Algorithmus
 
Hallo ich will ja jetzt nicht als altklug klingen aber

Picked := Randomize(54) + 1; --> sollte nach meiner meinungnach random(54) heißen oder täusche ich mich :chat:
// edit
Aja : for i := 1 to 54 --> sollte for i := 1 to 54 do
// edit
noch was : das s : String kannste auch weglassen :mrgreen:

mfg Nico

d3g 3. Feb 2004 18:54

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von Nico1
Picked := Randomize(54) + 1; --> sollte nach meiner meinungnach random(54) heißen oder täusche ich mich :chat:

Ich bin von einem Pascal-Programmierer ausgegangen, der mit 1 zu zählen beginnt (obwohl 0 oft sinnvoller ist). Random(54) gibt einen Wert zwischen 0 und 53 zurück.

d3g 3. Feb 2004 18:58

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von Nico1
Aja : for i := 1 to 54 --> sollte for i := 1 to 54 do

Wahr. Ich hab zu viel C programmiert.

Zitat:

Zitat von Nico1
noch was : das s : String kannste auch weglassen :mrgreen:

Auch wahr. Hab's vergessen wegzumachen, als ich aus dem Codebeispiel eine Funktion gemacht hab.

Nico1 3. Feb 2004 18:58

Re: Kartenspiel Algorithmus
 
Eine Frage noch(bin nur so interresiert weil ich auch grad das brauche) aber warum kommt bei mir bis auf eine Herzausnahme NUR KARO?

Nico1 3. Feb 2004 19:00

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von d3g
Ich bin von einem Pascal-Programmierer ausgegangen, der mit 1 zu zählen beginnt (obwohl 0 oft sinnvoller ist). Random(54) gibt einen Wert zwischen 0 und 53 zurück.


Ich meinte eigentlich das es RANDOM und nicht RANDOMIZE heißt :lol:

Noch was : Karo 9As sollte eigentlich nicht vorkommen (ich sah halt noch nie eien As 0 :mrgreen: )

Tschuldigung das ich mit solche sachen komme aber wie ich schon oben erwähnt habe brauch ich den Code für so eine Funktion und bin dir deshalb sehr dankbar! :oops:

/Edit sorry Moderatoren wegen den Doppelpost war ein Versehen!

d3g 3. Feb 2004 19:08

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von Nico1
Ich meinte eigentlich das es RANDOM und nicht RANDOMIZE heißt :lol:

Hat mich irgendwer unter Drogen gesetzt? Entweder sind meine Pascal-Kenntnisse total verrottet oder ich merke gar nicht, wie wenig konzentriert ich gerade bin.

Zitat:

Zitat von Nico1
Eine Frage noch(bin nur so interresiert weil ich auch grad das brauche) aber warum kommt bei mir bis auf eine Herzausnahme NUR KARO?

Zufall? Ich kann keinen Fehler finden (aber das heißt ja im Moment nichts).

Zitat:

Zitat von Nico1
Noch was : Karo 9As sollte eigentlich nicht vorkommen (ich sah halt noch nie eien As 0 :mrgreen:)

:?:

Dagon 3. Feb 2004 19:10

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von Nico1
Eine Frage noch(bin nur so interresiert weil ich auch grad das brauche) aber warum kommt bei mir bis auf eine Herzausnahme NUR KARO?

Du musst im OnCreate der Form noch Randomize hinschreiben.

Nico1 3. Feb 2004 19:11

Re: Kartenspiel Algorithmus
 
Das hab ich aber es geht trotzdem nicht


Aber ich kann sonst nichts finden! :( oder bin ich jetzt zu vertrottelt? :roll: :wall: :gruebel:

d3g 3. Feb 2004 19:16

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von the_master
Zitat:

Zitat von Nico1
Eine Frage noch(bin nur so interresiert weil ich auch grad das brauche) aber warum kommt bei mir bis auf eine Herzausnahme NUR KARO?

Du musst im OnCreate der Form noch Randomize hinschreiben.

Er hat doch nicht etwa für jeden Funktionsaufruf das Programm neugestartet?

Ich hab übrigens noch einen Fehler gefunden... :roll: Mit 0 zu zählen zu beginnen ist ja doch besser. Jetzt tötet mich, ihr Pascal-Only-Jedis! :wink:

Delphi-Quellcode:
function PickCards(): String;
var
  Picked, i: Integer;
  Cards: set of 1..54;
  s: String;
begin
  Cards := [];
  for i := 1 to 10 do begin
    Picked := Random(54) + 1;
    if (not (Picked in Cards)) then
      Cards := Cards + [Picked];
  end;

  Result := '';
  for i := 1 to 54
    if (i in Cards) then begin
      case ((i - 1) div 13) of
        0: Result := 'Kreuz ';
        1: Result := 'Pik ';
        2: Result := 'Herz ';
        3: Result := 'Karo ';
      end;
      case ((i - 1) mod 13) of
        1:    Result := Result + 'As';
        2..10: Result := Result + IntToStr(i mod 13);
        11:   Result := Result + 'Bube';
        12:   Result := Result + 'Dame';
        0:    Result := Result + 'König';
      end;
    end;
end;

Dagon 3. Feb 2004 19:20

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von d3g
Er hat doch nicht etwa für jeden Funktionsaufruf das Programm neugestartet?

Ich habe zu erst gepostet, dann erst nachgedacht. :oops:

MikeS 3. Feb 2004 19:23

Re: Kartenspiel Algorithmus
 
deine funktion sieht gut aus aber was machst du für den fall das

(i-1) div 13 = 4 (i-1) mod 13 = 0
und
(i-1) div 13 = 4 (i-1) mod 13 = 1

dafür hast du keine auswertung!

53/13 = 4,...
52/13 = 4,0;

Dagon 3. Feb 2004 19:25

Re: Kartenspiel Algorithmus
 
Ich weiss jetzt wieso immer nur KARO ausgegeben wird! :lol:
Der höchste werd im Set "Cards" ist mit grosser Wahrscheinlich keit immer eine Zahl die x div 13 = 3 geben wird. Da die schleife ja 54 mal ausgefürd wird und eben x div 13 mit gorsser Wahrscheinlichkeit 3 gibt, wird auch immer als Schlussresultat Karo asugegebn.

Ich hoffe man versteht was ich meine.

d3g 3. Feb 2004 19:33

Re: Kartenspiel Algorithmus
 
Zitat:

Zitat von MikeS
dafür hast du keine auswertung!

53/13 = 4,...
52/13 = 4,0;

Dass da Joker im Spiel sind hab ich auch überhaupt nicht geplant -- bei mir ist 13 * 4 == 54 :wall:. Schön langsam glaube ich an die Drogen-Sache, vor allem weil ich noch einen weiteren dummen Fehler gefunden habe.

Delphi-Quellcode:
type
  TStrArray = array[1..10] of String;

function PickCards(): TStrArray;
var
  Picked, i, count: Integer;
  Cards: set of 1..54;
  s: String;
begin
  Cards := [];
  for i := 1 to 10 do begin
    Picked := Random(54) + 1;
    if (not (Picked in Cards)) then
      Cards := Cards + [Picked];
  end;

  Result := '';
  count := 1;

  for i := 1 to 54 do begin
    if (i in Cards) then begin
      if (i - 1 >= 13 * 4) then
        Result[count] := 'Joker'
      else
        case ((i - 1) div 13) of
          0: Result[count] := 'Kreuz ';
          1: Result[count] := 'Pik ';
          2: Result[count] := 'Herz ';
          3: Result[count] := 'Karo ';
        end;
        case ((i - 1) mod 13) of
          0..8: Result[count] := Result[count] + IntToStr((i + 1) mod 13);
          9:   Result[count] := Result[count] + 'Bube';
          10:  Result[count] := Result[count] + 'Dame';
          11:  Result[count] := Result[count] + 'König';
          12:  Result[count] := Result[count] + 'As';
        end;
    count := count + 1;
  end;
end;
Immerhin braucht jetzt nicht mehr hinterher sortiert zu werden.

[edit]Das war der Fehler, den ich meinte, the_master.[/quote]
[edit]Und schon wieder so ein dummer In-Pascal-fängt-man-mit-1-an-zu-zählen-nicht-konsequent-durchgeführt-Fehler[/edit]

Ömmel 4. Feb 2004 14:23

Re: Kartenspiel Algorithmus
 
Eure Beiträge sind echt genial!! Besten Dank, Problem gelöst, Mission erfüllt!!! :dancer:

MFG Ömmel :hi:

Seniman 4. Feb 2004 20:04

Re: Kartenspiel Algorithmus
 
Hallo zusammen,

ich glaube da ist noch ein Fehler in dem Code von d3g. Soweit ich das richtig sehe passiert folgendes: Der Computer zieht 10 mal hintereinander eine Karte. Wenn er sie noch nicht hat, dann nimmt er sie dazu, ansonsten nicht. Was passiert nun, wenn er zweimal die gleiche Karte zieht? Dann müsste er doch eigentlich hinterher nur 9 Karten auf der Hand haben. Oder sehe ich das falsch? Deswegen würde ich eher eine Repeat-Until-Schleife statt einer for-Schleife einbauen.

Grüße
Seniman

d3g 5. Feb 2004 17:14

Re: Kartenspiel Algorithmus
 
Du siehst das richtig. Ich sollte als Strafe aufhören müssen zu programmieren und bis zum Ende meines Lebens dazu verdammt sein, meine Wachphasen im Kunstunterricht zu verfristen.


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