Zufall "verbessern"

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Zufall "verbessern"

BeitragMo, Okt 27, 2008 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 27, 2008 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Seedrnd Millisecs() gesetzt ?
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Xeres

Moderator

BeitragMo, Okt 27, 2008 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ein (wenn sie denn variabel sein müssen).

ozzi789

BeitragMo, Okt 27, 2008 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink)
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

BeitragMo, Okt 27, 2008 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 27, 2008 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragMo, Okt 27, 2008 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 27, 2008 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

M0rgenstern

BeitragMo, Okt 27, 2008 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Boah, Geil
Jetzt, da Seedrnd Millisecs() ganz am Anfang steht funktionierts super.
Es ist alles ausgeglichen.

Danke sehr.

ozzi789

BeitragMo, Okt 27, 2008 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group