Konzept-EinführungZellulä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 RegelnIn 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:
Vollständiger CodeBrennender 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. HauptimplementierungSystemkonfiguration: 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:
|
>>: Vergleichende Analyse der Hochverfügbarkeitslösungen von Oracle und MySQL
Screenshots der Effekte: Implementierungscode: Cod...
Hexo bindet einen benutzerdefinierten Domänenname...
CentOS 8 ist offiziell veröffentlicht! CentOS ent...
Inhaltsverzeichnis Einrichten einer einfachen HTT...
Inhaltsverzeichnis Ref und Reaktiv Referenz Reakt...
Was ist das Lieferantenpräfix? Anbieterpräfix – B...
In diesem Artikel wird der spezifische Code von V...
Nachdem ich meinen Computer kürzlich neu installi...
Inhaltsverzeichnis 1. Primärschlüssel vorhanden 2...
Inhaltsverzeichnis Vorwort 1. Neue Partitionen vo...
<br />Wenn wir über Navigation sprechen, geh...
brauchen: Verwenden Sie Vue, um das Scannen von Q...
In einem aktuellen Projekt musste ich die Funktio...
Vue3.0 ist bereits seit einiger Zeit auf dem Mark...
MySQL ist eine häufig verwendete Open-Source-Date...