JavaScript Canvas implementiert Tic-Tac-Toe-Spiel

JavaScript Canvas implementiert Tic-Tac-Toe-Spiel

In diesem Artikel wird der spezifische Code von JavaScript Canvas zur Implementierung des Tic-Tac-Toe-Spiels zu Ihrer Information bereitgestellt. Der spezifische Inhalt ist wie folgt

Hauptseite

<!DOCTYPE html>
<html>
    <Kopf>
        <Titel>Tic Tac Toe</Titel>
        <Stil>
            * {
                Polsterung: 0;
                Rand: 0;
            }
 
            Text, HTML, #Spiel {
                Höhe: 100%;
                Hintergrund: #FCFCFC;
            }
 
            #Spiel {
                Anzeige: Flex;
                Elemente ausrichten: zentrieren;
                Inhalt ausrichten: zentriert;
            }
        </Stil>
    </Kopf>
    <Text>
        <div id="Spiel">
            <Leinwand-ID="Leinwand" Breite="300" Höhe="300"></Leinwand>
        </div>
        <script src="spiel.js"></script>
    </body>
</html>

spiel.js

Spieler = 2;
Zellenanzahl = 3;
Gewinnanzahl = 3;
Zellengröße = 100;
Größe = Zellengröße * Zellenanzahl;
 
 
var Leinwand = document.getElementById('Leinwand');
canvas.width = Größe;
canvas.height = Größe;
 
canvas.addEventListener('klicken', klicken, false);
 
 
var ctx = canvas.getContext('2d');
 
ctx.imageSmoothingEnabled = falsch;
ctx.Linienbreite = 3;
 
 
Funktion löschen() {
    ctx.clearRect(0, 0, Leinwandbreite, Leinwandhöhe);
}
 
Funktion Linie(x, y, w, h, Farbe = '#ccc') {
    ctx.beginPath();
    ctx.moveTo(x, y);
    ctx.lineTo(x + w, y + h);
    ctx.strokeStyle = Farbe;
    ctx.stroke();
    ctx.closePath();
}
 
Funktion fillRect(i, j, Farbe = '#F5F5F5') {
    ctx.fillStyle = Farbe;
    ctx.fillRect(i * Zellengröße, j * Zellengröße, Zellengröße, Zellengröße);
}
 
var zeichnen = {
    Raster: (Farbe = '#ccc') => {
        für (lass i = 1; i < Zellzahl; i++) {
            Zeile (Zellengröße * i, 0, 0, Größe, Farbe);
            Zeile (0, Zellengröße * i, Größe, 0, Farbe);
    }
    },
 
    // nichts zeichnen, Stumpf
    0: (i, j, _) => {
    },
 
    // X-Figur zeichnen
    1: (i, j, Farbe = '#3F51B5') => {
        sei links = (i + 0,1) * Zellengröße,
                oben = (j + 0,1) * Zellengröße,
                Größe = 0,8 * Zellengröße;
 
        Linie (links, oben, Größe, Größe, Farbe);
        Linie (links + Größe, oben, -Größe, Größe, Farbe);
    },
 
    // O-Figur zeichnen
    2: (i, j, Farbe = '#FF5722') => {
        ctx.beginPath();
        ctx.arc((i + 0,5) * Zellengröße, (j + 0,5) * Zellengröße, 0,4 * Zellengröße, 0, Math.PI * 2, false);
        ctx.strokeStyle = Farbe;
        ctx.stroke();
        ctx.closePath();
    },
 
    // zeichne Δ Figur
    3: (i, j, Farbe = '#FDE619'/*'#FFEB3B'*/) => {
        sei Mitte = (i + 0,5) * Zellengröße,
                Größe = Math.sqrt(3) * 0,525 * Zellengröße,
                oben = (j + 0,125) * Zellengröße,
                Höhe = 0,75 * Zellengröße,
                Schritt = Größe / 2;
 
        Linie (Mitte, oben, -Schritt, Höhe, Farbe);
        Linie (Mitte, oben, Schritt, Höhe, Farbe);
        Linie (Mitte – Schritt, oben + Höhe, Größe, 0, Farbe);
    }
};
 
 
let grid = neues Array(Zellenzahl * Zellenzahl).fill(0),
        erhalte = (i, j) => Raster [j * Zellenanzahl + i],
        setze = (i, j, val = 0) => Raster[j * Zellenzahl + i] = val,
        istFrei = (i, j) => get(i, j) == 0,
        checkVictory = (wer) => {
    lass iterieren = getter => {
        für (lass i = 0; i < winCount; i++)
            wenn (Getter(i) != wer)
                gibt false zurück;
        gibt true zurück;
    };
 
    let Zeile, Spalte, Pfad = {
        vertikal: _ => iterieren(i => get(Zeile + i, Spalte)),
        horizntl: _ => iterieren(j => get(col, row + j)),
        diagonal: _ => iterieren(i => holen(Zeile + i, Spalte + i)),
        Gegenteil: _ => iterieren(i => get(row + i, col + winCount - 1 - i)),
    };
 
    für (Zeile = 0; Zeile <= Zellenanzahl - WinCount; Zeile++) {
        für (col = 0; col < cell_count; col++) {
            wenn (Pfad.vertikal())
                return ['vertikal', Zeile, Spalte];
            wenn (Pfad.horizntl())
                return ['horizntl', Spalte, Zeile];
        }
 
        für (col = 0; col <= Zellenanzahl - WinCount; col++) {
            wenn (Pfad.diagonal())
                return ['diagonal', Zeile, Spalte];
            wenn (Pfad.gegenüber())
                return ['Gegenteil', Zeile, Spalte];
        }
    }
 
    zurückkehren [];
},
        onWin = ([Typ, Zeile, Spalte]) => {
    wenn (!Typ)
        zurückkehren;
 
    lass iterieren = Aktion => {
        für (lass i = 0; i < winCount; i++)
            Aktion(i);
    };
 
    lass drawSequence = {
        vertikal: _ => iterieren(i => fillRect(Zeile + i, Spalte)),
        horizntl: _ => iterieren(j => fillRect(Zeile, Spalte + j)),
        diagonal: _ => iterieren(i => fillRect(row + i, col + i)),
        Gegenteil: _ => iterieren(i => fillRect(row + i, col + winCount - 1 - i)),
    };
 
    klar();
    zeichneSequenz[Typ]();
    zeichne.raster();
 
    für (lass i = 0; i < Zellzahl; i++) {
        für (lass j = 0; j < Zellenanzahl; j++)
            zeichnen[holen(i, j)](i, j);
    }
 
    gibt true zurück;
};
 
 
lass playerTurn = 0;
 
