Autor Beitrag
Cybo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 12:11 
Moin

Also, ich bastel gerade ein Memory Spiel. Das Spiel ansich ist soweit auch 1A Fertig geworden, abernach 2-3 Spielen ist es langweilig, da ich nur 20 Symbole habe und diese erst einmal wie folgt geladen. Also ich brauche jede Karte 2mal und deshalb einmal "to" und einmal downto". So nun bräucht ich also eine "neu Mischen" funktion. hat jemand eine Idee?
Ich hatte an Random gedacht in einer Schleife, aber irgendwie kommt da nix bei raus.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 
For i:=1 to IconZahl DO begin
     NextPos(x,y);
     IcoName:= 'Icon'+IntToStr(i);
     TKarte.Create(Self,x,y,IcoName);
   end;
   For i:=IconZahl downto 1 DO begin
     NextPos(x,y);
     IcoName:= 'Icon'+IntToStr(i);
     TKarte.Create(Self,x,y,IcoName);
     Brueckseite.Click;
   end;


Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.09.04 12:14 
Ich seh da kein Random.
Dran gedacht, dass Du vor der Random-Funktion einmal Randomize aufrufen musst? Sonst kommt nämlich nix dabei raus.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 12:16 
jasocul hat folgendes geschrieben:
Ich seh da kein Random.
Dran gedacht, dass Du vor der Random-Funktion einmal Randomize aufrufen musst? Sonst kommt nämlich nix dabei raus.


Das ist der funktionierende Code. Da ist auch noch kein Random drin. Ich brauche ja auch Vorschläge. Denn wenn ich Random nehme muss ich ja immer eine weitere Zahl aus Random rausnehmen und ich weiß nicht wie...

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.09.04 12:25 
[scherz]Randomize aufrufen. Danach den PC schütteln, bis die Ausgabe fertig ist.[/scherz]

Mal im Ernst: Auf die schnelle wurde ich ein Array of Integer der Größe 20 definieren. Dann die Random-Funktion benutzen um das Array zu füllen, bis es mit sinnvollen Zahlen gefüllt ist.
danach Deine Routinen aufrufen allerdings, dabei die Werte aus dem Array zur Positionierung verwenden.
Zu beachten ist natürlich, dass das Array nicht an mehreren Stellen gleiche Werte bekommt. Also nicht einfach Random 20 mal aufrufen und das Array füllen.

Fertigen Source habe ich da leider nicht. Aber Dein Source sieht auch nicht so aus, als ob Du den brauchst.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 12:32 
jasocul hat folgendes geschrieben:
[scherz]Randomize aufrufen. Danach den PC schütteln, bis die Ausgabe fertig ist.[/scherz]

Mal im Ernst: Auf die schnelle wurde ich ein Array of Integer der Größe 20 definieren. Dann die Random-Funktion benutzen um das Array zu füllen, bis es mit sinnvollen Zahlen gefüllt ist.
danach Deine Routinen aufrufen allerdings, dabei die Werte aus dem Array zur Positionierung verwenden.
Zu beachten ist natürlich, dass das Array nicht an mehreren Stellen gleiche Werte bekommt. Also nicht einfach Random 20 mal aufrufen und das Array füllen.

Fertigen Source habe ich da leider nicht. Aber Dein Source sieht auch nicht so aus, als ob Du den brauchst.



netter Scherz, ich würge ihn schon den ganzen morgen den alten Tower ;-)

hmm.Ich dachte daran es so einfach wie möglich zu halten, indem ich 20 Zahlen einfach durcheinander wirbel. Du schlägst ja jetzt vor die Positionen der Bild zu verändern. Wäre natürlich auch ne Möglichkeit, damit laden mir die Bilder immernoch in der selben Reihenfolge ein, aber werden nicht immer an die nächste Position gesetzt *nachdenk*

Wäre es nicht einfach die 20 Zahlen einfach zu míschen und in neuer Reihenfolge zu laden?
(Hab ich noch nie gebraucht, deswegen frage ich)

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.09.04 12:37 
Cybo hat folgendes geschrieben:

Wäre es nicht einfach die 20 Zahlen einfach zu míschen und in neuer Reihenfolge zu laden?
(Hab ich noch nie gebraucht, deswegen frage ich)
Cybo


