| Autor |
Beitrag |
Cybo
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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.
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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.09.04 13:23
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); 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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.09.04 13:33
Naja, Bildschirmauflösung im schlimmsten Fall 640 x 480. Da ist sogar 640 schon zu viel
Ansonsten lies den Kommentar im Source. Die Zahl gibt den höchstmöglichen Wert des Random-Ergebnisses an.
|
|
Cybo 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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
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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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)
Also, hier der Source:
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
Hoffe, Ihr könnt mal sagen, ob der kryptografisch gesehen sicherer mischt als Random 
_________________ 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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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)
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
Hoffe, Ihr könnt mal sagen, ob der kryptografisch gesehen sicherer mischt als Random  |
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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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. |
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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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:
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:
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 87
Win 95/98/xp/NT Suse Linux
D7 Ent
|
Verfasst: 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?
Cybo
_________________ Ich öffnete, kompilierte und traute meinen Augen nicht.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
|
|