Funktion Klick(e) {
    sei i = e.offsetX / Zellengröße | 0,
            j = e.offsetY / Zellengröße | 0;
 
    wenn (istFrei(i, j)) {
        lass Figur = SpielerTurn++ % Spieler + 1;
 
        Satz (i, j, Abbildung);
        zeichne[Abbildung](i, j);
        beim Sieg (checkVictory (Abbildung)) und canvas.removeEventListener (,click‘, click, false);
        ;
    }
}
 
 
zeichne.raster();

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung der benutzerdefinierten Swiper-Komponente in JavaScript
  • Detaillierte Erklärung des Unterschieds zwischen Pfeilfunktionen und normalen Funktionen in JavaScript
  • Karusselleffekte mit JavaScript implementieren
  • Javascript zum Wechseln von Bildern per Mausklick
  • Zusammenfassung verschiedener Methoden für JavaScript um festzustellen ob es sich um ein Array handelt
  • JavaScript zum Erzielen von Feuerwerkseffekten (objektorientiert)
  • Detaillierte Diskussion der Unterschiede zwischen Schleifen in JavaScript
  • Zusammenfassung einiger gängiger Möglichkeiten zum Abkürzen von Javascript-Code
  • 13 JavaScript-Einzeiler, die Sie wie einen Experten aussehen lassen

<<:  MySQL-Datenbankoptimierung: Detaillierte Erläuterung der Sharding-Operationen für Tabellen und Datenbanken

>>:  Zusammenfassung der 10 am häufigsten gestellten Fragen in Linux-Interviews

Artikel empfehlen

So laden Sie die Kamera in HTML

Wirkungsdiagramm: Gesamtwirkung: Video wird gelad...

So implementieren Sie ein Dropdown-Menü für die HTML-Eingabe

Code kopieren Der Code lautet wie folgt: <html...

Detaillierte Erklärung zur Verwendung von Router-View-Komponenten in Vue

Wenn Sie ein Vue-Projekt entwickeln, müssen Sie h...

Zusammenfassung von 10 erweiterten Tipps für Vue Router

Vorwort Vue Router ist der offizielle Routing-Man...

Eine kurze Analyse, wie MySQL die Transaktionsisolierung implementiert

Inhaltsverzeichnis 1. Einleitung 2. RC- und RR-Is...

XHTML-Erste-Schritte-Tutorial: Was ist XHTML?

Was ist HTML? Um es einfach auszudrücken: HTML wi...

Ubuntu 18.04 erhält Root-Berechtigungen und meldet sich als Root-Benutzer an

Vorab geschrieben: In den folgenden Schritten müs...

Hinweise zur Verwendung von $refs in Vue-Instanzen

Während des Entwicklungsprozesses verwenden wir h...

js-Version zur Realisierung der Rechnerfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Erklärung der grundlegenden Syntax und Datentypen von JavaScript

Inhaltsverzeichnis JavaScript importieren 1. Inte...

Installieren Sie mysql5.7.10 manuell unter Ubuntu

Dieses Tutorial beschreibt den Prozess der manuel...

Das neueste Installations-Tutorial für virtuelle Maschinen VMware 14

Zuerst gebe ich Ihnen den Aktivierungscode für VM...

jQuery implementiert den Tabellen-Paging-Effekt

In diesem Artikel wird der spezifische Code von j...