• Anmelden

Lieber Besucher, herzlich willkommen bei: RPG Studio - Make your World real. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

  • Playm

    RPG Studio Webmaster

    Sie müssen sich registrieren, um eine Verbindung mit diesem Benutzer herzustellen.

332

Schönheit

Bewertung:

Von Playm, Mittwoch, 11. August 2021, 00:24

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 Quellcode

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 Quellcode

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 Quellcode

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.

Dieser Artikel wurde bereits 1 745 mal gelesen.


Kommentare (2)

  • 2

    Von Playm (Samstag, 21. August 2021, 14:38)

    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

    Von Lycaon (Donnerstag, 19. August 2021, 00:53)

    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

Vorheriger Artikel

Rotierende Items auf der Map

Von Playm (Samstag, 22. Dezember 2018, 08:29)