Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "mischen" (https://www.delphipraxis.net/57516-mischen.html)

Gnorksy 22. Nov 2005 16:12


"mischen"
 
Hi,

Ich versuche mich grade daran, ein Memory Spiel zu programmieren. Von der Technik her ist dies auch kein Problem. Bisher habe ich das ganze so gemacht, dass die Zahl einzelnen Karten (TImages) nicht gemsischt werden, So ist es also "easy going" anhand des Sender zu ermitteln, ob ich ein gültiges Paar zufassen habe.

Mein eigentliches Problem besteht jetzt darin, dass irgenteinen "Misch"-Algorithmus brauche. Nehmen wir also einmal an, ich habe 18 Spielkarten (TImages also). Nun will ich es irgentwie hinbekommen, das aus diesen 18 Karten Zufällig Pärchen gebildet werden. Mir kommt es dabei nicht sonderlich auf Quellcode an, sondern eher auf Pseudo-Code und Gedankengänge. Mein eigenes Gehirn lässt da offenbar zu wünschen übrig :( .

Ich hoffe ihr könnt mir irgentwie weiterhelfen,

Gruß,

Gnorksy

BenjaminH 22. Nov 2005 16:15

Re: "mischen"
 
Ich habs so gemacht:
Ich hab die Karten in ner Liste
jetzt tausche ich die Karte 1 mit einer zwischen 2 und 18
Karte 2 mit einer Karte zwischen 3 und 18 etc.
Am Ende Tausche ich Karte 18 mit einer beliebigen, also könnte sie auch an derselben Stelle bleiben.
Das ganze natürlich in einer Schleife
Ich halte das für eine gut funktionierenden Vorgehensweise, ob die wahrscheinlichkeiten da gleichmäßig sind weiß ich nicht, vll. weiß jemand wie das ist?

ichbins 22. Nov 2005 16:17

Re: "mischen"
 
garantiert nicht. probiers aus.

ich würde das so machen:

ich hab zuerst ein Array (oder eine Liste) mit sortierten Elementen, und dann hänge ich an ein 2. Array nacheinander zufällig die Elemente des 1. Arrays an.

gerade hab ich deine Möglichkeit getestet:
Delphi-Quellcode:
var
  a:array[1..18] of integer;
  tmp:integer;
  i,j,element:integer;
  elements:array[1..18,1..18] of integer;
const
  count=1000000;
begin
  label1.Caption:='';
  for i:=1 to 18 do
    for j:=1 to 18 do
      elements[i,j]:=0;
  for j:=1 to count do begin
    for i:=1 to 18 do
      a[i]:=i;
    randomize;
    for i:=1 to 18 do begin
      tmp:=a[i];
      if i<>18 then
        element:=random(18-i)+i
      else
        element:=random(18)+1;
      a[i]:=a[element];
      a[element]:=tmp;
    end;
    for i:=1 to 18 do
      elements[i,a[i]]:=elements[i,a[i]]+1;
  end;
  for i:=1 to 18 do
  begin
    for j:=1 to 18 do
      label1.Caption:=label1.Caption+inttostr(elements[i,j])+' | ';
    label1.Caption:=label1.Caption+#13;
  end;
end;
tatsächlich ist jede Zahl ungefähr gleich häufig an jeder Stelle im Array enthalten.

Code:
|52|51|56|47|63|53|56|57|55|58|57|54|53|62|55|57|54|60|
|57|55|52|56|51|60|58|49|54|52|59|55|62|42|66|54|58|60|
|66|56|56|52|57|49|62|48|68|51|66|38|70|39|57|55|58|52|
|55|65|75|60|46|49|53|60|47|52|55|60|47|61|57|46|50|62|
|55|41|54|56|58|52|54|59|60|56|59|54|51|63|52|63|60|53|
|51|57|58|67|55|53|62|55|51|61|56|56|52|49|52|45|61|59|
|58|59|48|64|54|51|43|58|70|47|54|54|63|60|55|50|58|54|
|48|55|56|64|60|62|63|59|70|61|31|57|63|66|54|35|45|51|
|66|54|47|49|57|43|83|44|53|63|51|57|56|61|48|60|52|56|
|53|60|78|66|51|55|57|65|56|44|50|54|57|52|45|47|57|53|
|52|52|48|49|50|66|51|48|59|46|61|59|67|57|61|57|63|54|
|58|66|58|48|50|53|52|58|49|58|50|58|44|56|74|62|54|52|
|52|63|51|52|61|61|51|52|47|51|61|70|50|54|62|56|51|55|
|48|50|49|64|56|48|53|49|51|69|62|63|56|67|49|62|43|61|
|57|60|57|50|61|64|55|66|44|53|57|49|43|47|59|74|52|52|
|56|45|46|49|62|70|52|62|52|61|62|51|42|59|56|53|69|53|
|54|59|53|53|59|55|49|61|64|55|52|62|61|51|43|70|42|57|
|62|52|58|54|49|56|46|50|50|62|57|49|63|54|55|54|73|56|

himitsu 22. Nov 2005 16:20

Re: "mischen"
 
tausche doch einfach in einer Schleife immer zwei zufällige Karten.

Delphi-Quellcode:
for i := 1  to 1000 do begin
  i2 := random(18);
  i3 := random(18);
  TauscheKarten(i2, i3);
end;

Khabarakh 22. Nov 2005 16:34

Re: "mischen"
 
Stichwort [dp="Permutation"]Permutationen[/dp]: http://www.delphipraxis.net/internal...=385553#385553

DerDan 22. Nov 2005 17:03

Re: "mischen"
 
ich finde die kombination aus BenjaminH und himitsu am besten:

hier wird einfach jede karte (1..18) mit einer beliebigen anderen getauscht.

Delphi-Quellcode:
for i := 1  to 18 do begin
  i2 := random(18);
  TauscheKarten(i2, i);
end;

mfg DerDan

Gnorksy 26. Nov 2005 08:50

Re: "mischen"
 
Super! Vielen Dank, ich habe es jetzt so gemacht, wieDerDan vorgeschlagen hat. Warum bin ich da nur nicht selbst drauf gekommen :oops:

Gruß,

Gnorksy


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