Wie benutzt man das Telefon?

In Untrusted bekam ich auf Level 7, wo ich das Telefon bekommen kann und meine eigene JS-Funktion erstellen kannst. Ich habe von der Demo gesehen, dass ich die Farbe ändern kann! Groß! Also habe ich gedacht, dass ich eine verschachtelte if... then Aussage schreiben würde, wenn ich eine Farbe bin, wechsle zum nächsten! Anscheinend funktioniert das nicht.

Ich habe dann versucht, meine Farbe auf weiß (#fff) zu ändern, denke, dass die Kollisionsprüfung Weiß wie alle Farben akzeptieren und die Schlösser öffnen würde. Was kann ich in diese Funktion bringen, um mich nach Bedarf zu ändern?

Bildbeschreibung hier eingeben

Sie können vorbei an allen Toren mit dem Code unten:

 if(player.getColor()=='#f00') player.setColor('#ff0'); else if(player.getColor()=='#ff0') player.setColor('#0f0'); else player.setColor('#f00'); 

Im Grunde, es macht es so jedes Mal, wenn Sie Q getroffen haben, wechseln Sie auf die Farbe des nächsten Tores.
Grün -> Rot -> Gelb -> Grün

Fertig

Wenn du es einmal gelöst hast, kannst du jetzt mit ihm spielen und den Code verbessern. Denken Sie, was Sie sonst noch tun können, zum Beispiel können Sie etwas hässliches und lustiges tun:

 player.setPhoneCallback(function () { var i = 66; var callback = function(){ player.setColor("#" + ((--i % 3) > 0 ? 'f' : '0') + ((i + 1) % 3 > 0 ? 'f' : '0') + '0') } return callback; }()); (function doNothingHack(){ }); 

Auch können wir sehen, dass f00, ff0 und 0f0 als 100, 110 und 010 dargestellt werden können, und dies, wie Sie sehen können, sind nur 3 kleine ganze Zahlen (2, 3, 1) als Binär dargestellt. Also modulo arithmetisch, dezimal bis binäre konvertierung dann ersetzen 1 mit f, und wir haben eine andere solche lösung.

Ich habe beschlossen, voran zu gehen und ein paar eigene Lösungen zu veröffentlichen.

Schalter

Dieser macht Gebrauch von switch Anweisungen und speichert jede Farbe als Objekt-Literal, um die Lesbarkeit zu verbessern und die Codierungsgeschwindigkeit und -effizienz zu erhöhen:

 var color = { 'green' : '#0f0', 'red' : '#f00', 'yellow': '#ff0'}; switch(player.getColor()) { case color.green: player.setColor(color.red); break; case color.red: player.setColor(color.yellow); break; case color.yellow: player.setColor(color.green); break; default: player.setColor(color.green); } 

Der default am Ende ist für diese bestimmte Ebene nicht notwendig, da die Farbe des Spielers bereits standardmäßig grün ist, aber ich habe beschlossen, ihn irgendwie zur Vollendung einzubeziehen.


Inkrement und modulo

Diese Lösung nutzt den Inkrementoperator ++ und den Modulooperator % , wodurch der Code viel, viel kürzer wird.

 var colors = ['#0f0', '#f00', '#ff0']; var i = 0; player.setPhoneCallback(function() { player.setColor(colors[++i % 3]); }); player.setColor(colors[++i]); 

Da wir keinen Code außerhalb der player.setPhoneCallback() -Methode hinzufügen können, ist es ein bisschen hacky geworden.

Die Idee hinter dieser Lösung ist es, ein Farbfeld zu definieren, das wir durchlaufen werden. Dafür sind die Inkrement- und Modulo-Operatoren instrumental. Für diejenigen, die nicht wissen: Der Modulo-Operator gibt den Rest einer Division zurück.

Da wir nicht wollen, dass unsere Variable i jedes Mal, wenn wir das Telefon benutzen, zurückgesetzt werden, müssen wir die Telefonmethode neu definieren. Sobald wir fertig sind, rufen wir player.setColor() an, um unsere Farbe zu ändern. Dieser Teil ist nicht nötig, aber ohne ihn müssten wir das Telefon zweimal benutzen, um unsere Farbe zum ersten Mal zu wechseln.

Sobald Sie den oben genannten Code verstehen, können wir ihn noch mehr verkürzen:

 if (!player.i) player.i = 0; player.setColor(['#0f0', '#f00', '#ff0'][++player.i % 3]); 

Fand die Lösung! Ich habe den folgenden Code eingefügt:

If (player.atLocation (24, 12)) {
Player.setColor ('# f00');
}
If (player.atLocation (27, 12)) {
Player.setColor ('# ff0');
}
Wenn (player.atLocation (30, 12)) {
Player.setColor ('# 0f0');
}
If (player.atLocation (33, 12)) {
Player.setColor ('# f00');
}
If (player.atLocation (35, 12)) {
Player.setColor ('# ff0');
}

Wenn ich an den x, y-Koordinaten bin, dann wird es diese eine Farbänderung für mich ausführen.