Noch heftige Probleme mit Zufallszahlen...
Übersicht

PacManiBetreff: Noch heftige Probleme mit Zufallszahlen... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstelle dein Array mittels Dim![]() Ferner kannst du auch ein Array aus Typeeinträgen erstellen: BlitzBasic: [AUSKLAPPEN] Type TTest 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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group