Noch heftige Probleme mit Zufallszahlen...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

PacMani

Betreff: Noch heftige Probleme mit Zufallszahlen...

BeitragSo, März 28, 2010 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe zwar schonmal nach Zufallszahlen ohne Dubletten gefragt, aber damit sind alle meine Probleme mit Zufall etc. nicht gelöst... ich erkläre mal das Problem:

Im Spiel gibt es mehrere Powerups. Diese können an vorher festgelegten Stellen im Level auftauchen, die Stellen sind hier zu sehen:
Code: [AUSKLAPPEN]
o      o
   o  o
 o
    o o

Es sind also genau 7 Stellen, an denen Powerups auftreten können. Zu Anfang, wenn das Level geladen wird, werden 3 Powerups gesetzt, die anderen 4 leer gelassen:
Code: [AUSKLAPPEN]
o      x
   x  o
 x
    x o

Sobald nun ein Powerup eingesammelt wird, verschwindet dies auf der einen Stelle und taucht auf einer zufälligen leeren Stelle wieder auf:
Code: [AUSKLAPPEN]
o      x
   x  x
 o
    x o

Und wie man das programmieren soll, da weiß ich nicht weiter. Sollte man leere Stellen in einem eigenen Type unterbringen, sollte man alle Stellen in einem Type mit Benutzt%-Field anlegen, und wie soll ich das ganze dann durchlaufen?
Hatte schon etwas funktionierendes zusammengebastelt, allerdings hat es dann stark gehakt, als man einen Powerup einsammelte, da das Herausfinden einer leeren Positionen viel zu lange dauerte... brauche Futter für's Gehirn, blicke da nicht mehr durch Sad

ozzi789

BeitragSo, März 28, 2010 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd alles in einem Type machen.
Dann machst du ein Field mit dem Namen stat.

Bei 7 setzt du jetzt den stat auf =1, bei 3 von den 7 stat=2.

Wenn du nun eins einsammelst setzt du stat=0, nun wählst ein zufälliges Feld, schaust ob es einen stat < 1 und ob es nicht gerade das war welches du gelöscht hast und setzt es.

Ka so würd ich es machen, seh da dein Problem ned ;D
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

PacMani

BeitragSo, März 28, 2010 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber ich muss doch eine zufällige leere Position auswählen. Würde ich das so machen wie du beschrieben hast, würde immer das erste leere Feld, welches nicht das alte ist, benutzt werden. Es sollte ja aber auch ein komplett anderes leeres Feld in Frage kommen... kann man das verstehen? Weiß grad nicht, wie ich es so ausdrücken soll Very Happy

Hubsi

BeitragSo, März 28, 2010 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich Dich richtig verstehe ist die Anzahl der (möglichen) Powerups, bzw Stellen an denen sie auftauchen können, immer konstant? Dann drängt sich ein Array geradezu auf. Wenn ein Powerup aufgenommen wird, wird eine zufällige leere Position ausgewählt, das Powerup dort plaziert und schließlich das aufgenommene Powerup entfernt. Und zwar in genau der Reihenfolge. So kann das Powerup nicht wieder an der alten Position auftauchen und der Code wird ein Stück einfacher und schneller.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

PacMani

BeitragSo, März 28, 2010 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, die Powerupanzahl ist leider von Level zu Level unterschiedlich, weswegen ich sie in Types einordne (nicht zuletzt weil sie auch verschiedene Eigenschaften haben).
 

n-Halbleiter

BeitragSo, März 28, 2010 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstelle dein Array mittels Dim, dann kannst du die Anzahl Einträge beim Laden von Leveln verändern.

Ferner kannst du auch ein Array aus Typeeinträgen erstellen:
BlitzBasic: [AUSKLAPPEN]
Type TTest
Field D$
End Type

Const length=5
Local i

Dim Arr.TTest(length-1)
For i=0 To length-1
Arr(i)=New TTest
Arr(i)\D="Hallo Welt zum "+i+"-ten mal!"
Next

For i=0 To length-1
Print Arr(i)\D
Next
WaitKey
End


So hast du deine Dynamik, die du aus den Types möchtest, aber das Einordnen ist einfach, da durch einen Array realisierbar.

Das Einordnen wurde dir ja schon erklärt, du musst einfach mit Rand einen Eintrag im Array auf <>Null überprüfen. Ist er ungleich Null, gibt es an dieser Stelle schon ein Powerup und du musst nochmal eine zufällige Position im Array heraussuchen. Der Rest, also z.B. die Position des Powerups ist dann dynamisch durch den Type einstellbar.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

SpionAtom

BeitragSo, März 28, 2010 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt sicherlich viele Lösungen.

Die Vorgehensweise ist einfach so lange eine Zufallszahl zu suchen, bis sie den Anforderungen entspricht. Also muss leer sein, und darf nicht das vorher eingesammelte sein...

Code: [AUSKLAPPEN]
Graphics 400, 380, 0, 2
SetBuffer BackBuffer()

Data 7, 3
Data 100, 100
Data 200, 200
Data 150, 200
Data 250, 100
Data 50, 100
Data 100, 50
Data 50, 200

Read max, min
Dim item(max, 3)
For i = 1 To max
   Read item(i, 1), item(i, 2)
Next
r = 20

   ;3 Items belegen
   k = 0
   Repeat
      z = Rand(1, max)
      If item(z, 0) = 0 Then item(z, 0) = 1: k = k + 1   
   Until k = 3   
   
   Repeat
   
      Cls
      Text 0, 0, "Klicke auf die gefüllten Kreise"
      For i = 1 To max
         Oval item(i, 1) - r, item(i, 2) - r, 2 * r, 2 * r, item(i, 0)
         If item(i, 0) = 1 And MouseDown(1) Then
            If (item(i, 1) - MouseX()) * (item(i, 1) - MouseX()) + (item(i, 2) - MouseY()) * (item(i, 2) - MouseY()) < r * r Then
               item(i, 0) = 0
               Repeat
                  z = Rand(1, max)
               Until item(z, 0) = 0 And z <> i
               item(z, 0) = 1            
            End If
         End If
         
      Next
      Flip()   
   
   Until KeyDown(1)   
   End
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

PacMani

BeitragSo, März 28, 2010 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo danke erstmal. Habe jetzt Halbleiters Lösung einprogrammiert... muss mich noch an sie gewöhnen, ist leicht unübersichtlich geworden letztendlich, das liegt aber wohl eher an mir. Ein wenig hakt es ganz selten mal beim Einsammeln eines Powerups, wenn man Pech hat mit den Zufallszahlen und die ständig benutzte Positionen erwischen. Aber es funktioniert!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group