342 Kapitel 8
Die fire-Methode planen
Die fire-Methode erstellen
Wir beginnen mit dem Grundgerüst der fire-Methode. Als Argument übernimmt sie einen
Rateversuch. Danach iterieren wir über die Schiffe, um zu sehen, ob ein Schiff getroffen wurde.
Bevor wir den Code zum Finden der Treffer schreiben, wollen wir die übrigen Teile fertigstellen:
Es muss für jedes Schiff überprüft werden, ob es sich an der
angegebenen Position befindet.
Falls ja, haben wir einen Treffer, und das entsprechende Element im
hits-
Array wird markiert (und der View wird vom Treffer informiert). Außerdem geben wir
true zurück, um den aufrufenden Code vom Treffer zu informieren.
Befindet sich an der geratenen Position kein Schiff, haben wir einen Fehlversuch. Das
wird dem View mitgeteilt, und die Methode gibt false zurück.
Nachdenken über die fire-Methode
Die Methode fire verwandelt einen Rateversuch des Spielers in einen Treffer
oder einen Fehlversuch. Wie wir wissen, kümmert sich das View-Objekt um
deren Darstellung. Die fire-Methode muss die dafür nötige Spiellogik zur
Verfügung stellen.
Einen Treffer zu erkennen, ist nicht schwer. Wenn wir einen Rateversuch
haben, müssen wir nur die folgenden Schritte durchführen:
Die
fire-Methode sollte außerdem feststellen, ob ein Schiff nicht nur getroffen, sondern auch versenkt
wurde. Darum werden wir uns kümmern, wenn wir den Rest der Spiellogik fertiggestellt haben.
var model = {
boardSize: 7,
numShips: 3,
shipsSunk: 0,
shipLength: 3,
ships: [{ locations: ["06", "16", "26"], hits: ["", "", ""] },
{ locations: ["24", "34", "44"], hits: ["", "", ""] },
{ locations: ["10", "11", "12"], hits: ["", "", ""] }],
fire: function(guess) {
for (var i = 0; i < this.numShips; i++) {
var ship = this.ships[i];
}
}
};
Die Methode übernimmt einen
Rateversuch als Argument.
Danach iterieren wir über das Array
mit den Schiffen und untersuchen
dabei ein Schiff nach dem anderen.
Hier haben wir ein Schiff vor uns. Jetzt müssen wir sehen,
ob der Rateversuch auf eine seiner Positionen passt.
Model
ships: Die Positionen und
Treffer der Schiffe.
shipsSunk: Wie
viele Schiffe
versenkt wurden.
numShips: Die Anzahl
der Schiffe im Spiel.
fire: Eine Methode zum
Feuern auf ein Schiff und
zum Ermitteln, ob der
Schuss ein Treffer oder
ein Fehlversuch war.
shipLength: Die Anzahl
der Positionen pro
Schiff.
boardSize: Die Größe des
Rasters auf dem Spielfeld.
Vergessen Sie hier
nicht das Komma!
Sie sind hier 343
Die Einzelteile zusammenfügen
for (var i = 0; i < this.numShips; i++) {
var ship = this.ships[i];
locations = ship.locations;
var index = locations.indexOf(guess);
if (index >= 0) {
// Wir haben einen Treffer!
}
}
Nach Treffern suchen
Bei jedem Schleifendurchlauf müssen wir nachsehen, ob der Rateversuch auf eine
der Schiffspositionen passt:
for (var i = 0; i < this.numShips; i++) {
var ship = this.ships[i];
locations = ship.locations;
}
Jetzt brauchen wir den Code,
der prüft, ob der Rateversuch
auf eine der Positionen passt.
Dann überprüfen wir die
Schiffe nacheinander.
Hier greifen wir auf die Positionen eines Schiffs
zu. Bedenken Sie: Dies ist eine Eigenschaft des
Schiffs, die ein Array enthält.
Die indexOf-Methode funktioniert bei einem Array so
ähnlich wie die entsprechende String-Methode. Sie über-
nimmt einen Wert und gibt dessen Index im Array zurück
(oder -
1
, falls der Wert nicht gefunden werden konnte).
Ist der Index größer oder gleich 0, existiert
der Rateversuch des Benutzers im locations-
Array, und wir haben einen Treffer.
Die Verwendung von indexOf ist nicht effizienter als eine Schleife. Aber der Code ist etwas klarer und
auf jeden Fall kürzer. Außerdem glauben wir, dass die Funktion des Codes auf diese Weise deutlicher
wird als bei einer Schleife: Bei indexOf sieht man schneller, nach welchem Wert gesucht wird. Wie Sie
sich auch entscheiden, ein weiteres Werkzeug haben Sie auf jeden Fall »im Kasten«.
Mithilfe von indexOf können wir den Code zum Finden der Treffer jetzt so schreiben:
Folgende Situation: Im Array
locations suchen wir nach dem String in guess. Wird
der Inhalt von guess in einem der Array-Elemente gefunden, haben wir einen Treffer.
guess = "16";
locations = ["06", "16", "26"];
Mit einer zweiten Schleife könnten wir die einzelnen Elemente im locations-Array
durchlaufen, sie mit dem Rateversuch vergleichen und so nach Treffern suchen.
Anstatt eine weitere Schleife zu benutzen, gibt es aber auch noch einen eleganteren Weg:
Wir müssen herausfinden, ob sich der
Wert von guess mit einem der Werte im
locations-Array des Schiffs deckt.
var index = locations.indexOf(guess);
Die Methode indexOf durchsucht ein Array nach einem
passenden Wert und gibt dessen Index (oder -
1
, falls
nichts gefunden wurde) zurück.

Get JavaScript-Programmierung von Kopf bis Fuß now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.