Klar. Nur dann must Du die Random-Funktion auf den Mischvorgang anwenden. Sortieren ist irgenwie einfacher. Da gibts aber leider keine Umkehrfunktion.
Ich denke um Random kommst nicht herum. Ansonsten wirst Du nur immer wieder eine Wiederholung bekommen.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 13:11 
Na dann gib mir mal mit den Array teilen bitte etwas Starthile.

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.09.04 13:23 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure Mischen;
var
  arr : Array [1..20] of Integer;
  cnt1 : Integer;
  cnt2 : Integer;
  Wert : Integer;
  Naechster : Boolean;
begin
  Randomize;
  cnt1 := 1;
  repeat
    Wert := Random(640); // Die Zahl gibt den maximalen Wertebereich an
    if cnt1 > 1 then begin
      Naechster := True;
      for cnt2 := 1 to cnt1 do begin
        if arr[cnt2] = Wert then Naechster := False;
      end;
    end;
    if Naechster then begin
      arr[cnt1] := Wert;
      inc(cnt1);
    end;
  until cnt1 > 20;
end;


Das wirst Du noch anpassen müssen, damit die Bildpositionen auch passend sind. Aber als Anfang sollte es genügen. Ist übrigens getesteter Source.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 13:27 
Danke, dass sieht gut aus, aber wenn du mir jetzt noch erklärst:
Random(640); wieso 640, dann bin ich einen guten Schritt, dank dir, weiter.

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.09.04 13:33 
Naja, Bildschirmauflösung im schlimmsten Fall 640 x 480. Da ist sogar 640 schon zu viel :wink:
Ansonsten lies den Kommentar im Source. Die Zahl gibt den höchstmöglichen Wert des Random-Ergebnisses an.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 13:38 
jasocul hat folgendes geschrieben:
Naja, Bildschirmauflösung im schlimmsten Fall 640 x 480. Da ist sogar 640 schon zu viel :wink:
Ansonsten lies den Kommentar im Source. Die Zahl gibt den höchstmöglichen Wert des Random-Ergebnisses an.


