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

Zusammenfassung des JS-Ausführungskontexts und -umfangs

Inhaltsverzeichnis Vorwort Text 1. Konzepte im Zu...

So migrieren Sie den MySQL-Speicherort auf eine neue Festplatte

1. Bereiten Sie eine neue Festplatte vor und form...

Detaillierte Erklärung zur Verwendung von this.$set in Vue

Inhaltsverzeichnis Verwendung von this.$set in Vu...

Vue: Detaillierte Erklärung von Speicherlecks

Was ist ein Speicherleck? Ein Speicherleck bedeut...

Installations- und Verwendungsschritte für vue-amap

Ich habe zuvor die Verwendung des asynchronen Lad...

27 Linux-Befehle zum Bearbeiten von Dokumenten, die es wert sind, gesammelt zu werden

Linux-Befehl „col“ Der Linux-Befehl col wird zum ...

Detaillierte Einführung in CSS-Schrift-, Text- und Listeneigenschaften

1. Schrifteigenschaften Farbe, gibt die Farbe des...

HTML-Kopfstruktur

Im Folgenden werden die häufig verwendete Kopfstr...

Beispiel für eine dynamische Sperre der IP-Blacklist von Nginx

Wenn eine Website böswillig angefragt wird, ist d...

MySQL-Lernhinweise: Daten-Engine

Sehen Sie sich die von der aktuellen Datenbank un...

Detaillierte Schritte zur Installation eines Hadoop-Clusters unter Linux

Inhaltsverzeichnis 1. Erstellen Sie ein Hadoop-Ve...