JavaScript-Implementierung des Spiels des Lebens

JavaScript-Implementierung des Spiels des Lebens

Konzept-Einführung

Zelluläre Automaten wurden Anfang der 1950er Jahre von John von Neumann, dem Vater des Computers, vorgeschlagen, um die Selbstreplikationsfunktion lebender Systeme zu simulieren.

Das Spiel des Lebens, oder mit vollem Namen John Conways Spiel des Lebens, ist ein zellulärer Automat, der in den 1970er Jahren vom britischen Mathematiker John Conway erfunden wurde.

Logische Regeln

In einem zweidimensionalen ebenen Gitter hat jede Zelle zwei Zustände: lebendig oder tot, und ihr Zustand im nächsten Moment wird vollständig durch die Zustände der acht umgebenden Zellen bestimmt.

Es gibt drei Evolutionsregeln auf dieser Welt:

  1. Wenn es noch zwei überlebende Zellen gibt, bleibt der Lebenszustand der Zelle derselbe;
  2. Wenn 3 lebende Zellen vorhanden sind, ist die Zelle lebendig (tote Zellen werden wiederbelebt).
  3. Wenn weniger als 2 überlebende Zellen vorhanden sind (geringe Lebenszahl) oder mehr als 3 überlebende Zellen vorhanden sind (zu viele Lebenszahlen), ist die Zelle tot.

Vollständiger Code

Brennender Frost/Lebensspiel

Demo-Seite

Grundstruktur

index.html // Hauptseite, System initialisieren, Systembetrieb steuern usw. canvas.js // Rendering-Ebene, Canvas erstellen, manuell zeichnen, Canvas-Aktualisierungsmethode usw. LifeGame.js // Logikebene, System erstellen und ausführen, Systembetriebslogik, Datenaktualisierung usw.

Hauptimplementierung

Systemkonfiguration: Definiert die Größe des zweidimensionalen Ebenenrasters. Der Lebenszustand aller Zellen wird in Form von Schlüssel und Wert in den Daten gespeichert. Execute ist eine interne Methode, die von canvas.js bereitgestellt und auf dem Konfigurationsobjekt bereitgestellt wird.

  const konfiguration = {
    Breite: 100, // horizontale Zellenanzahl Höhe: 100, // vertikale Zellenanzahl Größe: 4 + 1, // Zellengröße, Zellenabstand 1px
    Geschwindigkeit: 200, // Zelliterationsgeschwindigkeit alive: „#000000“, // Zellüberlebensfarbe dead: „#FFFFFF“, // Weltfarbe (Zelltodfarbe)
    Daten: neue Map(), // Systemoperationsdaten ausführen, // Canvas-Methode aktualisieren};

Regelimplementierung: Durchlaufen Sie jede Zelle in der zweidimensionalen Ebene, ermitteln Sie den aktuellen Zellstatus, berechnen Sie die Anzahl der überlebenden Zellen um sie herum, bestimmen Sie, ob sie im nächsten Moment lebendig oder tot sein wird, speichern Sie diesen Status und aktualisieren Sie die Schnittstellenanzeige, indem Sie die Methode „Canvas aktualisieren“ der Rendering-Ebene aufrufen. Dabei wird bei der Datenverarbeitung kein zweidimensionales Array zur Darstellung des zweidimensionalen Koordinatensystems verwendet, sondern dieses in eine eindimensionale lineare Darstellung umgewandelt und die Daten in einer Map gespeichert.

  // LifeGame.js

  // Eindimensionale lineare Darstellung eines zweidimensionalen Koordinatensystems const MakeKey = (x = 0, y = 0) => y * 10000 + x;

  Funktion refreshWorld() {
    const next = new Map(); // Systembetriebsdaten aktualisieren // Alle Elemente des zweidimensionalen Koordinatensystems iterieren IterateCells(config, (x, y) => {
      const index = MakeKey(x, y); // Berechne den Schlüssel, der der Koordinate entspricht
      const current = config.data.get(index); // Aktueller Zellzustand // Berechnen Sie die Anzahl der überlebenden Zellen um die aktuelle Zelle herum switch (borderSum(x, y)) {
        Fall 2:
          // Wenn 2 aktive Zellen vorhanden sind, bleibt die Zelle wie sie ist.
          nächster.set(index, aktuell);
          brechen;
        Fall 3:
          // Wenn sich 3 überlebende Zellen in der Umgebung befinden, ist die Zelle am Leben.
          nächster.set(index, true);
          !current && config.execute(x, y, true); // Statusänderungen, Canvas-Aktualisierung break;
        Standard:
          // Wenn die Anzahl der lebenden Zellen in der Umgebung weniger als 2 beträgt, ist die Zelle tot. (Das Leben ist knapp)
          // Wenn mehr als 3 lebende Zellen vorhanden sind, ist die Zelle tot. (Zu viele Leben)
          nächster.set(index, false);
          current && config.execute(x, y, false); // Statusänderungen, Canvas-Break aktualisieren;
      }
      gibt true zurück;
    });
    als nächstes zurückkehren;
  }

