JavaScriptsSpiele

Tic Tac Tile

Drei in einer Reihe für zwei Spieler an einem Rechner — mit Punktestand über mehrere Runden.

Das bekannte Spiel „Drei gewinnt", das man auch als Tic Tac Toe kennt, hat uns Tobias Strasshofer geschickt. Gespielt wird zu zweit an einem Rechner: Auf einem Brett aus 3 × 3 Feldern setzt ihr abwechselnd euer Zeichen, und wer zuerst drei davon waagerecht, senkrecht oder diagonal in einer Reihe hat, gewinnt die Runde.

Die Tabelle über dem Brett zeigt alles Wichtige an: welches Zeichen zu welchem Spieler gehört, wer gerade an der Reihe ist (erkennbar am kleinen Smiley ^_^) und den Punktestand über alle bisherigen Runden. Es beginnt immer X, aber mit jeder neuen Runde wechseln die Zeichen die Seite — mal ist Spieler 1 das X, mal Spieler 2. Ein bereits besetztes Feld lässt sich nicht überschreiben. Sind alle neun Felder belegt, ohne dass jemand drei in einer Reihe hat, endet die Partie unentschieden.

Nach jeder entschiedenen Runde fragt das Spiel nach, ob es weitergehen soll. Der Knopf „Neues Spiel" räumt das Brett auch zwischendurch ab, der Punktestand bleibt dabei erhalten; die vollständigen Regeln zeigt der Knopf „Anleitung" noch einmal in einem Hinweisfenster.

Tic Tac Toe ist mathematisch vollständig durchgerechnet: Spielen beide Seiten fehlerfrei, endet jede Partie unentschieden — spannend wird es also erst, wenn jemand einen Fehler macht. Wer hier Gefallen findet, kann sich auch an Streichholzspiel, Mastermind oder Lights Out versuchen.

Spiele Baujahr 2004 läuft in deinem Browser
Spieler 1Spieler 2
Zeichen des Spielers
Wer ist dran
Punktestand

Zwei Spieler an einem Rechner: X beginnt, danach wird abwechselnd gesetzt. Wer drei Zeichen in eine Reihe bringt, bekommt einen Punkt.

Eingesandt von Tobias Strasshofer

So funktioniert das Script

Das Script hat zwei Hauptfunktionen: game() führt einen Zug aus und prüft anschließend, ob damit jemand gewonnen hat, und newgame() räumt das Brett für die nächste Runde ab. Der komplette Spielstand steckt dabei in den Formularfeldern selbst — das Brett ist gleichzeitig Anzeige und Speicher.

const formular = document.getElementById("tt-form");
const felder = formular.elements;   // 0-5 sind die Anzeigen, 6-14 die neun Spielfelder

Ein Formular führt unter elements alle seine Bedienelemente in der Reihenfolge auf, in der sie im HTML stehen. Die sechs Anzeigefelder der Tabelle belegen damit die Plätze 0 bis 5, die neun Knöpfe des Spielbretts die Plätze 6 bis 14. Genau mit diesen Nummern rechnet das Script — jeder Brettknopf trägt sie im HTML als data-feld bei sich.

const linien = [
  [6, 7, 8], [9, 10, 11], [12, 13, 14],
  [6, 10, 14], [8, 10, 12],
  [6, 9, 12], [7, 10, 13], [8, 11, 14]
];

Es gibt genau acht Möglichkeiten, drei Felder in eine Reihe zu bringen: drei waagerechte, drei senkrechte und zwei diagonale. Statt diese acht Fälle als eine riesige Bedingung hinzuschreiben — so machte es das Original —, stehen sie hier als Liste von Feldnummern. gewinnt() geht diese Liste durch und meldet true, sobald in einer der Reihen dreimal dasselbe Zeichen steht.

if (sign === "X") {
  sign = "O";
  felder[i].value = sign;
} else {
  sign = "X";
  felder[i].value = sign;
}

So wechseln sich die Spieler ab: In sign steht das zuletzt gesetzte Zeichen, und vor jedem Zug wird es umgedreht. Weil sign mit "O" startet, ist der erste Zug ein X. Das Zeichen wird als value auf den Knopf geschrieben — bei einem Knopf ist das zugleich seine Aufschrift, deshalb braucht es keinen zweiten Speicher für den Spielstand.

if (felder[i].value === "") {
  zaehlen++;
  ...
}

Der ganze Zug steckt in dieser einen Bedingung: Nur wenn die Aufschrift des angeklickten Knopfes leer ist, ist das Feld noch frei. Ist es bereits mit X oder O beschriftet, passiert schlicht nichts. zaehlen zählt die gesetzten Zeichen mit — bei neun ist das Brett voll und die Partie endet unentschieden.

for (i = 14; !(i === 5); i--) {
  felder[i].value = "";
  sign = "O";
  zaehlen = 0;
}

Das Aufräumen läuft rückwärts von Feld 14 bis Feld 6 und leert jede Aufschrift. Die Schleife endet, sobald die Zählvariable bei 5 angekommen ist, also unterhalb des ersten Spielfelds. Nebenbei werden das Startzeichen und der Zugzähler zurückgesetzt. Vorher tauscht newgame() noch die Zeichen der beiden Spieler und legt fest, wer die neue Runde beginnt.

Zum Anpassen: Die Meldungen in confirm() lassen sich frei umschreiben, ebenso der Smiley ^_^, mit dem angezeigt wird, wer am Zug ist. Eine Eigenheit des Originals haben wir bewusst stehen lassen: Die Prüfung auf einen Sieg von O steht außerhalb der Bedingung für ein freies Feld und läuft deshalb bei jedem Klick — auch bei einem Klick auf ein schon besetztes Feld.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Spiele