Zufall "verbessern"
Übersicht

![]() |
M0rgensternBetreff: Zufall "verbessern" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo.
Ich bin gerade einen kleinen Shooter a la Moorhuhn am entwickeln, quasi als Einstieg. Ich bin jetzt gerade dabei die *Gegner* zu optimieren (Momentan sind es Karotten, werde ich noch ändern). Die X- und Y-Position wird jeweils per Zufall festgelegt. Die X-Position ist sehr ausgeglichen (weit links, Mitte und auch weit rechts). Aber was die Y-Position angeht: Ich habe einfach das Gefühl, dass es einfach ziemlich mittig geballt ist. Meine Frage ist also, wie ich den Zufall optimieren kann, damit es mehr verteilt wird. Hier ist der Code für die Y- Position: Code: [AUSKLAPPEN] Gegnererstellen = Gegnererstellen+1 If Gegnererstellen>= 70 ; kreire jeden 70 Durchlauf einen Gegner Local werty = Rand(20,1024) ; auf einer zufälligen Position If werty <= Y1BORDER werty = Y1BORDER + 3 ElseIf werty >= Y2BORDER werty = Y2BORDER - 3 EndIf EndIf Hinweis: Y1Border = 10 Y2Border = 1023 (Um den Bildschirm abzugrenzen) Danke schonmal im Voraus, Gruß, M0rgenstern[/code] |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Seedrnd Millisecs() gesetzt ? | ||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du erstellst einen Zufallswert zwischen 20 und 1024 und prüfst aber nochmal, ob er nicht zufällig zu weit außen liegt?! Setz die Ränder doch gleich in Rand![]() |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier ein Code (von mir) welcher 10 Zahlen generiert ohne das eine doppelt vorkommt (kannst natürlich auch 25 oder 1000 nehmen)
Mach vlt das es 10 zahlen macht und dann neu beginnt (der preformance wegen ![]() Code: [AUSKLAPPEN] Graphics 640,480
SeedRnd MilliSecs() Dim zahlen(10) ;Dim Feld erstellen For i = 1 To 10 .again neuezahl= Rnd (1,10) ;Zufällige Zahl For a = 1 To 10 If neuezahl=zahlen(a) ;Falls die Zahl im Dimfeld enthalten ist Print "doppelte zahl gefunden nämlich die "+neuezahl Goto again ;Die ganze Prodzedur nochmal EndIf Next zahlen(i)=neuezahl ;Jetzt da wir uns sicher sind das sie nicht doppelt vorkommt, ins dim speichern Next Print "" For i = 1 To 10 Print "Zahl-"+i+" ="+zahlen(i) ;So können wir testen, von 10 zahlen keine doppelte dabei ;) Next mfg ozzi |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, hier ist der Code mit Xpos und der Geschwindigkeit... Hab jetzt nachträglich Seedrnd millisecs() eingefügt, nur halt folgendes Problem:
Jetzt sind 90% der Gegner vielo zu langsam. Code: [AUSKLAPPEN] Function CreateGegner() SeedRnd MilliSecs() Gegnererstellen = Gegnererstellen+1 If Gegnererstellen>= 70 ; kreire jeden 70 Durchlauf einen Gegner Local werty = Rand(20,1024) ; auf einer zufälligen Position If werty <= Y1BORDER werty = Y1BORDER + 3 ElseIf werty >= Y2BORDER werty = Y2BORDER - 3 EndIf EndIf If Gegnererstellen>= 70 Local wertx = Rand(20,1280) If wertx <= X1BORDER wertx = X1BORDER + 3 ElseIf wertx >= X2BORDER wertx = X2BORDER - 3 EndIf If Gegnererstellen>= 70 Local gesw = Rand(1,7) EndIf Edit: Danke für den Code Ozzi. Hab ihn mir angesehen, aber ich werd ihn nicht benutzen, da ich mir egientlich geschworen habe nie wieder Goto zu benutzen, nachdem ich ein Txtadventure geschrieben hat das ohne Schleifen nur mit Goto funktioniert hat und ich absolut keinen Überblick mehr hatte. Hab auch überlegt, ob ichs umschreiben kann, aber mir wäre nur die Möglichkeit eingefallen If-Verschachtelungen reinzupacken und das gefällt mir nicht... Trotzdem danke |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Local gesw = Rand(1,7) if times=2 times=0 if gesw_all<3 then gesw=gesw+rnd(2,3) gews_all=0 endif gesw_all=gesw_all+gesw times=times+1 Probiers mal so ![]() Der Code addiert alle ermittelten werte, wenn die 2 werte kleiner sind also 2 ,also 2 mal kleine werte gekommen sind, erhöht er den wert um 2 oder 3 Wens immer noch zu langsam ist mach doch einfach => Local gesw = Rand(3,7) |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, es geht nicht darum, dass es zu langsam ist.
Wenn ich Seedrnd millisecs() weg lasse, dann ist die Geschwindigkeit zwischen 1 und 7 sehr ausgeglichen (was ich ja auch will). Wenn ich Seedrnd() millisecs rein mache, dann werden fast alle gegner total langsam laos zwischen 1 und 3 schätzungsweise. Das ist das Problem. |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
zunächst einmal solltest du verstehen, was SeedRnd Millisecs() macht.
Es generiert eine Zufallszahl (SeedRnd) auf Grund der aktuellen Zeit(Millisecs() seit dem Systemstart) Ich habe gesehen, dass du dieses Konstrukt in der Funktion benutzt, ich weiß ja nicht, ob es von Vorteil ist, aber du brauchst es nur einmal am Anfang des Programms zu setzten. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Boah, Geil
Jetzt, da Seedrnd Millisecs() ganz am Anfang steht funktionierts super. Es ist alles ausgeglichen. Danke sehr. |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dein Freund und Helfer , die Online Hilfe
Hilfe => Grundlagen => Zeit und Zufall 3 Clicks:wink: Zmb steht dort Zitat: Es ist empfehlenswert diesen Befehl nur einmal bei Programmstart auszuführen. Wird er öfter aufgerufen, zum Beispiel innerhalb einer Schleife, kann nicht gewährleistet werden, dass "gute" Zufallszahlen kommen. So kann es z.B. sein, dass dann nur hohe oder niedrige Zahlen zurückgegeben werden.
mfg ozzi |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group