Rolf B: Wiki-Push: Spiele mit JavaScript

Beitrag lesen

Hallo Felix,

den Vorschlag mit der Accessor-Funktion mark sollte man auf jeden Fall aufgreifen. Sie muss aber vervollständigt werden - für den Fall, dass das aria-label nicht existiert, sollte ein definierter Wert zurückgegeben werden. JS würde jetzt undefined liefern, aber ich halte es für schlechten Stil, einen Pfad durch eine Funktion, von der ein Wert erwartet wird, nicht auf return enden zu lassen. Das mögen andere anders sehen.

Man kann dabei ausnutzen, dass getAttribute("foo") laut aktueller Spec null liefert und laut alter Spec den leeren String "", die beide falsy sind.

fields ist eine globale Variable, bzw. in einem Spielobjekt wäre das eine Instanzvariable - da kann man auch einfach die Zellindizes als Parameter durchreichen und den Zugriff auf fields intern behandeln.

function getMark(cell) {
   return fields[cell].getAttribute("aria-label") || "";
}

Dazu noch zwei weitere Helper

function checkForVictory(cell1, cell2, cell3) {
   let mark1 = getMark(cell1),
       win = mark1 && mark1 == getMark(cell2) && mark1 == getMark(cell3);

   if (!win) return "";

   highlightCell(cell1);
   highlightCell(cell2);
   highlightCell(cell3);

   return mark1;
}

function highlightCell(cell) {
   fields[cell].classList.add('highlighted');
}

Und die eigentliche Abfrage würde ich dann stumpf runterprogrammieren statt aufwändig Schleifen zu bauen. Das ist natürlich anders, wenn man größere Felder implementieren will - aber ein TicTacToe mit 3 Gewinnfeldern im 4x4 Raster ist meines Wissens unspielbar (wer anfängt, gewinnt) und läuft eher auf Vier Gewinnt hinaus.

let winner = checkForVictory(0,3,6) || checkForVictory(1,4,7) || checkForVictory(2,5,8) ||
             checkForVictory(0,1,2) || checkForVictory(3,4,5) || checkForVictory(6,7,8) ||
             checkForVictory(0,4,8) || checkForVictory(2,4,6);

Rolf

--
sumpsi - posui - obstruxi