*Ahhh* Licht aufgeh. Ja, jetzt ist es klar, danke. Ich werde dann da ein bisschen dran basteln ;-)
und wenn es nciht geht, melde ich mich nochmal.

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 14:58 
Ich geb erstmal auf ;-) Ich habe mich zuwenig mit dem ArrayGedöns beschäftigt bisher :(
Ich bekomme das nicht hin. Naja, nachher nochmal versuchen.

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 16.09.04 17:50 
Hab mal noch ne Funktion, die relativ gut mischt und meinen Info-Lehrer etwas überfordert hat (ob se wirklich funzt) :D

Also, hier der Source:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
Procedure MixIt(var A:Array of Integer);
const
  MixCount = 10;
var
  S1, S2:Integer;
  A1, A2:Array of Integer;
  X, Y:Integer;
begin
  Randomize;

  SetLength(A1, Length(A));
  SetLength(A2, Length(A));

  For X := 1 To MixCount do
  Begin
    For Y := 0 To High(A) Do
    Begin
      If Random(2) = 0 Then
      Begin
        A1[S1] := A[Y];
        Inc(S1);
      end
      else
      Begin
        A1[S2] := A[Y];
        Inc(S2);
      end;
    end;

    Move(@A1[0], @A[0], SizeOf(Integer) * S1);
    Move(@A2[0], @A[S1], SizeOf(Integer) * S2);
  end;
end;


Macht nix weiter, als A in zwei Listen aufzuteilen (zufällig entweder in A1 oder A2) und dann mit Move wieder zusammenzufügen. Dabei sollte MixCount > 2*Log2(Length(A)) sein, da ansonsten die Zufälligkeit von A nicht komplett gegeben ist. Achso: Es ist egal, ob A vorher sortiert wurde, oder nicht :D

Hoffe, Ihr könnt mal sagen, ob der kryptografisch gesehen sicherer mischt als Random :D

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 17:57 
BenBE hat folgendes geschrieben:
Hab mal noch ne Funktion, die relativ gut mischt und meinen Info-Lehrer etwas überfordert hat (ob se wirklich funzt) :D

Also, hier der Source:

Macht nix weiter, als A in zwei Listen aufzuteilen (zufällig entweder in A1 oder A2) und dann mit Move wieder zusammenzufügen. Dabei sollte MixCount > 2*Log2(Length(A)) sein, da ansonsten die Zufälligkeit von A nicht komplett gegeben ist. Achso: Es ist egal, ob A vorher sortiert wurde, oder nicht :D

Hoffe, Ihr könnt mal sagen, ob der kryptografisch gesehen sicherer mischt als Random :D


So, und nun wende das doch bitte mal auf meinen Code oben an, dann wäre ich dir unendlich dankbar.

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.09.04 18:05 
Deine Prozedur NextPos muss umgeschrieben werden, damit die zufällige Kartenverteilung nutzen kannst.
Wenn Du den Source postest, kann man vielleicht mehr helfen.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 18:09 
jasocul hat folgendes geschrieben:
Deine Prozedur NextPos muss umgeschrieben werden, damit die zufällige Kartenverteilung nutzen kannst.
Wenn Du den Source postest, kann man vielleicht mehr helfen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure 


Spiel.FormCreate(Sender: TObject);
const iconZahl = 30;
var x,y  : integer;
    i    : integer;
    IcoName: string;

   procedure NextPos(var x,y:integer);
   begin
     if x = 320  then begin
        x:=0; y:= y+ 50; end;
     x:= x + 50;
   end;

begin
   x:=0; y:=10;
   For i:=1 to IconZahl DO begin
     NextPos(x,y);
     IcoName:= 'Icon'+IntToStr(i);
     TKarte.Create(Self,x,y,IcoName);
   end;
   For i:=IconZahl downto 1 DO begin
     NextPos(x,y);
     IcoName:= 'Icon'+IntToStr(i);
     TKarte.Create(Self,x,y,IcoName);
        end;
 end;


Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.09.04 18:49 
Hat ein bisschen gedauert. War gerade beim Abendessen.
Dabei konnte ich noch ein wenig über das Problem nachdenken und das war gut so!
Die Routine von BenBE ist gar nicht so übel um das Mischproblem hinzubekommen.

Zunächst ein paar Deklarationen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Type
  PosRec = record
    x : Integer;
    y : Integer;
  end;
var
  arr : Array [1..20] of PosRec;


Dann füllst Du das Array mit gültigen Positionen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  arr[1].x := 50;
  arr[1].y := 20;
  arr[2].x := 10;
  arr[2].y := 70;
.
.
.

Wenn sich die Werte berechnen lassen, kannst Du ja ne Schleife drumrum bauen.

Dann nimmst Du BenBEs MixIt. Musst natürlich die Parameter-Definition ändern.

Am Ende solltest Du einfach eine For-Next-Schleife benutzen, um die Karten zu platzieren. Das sollte dann theoretisch zufällig sein.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 16.09.04 19:41 
Außerdem musst du bei der Anpassung drauf achten, dass du den Datentyp der SizeOf-Argumente in den beiden Move-Anweisungen (Zeilen 30 und 31) an deinen Elementtyp anpasst. Sonst kopiert er nicht genug Speicher.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Cybo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 87

Win 95/98/xp/NT Suse Linux
D7 Ent
BeitragVerfasst: Do 16.09.04 20:12 
BenBE hat folgendes geschrieben:
Außerdem musst du bei der Anpassung drauf achten, dass du den Datentyp der SizeOf-Argumente in den beiden Move-Anweisungen (Zeilen 30 und 31) an deinen Elementtyp anpasst. Sonst kopiert er nicht genug Speicher.


Heute klappt hier drüben gaaar nix. Ich verusche jetzt seit heute mittag diese blöde Funktion da einzubauen und mir friert entweder Delphi ein oder es gibt unmengen von Fehlern. Könnet sich jemand erbarmen die Mix Procedure oben in meinen Code einzufriemeln? :x :oops: :roll:

Cybo

_________________
Ich öffnete, kompilierte und traute meinen Augen nicht.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 16.09.04 20:53 
In deiner Ausgangsfunktion ergänzt du einfach ein dynamisches Array of Integer und füllst dieses mit den Werten deiner Schleifen.
Danach rufst du vor jeder Schleife MixIt(DeinArray) auf
In der Schleife:
Indexgrenzen von 0 bis Count-1 ändern
Anstatt IntToStr(i) ändern in IntToStr(DeinArray[i])

Dann sollte es funzen.

P.S.: Müsste es in deiner NextPos-Funktion nicht

If X > 320 Then

heißen?

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.