Starten und Stoppen des Systems

  // LifeGame.js
  
  // Starte die Systemfunktion startWorld() {
    stopWorld(); // Stoppe die zuvor gestartete Schleife // Starte das System entsprechend der Iterationsgeschwindigkeit und aktualisiere das System in einer Schleife interval = setInterval(() => (config.data = refreshWorld()), config.speed || 500);
    starting = true; // Startflag aktivieren return true;
  }

  // Das System herunterfahren und das aktuelle System weiterlaufen lassen data function stopWorld() {
    clearInterval(interval); // Schleife stoppen starting = false; // Start-Flag deaktivieren return true;
  }

Methoden zum Zählen lebender Zellen

  // LifeGame.js
  
  Funktion borderSum(x = 0, y = 0) {
    const { Breite, Höhe, Daten } = Konfiguration;
    sei Summe = 0;
    für (lass j = y - 1; j <= y + 1; j++) {
      für (sei i = x - 1; i <= x + 1; i++) {
        // Grenzwertbeurteilung wenn (i < 0 || j < 0 || i >= Breite || j >= Höhe || (i === x && j === y)) {
          weitermachen;
        }
        wenn (Daten.get(MakeKey(i, j))) {
          sum++; // Die Anzahl der überlebenden Zellen akkumulieren}
      }
    }
    Rücklaufsumme;
  }

Iterative 2D-Koordinatenmethode

/**
 * Iteriere alle Elemente des 2D-Koordinatensystems und führe die Callback-Funktion aus* @param config: { width: number, height: number }
 * @param Rückruf: (x: Zahl, y: Zahl) => Boolesch
 */
const IterateCells = ({ Breite, Höhe }, Rückruf) => {
  für (lass y = 0; y < Höhe; y++) {
    für (lass x = 0; x < Breite; x++) {
      wenn (Rückruf && !Rückruf(x, y)) {
        gibt false zurück;
      }
    }
  }
  gibt true zurück;
};

Canvas-Methode aktualisieren

  // Leinwand.js
  
  Funktion ausführen(x, y, Leben) {
    const { Größe, lebendig, tot } = Konfiguration;
    // Zellenfarbe festlegen context.fillStyle = Leben? lebendig: tot;
    //Zeichnen Sie Zellen mit einem Abstand von 1px zwischen den Zellen
    context.fillRect(x * Größe + 1, y * Größe + 1, Größe - 1, Größe - 1);

    gibt true zurück;
  }

Oben sind die Details der JavaScript-Implementierung des Spiels des Lebens aufgeführt. Weitere Informationen zum Spiel des Lebens in JavaScript finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Natives JS zur Implementierung eines Klickzahlenspiels
  • Implementierung eines Puzzlespiels mit js
  • js um das Schlangenspiel mit Kommentaren zu implementieren
  • Natives JS zur Implementierung des Spiels 2048
  • JavaScript-Tippspiel
  • JavaScript-Puzzlespiel
  • Natives JS implementiert ein Minesweeper-Spiel mit benutzerdefiniertem Schwierigkeitsgrad
  • js Canvas zur Realisierung des Gobang-Spiels
  • So verwenden Sie JavaScript zum Schreiben eines Kampfspiels
  • Implementierung eines einfachen Minesweeper-Spiels basierend auf JavaScript

<<:  Springboot integriert die Docker-Bereitstellung, um zwei Möglichkeiten zum Erstellen von Docker-Images zu implementieren

>>:  Vergleichende Analyse der Hochverfügbarkeitslösungen von Oracle und MySQL

Artikel empfehlen

Farbverlauf für HTML-Hintergrund durch CSS erreicht

Screenshots der Effekte: Implementierungscode: Cod...

CentOS 8-Installationsdiagramm (superdetailliertes Tutorial)

CentOS 8 ist offiziell veröffentlicht! CentOS ent...

So verwenden Sie die asynchrone Anforderungs-API von Axios in Vue

Inhaltsverzeichnis Einrichten einer einfachen HTT...

Detaillierte Analyse des Unterschieds zwischen Ref und Reactive in Vue3.0

Inhaltsverzeichnis Ref und Reaktiv Referenz Reakt...

Anbieterpräfix: Warum brauchen wir ein Browser-Engine-Präfix?

Was ist das Lieferantenpräfix? Anbieterpräfix – B...

Vue + Express + Socket realisiert Chat-Funktion

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

Detaillierte Ansicht versteckter Spalten in MySQL

Inhaltsverzeichnis 1. Primärschlüssel vorhanden 2...

Navigationsdesign und Informationsarchitektur

<br />Wenn wir über Navigation sprechen, geh...

Vue implementiert QR-Code-Scanfunktion (mit Stil)

brauchen: Verwenden Sie Vue, um das Scannen von Q...

Implementierung der Breakpoint-Wiederaufnahme im Vue-Video-Player

In einem aktuellen Projekt musste ich die Funktio...

Vue3.0 implementiert die Kapselung des Dropdown-Menüs

Vue3.0 ist bereits seit einiger Zeit auf dem Mark...

Lösung für das Problem des verstümmelten Codes in MySQL 5.x

MySQL ist eine häufig verwendete Open-Source-Date...