collapse collapse

 Community


 User Info




Willkommen Gast. Bitte einloggen oder registrieren.

 Partnerseiten

rpgvx.net

Das Forum ist offline

Autor Thema: Random Script  (Gelesen 866 mal)

Offline CheesAs

  • Ralph
  • *
  • Beiträge: 2
Random Script
« am: April 22, 2011, 18:09:16 »
Hallo

Ich sitze mal wieder dran und änder im "Vocab"-Script die ganzen Begriffe.
Jetzt hab ich überlegt, wenn ich eine neue Zeile einfüge ob beispielsweise Kampfansagen random-mäßig erscheinen.

Tun sie aber nicht..
Gibt es eine möglichkeit das irgendwie hinzubekommen?

Gruß
CheesAs

Re: Random Script

Offline Herendil

  • Jarl Turindo
  • Moderator
  • Mr. MACK-Tile
  • ***
  • Beiträge: 283
  • Jarl Turindo
Re: Random Script
« Antwort #1 am: April 23, 2011, 00:28:36 »
Also das ganze ginge schon, ist aber ne Fummelei. Du kannst im Regelfall durch den code "rand(n)" eine zufällige Zahl aus 0..(n-1) ausgeben lassen. Auf diese Art und Weise kannst du dann ein zufälliges Array-Index ausgeben und so eine Zufallsnachrricht ausgeben lassen. Ich weiß nicht, in wie weit du mit Ruby vertraut bist; aber soo unglaublich schwer ist das ganze nicht.

Das große Problem an der Sache ist, dass Module (wie z.B. Vocab) beim Systemstart berechnet werden und nicht bei jeder Abfrage - aber bauen wir uns erstmal die Zufallsnachrichten.

Ich werde das einmal am Beispiel von den "Emerge"-Nachrichten durchgehen. Wir haben am Anfang lediglich die Zeile Emerge          = "%s emerged!" um aber die Zufallsgenerierung grundsätzlich zu ermöglichen brauchen wir einen Array (Wertereihe). Dazu klammern wir den Teil der Zeile, der hinter dem '=' steht, eckig "[ ]" ein. Die Zeile sieht nun so aus:

Emerge          = ["%s emerged!"]
Nun haben wir eine Wertereihe, könnten also schon etwas zufällig daraus wählen, da es aber nur einen Wert gibt, käme immer das gleiche raus. In einem Array werden verschiedene Werte durch ein "," abgegrenzt, dabei gilt es zubeachten, dass die Anführungszeichen in diesem Fall zu den Werten gehören, da sie ausdrücken, dass es sich um Texte (String) handelt. Fügen wir noch einen String hinzu könnte das ganze so aussehen:

Emerge          = ["%s emerged!", "%s erscheint!"]
Ab sofort ist es uns möglich durch eine Zufallsabfrage zwei verschiedene Werte zu erhalten. Dieses Verfahren lässt sich beliebig oft wiederholen, sodass man auch drei oder vier oder fünfhundertdreiundzwanzig Werte einfügt, diese müssen bloß jeweils durch ein "," abgegrenzt werden (vor die zweite eckige Klammer kommt keins!).
Als nächstes müssen wir überlegen, welche Werte als Kennzahl (Index) eines Wertes vorkommen.
Da die Kennzahlen bei 0 beginnen sind das alle Zahlen zwischen einschließlich 0 und einschließlich dem höchstes Index "n" (0..n) Um "n" variabel zu bestimmen gibt es die Methode "size" um die Anzahl der Objekte auszählen zu lassen. Achtung, nun wird es etwas komplex: Da wir ja 0 beginnen hat ein Array mit nur einem Wert den höchsten Index 0 aber "size" gibt 1 aus, da es ja einen Wert gibt. Der höchste Wert "n" ist also die Größe des Arrays - 1 (n  = Array.size-1)

Nun überlegen wir: Wie oben schon geschrieben gibt die Methode "rand(n)" einen zufälligen Wert größer oder gleich 0 und kleiner der Zahl "n" aus, die in der Klammer steht und in diesem Fall der höchste Index im Array ist. Wollen wir also, dass auch "n" als Ergebnis rauskommen kann, müssen wir rand(n+1) eingeben. Setzen wir nun n = Array.size-1 ein kommen wir zu dem Term
Zitat
rand(n+1) ? rand(Array.size-1+1)

Und, wer hätte das gedacht, wir können "-1+1" rauslassen, da die Summe der beiden 0 ergibt.

Um die Zufallszahl also zubestimmen, geben wir ein:

rand(Array.size)
Aber bislang können wir noch nicht rechnen, da der Array noch nicht spezifiziert wurde. Da sich der Array in einem Module befindet, lässt es sich grundsätzlich mit "'Modulname'::'Wertname'" abfragen, in diesem Beispiel also z.B. mit "Vocab::Emerge"

Setzen wir das also ein (Die Klammern dienen der Verdeutlichung und sollten übernommen werden):

rand((Vocab::Emerge).size)
Und schon können wir einen Zufallswert abfragen, zu dem der Array Vocab::Emerge einen festen Wert ausgeben wird.

Nun zurück zum Ausgangsarray: Bislang bekommen wir durch "rand" ja nur eine Zufallszahl, die uns bislang nicht viel bringt. Wir benutzen diese Zahl also als "Index" um aus dem Array einen bestimmten Wert zu erhalten. Dabei gilt folgendes Muster Array[Index] ? Wert an Stelle Index
Wir setzen also im Beispiel ein:

Vocab::Emerge[rand((Vocab::Emerge).size)]
Zu Testzwecken fügen wir ganz vorne noch ein "p" ein, um den Text ausgeben zu lassen, Klammern förderlich:

p(Vocab::Emerge[rand((Vocab::Emerge).size)])
Wenn du diesem Code nun in den Callscript eines Events packst, wird eine der Zufallsnachrichten ausgeben.

Offenbar ist der Code manchmal zu lang für eine Zeile, manchmal nicht. Man kann es aber zu 100% ausgeben lassen, wenn man "Vocab:Emerge" vorher mit "b" o.Ä. abkürzt.

b = Vocab::Emerge
p(b[rand((b.size)])

Nun kannst du Zufallsnachrichten ausgeben lassen. Wenn du wissen willst, wie man das in dein Battlesystem einträgt, schreib doch bitte, welches du nutzt.

MfG

Herendil Turindo
« Letzte Änderung: April 24, 2011, 14:16:43 von Herendil »

Re: Random Script

Offline CheesAs

  • Ralph
  • *
  • Beiträge: 2
Re: Random Script
« Antwort #2 am: April 23, 2011, 08:57:05 »
Danke das klingt doch schonmal gut^^

sagen wir mal so die Grundlagen beherrsche ich ich klemm mich im moment dahinter um mein Können zu erweitern  :grimace:

dann probier ich das ganze mal aus

 


 Bild des Monats

rooftop party

Views: 3615
By: papilion

 Umfrage

  • Wer soll das BdM gewinnen?
  • Dot Kandidat 1
  • 3 (25%)
  • Dot Kandidat 2
  • 1 (8%)
  • Dot Kandidat 3
  • 2 (16%)
  • Dot Kandidat 4
  • 0 (0%)
  • Dot Kandidat 5
  • 6 (50%)
  • Stimmen insgesamt: 12
  • View Topic

 Schnellsuche





SimplePortal 2.3.3 © 2008-2010, SimplePortal