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