• Login

Dear visitor, welcome to RPG Studio - Make your World real. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

  • Playm

    RPG Studio Webmaster

    You have to register first, to connect to this user.

332

Schönheit

Rating:

by Playm, Wednesday, August 11th 2021, 12:24am

Ihr kennt es sicher: Mitten in der Nacht, die Wohnung ist still, weil ihr die letzte wache Person seid. Und auf eurem gedimmten Monitor schaut ihr auf zwei Zeilen Code und denkt euch nur "wow, das ist echt schön. Das ist eine richtig schöne Lösung" Und auch wenn es jedem ab und zu so geht, will ich mal dazu ein bisschen schreiben.

Außer obiger Situation, kennt ihr ja auch die Database im RPG Maker XP. Im Reiter "Classes" in der Database findet man oben rechts die Element- und Statuseffizienz. Das sind so kleine Buttons, die einen Buchstaben zwischen A und F anzeigen und wenn man drauf klickt ändert sich der Buchstabe auf den Folgenden, also aus A wird B, aus B wird C und so weiter. Aus F wird A. Es ist ein Kreis. Und ich wollte so etwas programmieren: Eine Funktion, die mir für einen Buchstaben den folgenden Buchstaben ausgibt und beim letzten Buchstaben wieder auf den Anfang springt. Und das ist meine Lösung in JavaScript:

JavaScript Source code

1
2
3
4
function advanceEfficency( efficency ){
	var efficency_sequence = ['A', 'B', 'C', 'D', 'E', 'F', 'A'];
	return efficency_sequence[ efficency_sequence.indexOf(efficency) + 1 ];
}

Und den restlichen Blogpost geht es darum, warum das schön ist. :sfunnypost:

Erst einmal: Was machen wir hier? efficency_sequence ist ein Array und unsere schöne Funktion returned einen Eintrag aus dem Array. Welchen wir returned bestimmt der Index, den zwischen den eckigen Klammern in Zeile 3 berechnen. Die Array-Funktion indexOf( element ) gibt uns den Index, also die Position von einem gegebenen Element im Array zurück.
  • ['Montag', 'Dienstag', 'Mittwoch'].indexOf( 'Mittwoch' ); :navigation-right: würde uns 2 zurück liefern
  • ['Montag', 'Dienstag', 'Mittwoch'].indexOf( 'Montag' ); :navigation-right: würde uns 0 zurück liefern
  • ['Montag', 'Dienstag', 'Mittwoch'].indexOf( 'Apfel' ); :navigation-right: würde uns -1 zurück liefern, denn es gibt das Element im Array nicht
Hierzu sei gesagt, dass wenn der Array ein Element doppelt enthält, so wie in unserer schönen Funktion, die Methode indexOf uns immer den ersten Index zurück liefert. Der indexOf 'A' ist also immer Null, obwohl 'A' auch am Ende des Arrays noch mal vorkommt.

Jetzt addieren wir aber auf den Index noch Eins drauf. Die Summe der zwei Zahlen benutzen wir als Index beim Array-Zugriff. Wir schauen uns also das Element an, was nach unserem gegebenen Element kommt. Und rechts von 'A' steht im Array 'B', rechts von 'B' steht 'C' und rechts von 'F' steht 'A'. Ich finde das schön. Es ist so einfach. So simpel.

Und die Lösung hat noch eine Eigenschaft, dadurch das indexOf -1 zurück liefert, wenn es das gegebene Element nicht im Array gibt: Sollte ein invalider Status eintreten (die gegebene Effizienz ist kein Buchstabe zwischen A und F) resettet ein Aufruf der schönen Funktion zurück auf 'A'. Denn die Summe sieht dann so aus: " -1 + 1 = 0".
Worauf resettet werden soll, kann man übrigens dadurch beeinflussen, womit der Array beginnt und endet.

JavaScript Source code

1
	var efficency_sequence = ['C', 'D', 'E', 'F', 'A', 'B', 'C'];
Obige anders angeordnete Sequenz würde aus einem invaliden Status auf 'C' resetten.

Die Methode lässt sich leicht auf andere Anwendungsfälle übertragen. Sagen wir mal wir haben eine Ausrichtung: Norden, Westen, Süden, Osten.
Dann könnten wir eine Funktion wie die folgende Schreiben:

JavaScript Source code

1
2
3
4
5
6
7
8
9
10
11
function turnRight( given_direction ){
	var direction_sequence = ['north', 'west', 'south', 'east', 'north'];
	return direction_sequence[direction_sequence.indexOf(given_direction) + 1];
}
function turnLeft( given_direction ){
	var direction_sequence = ['north', 'east', 'south', 'west', 'north'];
	return direction_sequence[direction_sequence.indexOf(given_direction) + 1];
}
 
turnRight( 'north' ); //=> 'west'
turnLeft( 'west' ); //=> 'north'


Die ganze Prozedur kommt ohne if-then-else-Verzweigungen aus. Es gibt kein Modulo. Es ist einfach eine sehr simple Art, die Aufgabe zu lösen. Ich finde es schön.

This article has been read 3,215 times.


Comments (3)

  • 3

    by ITgenie98 (Tuesday, November 1st 2022, 5:10pm)

    Schönheit die aus der ausnutzung von logischen finessen bestehen sind die besten :D

    ... wobei noch besser wäre es wenn du in der function 'const' verwendet hättest, dann wäre diese kleine (aber feine) funktion sogar memory-efficent ;)

  • 2

    by Playm (Saturday, August 21st 2021, 2:38pm)

    Ja, das klappt.

    In Ruby gibt die .index()-Methode in der Tat *nil* zurück, statt -1.
    Man kann im Maker das Verhalten von JavaScript aber nachbauen, in dem man im Falle eines nil-Wertes -1 zurück liefert und das ganze klammert.

    sequence[ ( sequence.index(given_direction) || -1 ) + 1];

  • 1

    by Lycaon (Thursday, August 19th 2021, 12:53am)

    Das ist wirklich eine sehr schöne und vor allem nützliche Lösung :) Solange man dort nur gültige Werte einspeist, sollte es im Maker selbst mit .index() wahrscheinlich auch klappen, oder?

Blog navigation

Previous article

Rotierende Items auf der Map

by Playm (Saturday, December 22nd 2018, 8:29am)