Gewinnmeldung & Neustart in TicTacToe, wie mache ich das?

1 Antwort

1) Nach jedem Klick müsstest du lediglich einmal alle Feldreihen (horizontal, vertikal, diagonal) bilden, indem du Felder ausliest und ihre Werte miteinander zu Strings verbindest.

Wenn eine davon OOO oder XXX entspricht, ist das Spiel beendet.

Für einen Game over-Screen könnte man eine Box einblenden (initial ist sie unsichtbar), die sich wie ein Overlay über das Spielfeld legt. Pack das Spielfeld dazu in eine weitere Box und nutze Klassen- statt Elementselektoren.

<div class="board">
  <div class="fields">
    <!-- your buttons ... -->
  </div>
  <div class="game-over hidden">
    <strong>Game over!</strong>
  </div>
</div>

CSS:

.board {
  position: relative;
}

.fields {
  display: grid;
  grid-template-columns: auto auto auto;
}

.game-over {
  align-content: center;
  background: red;
  display: flex;
  flex-wrap: wrap;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}

.game-over.hidden {
  display: none;
}

.game-over > strong {
  flex: 1;
  text-align: center;
}

Bei gewünschten Breitenbeschränkungen muss die Regel mit dem .board-Selektor angefasst werden. Statt Innen- sollten Außenabstände verwendet werden.

Beispiel für eine Zentrierung des Spielfeldes:

.board {
  /* ... */
  margin: 0 auto;
  width: 500px;
}

Sobald das Spiel verloren wurde, brauchst du nur das .game-over-Element ermitteln und dessen hidden-Klasse entfernen.

document.querySelector(".game-over").classList.remove("hidden");

2) Für einen Neustart brauchen nur alle Buttons wieder auf ihren Anfangszustand gebracht werden und dem .game-over-Element gibt man seine hidden-Klasse wieder (via add-Methode).

Die Mittel dafür hast du in deinem Skript bereits angewandt. Du weißt, wie man einen Buttonklick abfangen und bearbeiten kann und du weißt, wie man den Inhalt eines Elements setzt. Wobei m.E. das textContent-Property geeigneter als das innerHTML-Property wäre. Immerhin setzt du immer nur Plaintext.

PS.: Deinem HTML-Dokument fehlt ein ausgefülltes title-Element im head. So lange das fehlt, ist das Dokument invalid.