Es ist nicht wirklich ein "Spiel" – sondern eher eine Reihe von Regeln des Mathematikers John Horton Conway. Stellen Sie sich ein Gitter von Zellen vor, wie eine Tabelle oder ein <table>. Jede Zelle ist entweder lebendig oder tot. "Runden" vergehen nacheinander. In jeder Runde gibt es Regeln, ob eine lebende Zelle weiterleben oder sterben soll und ob eine tote Zelle tot bleiben oder lebendig werden soll.
Die Regeln
Es ist irgendwie dazu gedacht, eine reale Umgebung zu replizieren. Zellen können entweder an Unterbevölkerung oder Überbevölkerung sterben und nur unter perfekten Bedingungen leben. Die Regeln sind ziemlich einfach
- Lebende Zelle – Weniger als 2 lebende Nachbarn – stirbt (Unterbevölkerung).
- Lebende Zelle – 2 oder 3 Nachbarn – lebt weiter (perfekte Situation).
- Lebende Zelle – Mehr als 3 lebende Nachbarn – stirbt (Überbevölkerung).
- Tote Zelle – Genau drei lebende Nachbarn – wird lebendig (Fortpflanzung).
Warum redest du darüber?
Ich empfinde eine starke Nostalgie dafür. Eine visuelle Version des Spiels des Lebens war das erste Programmierprojekt, das ich in der High School gemacht habe. Oder wenn nicht das erste, dann das erste, bei dem ich einen "Aha!"-Moment hatte und erkannte, dass Programmieren und Design super Spaß machen und interessant sein können.
Gib das Problem jedem Programmierer und er wird es wahrscheinlich leicht anders lösen.
- In welcher Sprache soll es geschrieben werden?
- Wie gestalten wir die Architektur sauber?
- Wie können wir es rechnerisch schnell machen?
- Wie groß können wir es machen, bevor es langsamer wird?
- Wie speichern wir die Daten und Zustände am besten?
- Wie werden Kanten behandelt?
Gib das Problem jedem Designer und die Ergebnisse werden anders aussehen.
- Welche Farben machen Sinn?
- Sollen wir für Zustände außer lebendig und tot verschiedene Farben haben?
- Wie groß sollen die Zellen sein, um interessant zu sein?
- Wie schnell sollen die Runden sein, um interessant, aber nicht überwältigend zu sein?
- Kann man damit interagieren?
- Kann man in der Zeit vorwärts *und rückwärts* gehen?
- Wie schaltet man Zellen ein und aus? Klicken? Ziehen? Randomisierung?
- Was sind die interessantesten Formen, die man machen kann? Können wir diese zeigen?
Ich bringe das auch zur Sprache, weil ich mich erinnere, vor ein paar Jahren versucht zu haben, eine Demo zu machen, die so schrecklich war, dass ich neidisch auf all die coolen bin. Ich habe im Grunde jQuery verwendet, um den DOM nach Nachbarn jeder einzelnen Zelle abzufragen, und es war so ineffizient, dass ich wahrscheinlich mit einer Antenne geschlagen worden wäre.
Beispiele
Meine erste Version war in Turbo Pascal auf einem alten Apple. Es bereitet mir große Freude zu wissen, dass diese kleine visuelle mathematische Übung heute lebendig und gut ist und die Leute ein von mir entwickeltes Werkzeug verwenden, um Versionen zu erstellen. Selbst bei Demos, die die gleiche Technologie verwenden, kann der Ansatz anders sein! Ich habe auch eine Sammlung.
JavaScript auf Canvas
Mit einem Hauch von jQuery
Siehe den Pen Conway’s Game of Life von John H Moore (@john-h-moore) auf CodePen.
Ohne
Siehe den Pen Game of Life von Qbit (@Qbit42) auf CodePen.
Siehe den Pen Game of Life on Canvas von Dennis Kerzig (@wottpal) auf CodePen.
JavaScript auf einer <table>
Siehe den Pen payKn von Alan R. Soares (@alanrsoares) auf CodePen.
Backbone.js
Siehe den Pen Conway’s Game of Life in Backbone von Eric Miller (@SimpleAsCouldBe) auf CodePen.
Verwendung von CSS box-shadow zum Zeichnen von Zellen
Siehe den Pen box-shadow game of life von Joris van de Donk (@jorisvddonk) auf CodePen.
In CoffeeScript
Siehe den Pen mctCv von Hanganu Petru-Alin (@Lynku) auf CodePen.
In D3.js
Schnell!
Siehe den Pen Game of Life – D3 von Reed Spool (@reedspool) auf CodePen.
Dies sind nur Beispiele für das Frontend, aber man findet leicht Beispiele in jeder Sprache. Besuchen Sie Golly für native App-Versionen und die Wikipedia-Seite für weitere Informationen. Eine besonders interessante Sache am Spiel des Lebens ist, dass alle möglichen seltsamen Strukturen möglich sind, die auf seltsame Weise "Leben erschaffen" oder erhalten.
Eine Sache, die ich noch nie gesehen habe, ist eine reine CSS-Version. Ist das überhaupt möglich? Es wäre wahnsinnig kompliziert mit seltsamen Positionierungen und komplexen Selektoren. Aber man sagt, Sass sei "Turing-vollständig", also ist es möglich, oder? Oder gibt es andere Einschränkungen?
Ich wäre an weiteren seltsamen Frontend-Beispielen des Spiels des Lebens interessiert. Oder an Geschichten, die Sie darüber aus Ihrer Vergangenheit haben =).
Hier ist meine Version, in nur 238b HTML & JS
http://xem.github.io/miniGameOfLife/
Liebe.
Bezüglich einer reinen CSS-Version
Die Turing-Vollständigkeit von SASS ist für das Problem irrelevant, da Browser SASS nicht verwenden – sie verwenden das CSS, in das SASS kompiliert wird. Die Frage sollte lauten: "Ist CSS Turing-vollständig?"
Eine schnelle Überprüfung von Stack Overflow ergibt widersprüchliche Antworten. Die Top-Antwort zeigt eine Möglichkeit, Regel 110 in CSS einzubetten, aber wie ein Kommentar darauf hinweist, hat CSS Schwierigkeiten, mehr als eine Iteration durchzuführen. CSS wird einmal ausgewertet und ist dann fertig.
Meine (im Internet gebildete) Meinung ist, dass CSS Turing-vollständig sein mag, ABER es sei denn, man kann einen Weg um das Iterationsproblem finden, gibt es keine Möglichkeit, ein "echtes" Spiel des Lebens zu machen.
Aber das bedeutet nicht, dass man es nicht versuchen kann! Legen Sie los, beweisen Sie mir das Gegenteil! Ich würde es gerne sehen! (Außerdem ist meine im Internet gebildete Meinung sehr wahrscheinlich falsch :-)
Eigentlich umgeht less.js und seine modifyVars-Funktion das Iterationsproblem mit minimaler Hilfe von JS. BRB, ich baue das.
Ich habe vor einiger Zeit eine Bibliothek erstellt, um die Hürde für die Erstellung solcher Simulationen zu senken. Schauen Sie sie sich an, wenn Sie interessiert sind :)
Warum nicht Ihr Leben mit etwas Kategorientheorie aufpeppen? Denn schließlich,
„zelluläre Automaten zu evaluieren ist komonadisch“ http://blog.sigfpe.com/2006/12/evaluating-cellular-automata-is.html
Gerade gesehen, ich bin stolz, dass du meinen Code gezeigt hast! :-D Toller Beitrag
Tolle Lektüre, danke!
Es stellt sich heraus, es war auch mein erstes Programm… in Basic auf einem IBM PC im Jahr 1984 :) #ouch
Lieber Chris,
Kann ich die letzten drei Stunden meines Lebens zurückbekommen? Präsentiert…
CSS Spiel des Lebens
(eine Generation)
http://codepen.io/AmeliaBR/pen/EifgL?editors=110
Ich hatte schon immer eine Schwäche für das Spiel des Lebens, aber das war eine Übung in Absurdität. Allerdings habe ich dabei gelernt, wie man Schleifen und Variablen in SCSS und Jade verwendet, also war es keine völlig verschwendete Zeit.
Für diejenigen, die sich für die Informatik-Theorie interessieren: Der Grund, warum es nur eine Generation ist, liegt darin, dass das Spiel des Lebens eine selbsterhaltende Simulation ist, die auf Änderungen ihres internen Zustands basiert. CSS kann nur auf Zustandsänderungen reagieren, die vom Benutzer verursacht werden, nicht seinen eigenen Zustand ändern (man kann keinen Selektor schreiben, der Elemente basierend auf früheren Stiländerungen auswählt). Man kann also nicht die Logik der ersten Generation verwenden, um den Zustand zu ändern, und dann die gleiche Logik für nachfolgende Generationen verwenden; man müsste die Regeln für alle möglichen Ergebnisse basierend auf dem Anfangszustand berechnen.
Um beispielsweise ein Zwei-Generationen-System zu erstellen, müsste man alle möglichen Zustände der Nachbarn der Nachbarn einer Zelle berücksichtigen und dann geeignete Keyframe-Animationen erstellen, um die Änderungen anzuzeigen. Und meine Ein-Generationen-Demo mit 20*20 hat bereits genügend Regeln, um den Browser stark zu verlangsamen… Checkbox-Hacks wären so viel einfacher, wenn es eine Möglichkeit gäbe, die
n-Werte bei Verwendung mehrerernth-of-type-Selektoren in einer einzigen CSS-Regel zu synchronisieren.Ähm. WOW. Danke, dass du das erforscht hast. Es ist interessant, dass CSS, auch wenn man nicht über die erste Runde hinaus iterieren kann, die Werkzeuge zur Auswertung aller Nachbarn hat.
Hallo Amelia,
Ich bin mir nicht sicher, ob du E-Mail-Antworten erhältst, aber schau dir meinen langen Kommentar in diesem Thread an. Ich glaube, ich habe eine Lösung für den Zugwechsel. Es ist eindeutig CSS-Trickser, aber ich habe JS vermieden :D. Die eigentliche Spiellogik habe ich aber noch nicht gelöst, vielleicht können wir das ja kombinieren.
@Chris: Ja, die Nachbarn herauszufinden war knifflig. Ich bin ein paar Sackgassen gegangen (z.B. Radio-Button-Gruppen), bevor mir klar wurde, dass ich alle Checkboxen vor die gesamte Tabelle schieben musste, damit Zellen Nachbarn beeinflussen konnten, die vor ihnen in der Rendering-Reihenfolge waren.
@Rob: Interessante Ideen, aber ich glaube immer noch nicht, dass man die Einwegnatur von CSS-Effekten überwinden kann: Man kann CSS auf den äußeren Rahmen anwenden, um die Breite des iframes zu ändern, und dann Medienabfragen verwenden, um darauf zu reagieren, aber man kann derzeit nicht den Elternrahmen mit CSS im iframe beeinflussen. Es ist möglich, dass die komplexen CSS-Regeln in den WebComponents-Vorschlägen diese Art von Schleife ermöglichen könnten. Ich habe noch nicht herausgefunden, wie ich all diese Regeln so nutzen kann, wie sie gedacht sind, geschweige denn, wie ich sie missbrauchen kann, um CSS in eine vollständige Programmiersprache zu verwandeln!
Großen Dank
Ich bin ihm zum ersten Mal auf einem alten Windows 98(?) Computer begegnet, der eine Version des Spiels des Lebens hatte, die CP/M enthielt, und man rief das Spiel des Lebens mit einer Tastenkombination auf, die ich vergessen habe… Toller Artikel!
Ich habe eine Version, die ich für JS1k erstellt habe, die eine zufällige "Landschaft" aufbaut und dann die Regeln des Spiels des Lebens für das "Feuer" verwendet, das sie verbrennt: http://js1k.com/2014-dragons/demo/1709
Ich habe einen Sudoku-Prüfer in reinem CSS erstellt, der etwas JS benötigt, um die Werte in ein Attribut zu schreiben.
http://codepen.io/FWeinb/pen/lLifw
Das unmittelbarste Problem, das ich bei einem CSS-Spiel des Lebens sehe, ist die Fortsetzung des Spiels. Es ist verlockend, zu JS zu greifen, um die Züge auszulösen.
Animationen haben Schritte, aber sie sind endlich. Sie können jedoch wiederholt werden, daher gibt es Potenzial. Eine weitere interessante Tatsache ist, dass nicht alle Eigenschaften atomar geändert werden können, insbesondere Höhe/Breite/Margin/Padding beeinflussen alle das Layout, was theoretisch als Auslösemechanismus genutzt werden könnte. Wir haben nicht viele Listener in CSS, aber wir haben ein paar :hover/:active verlassen sich auf den Benutzer, aber Media Queries sind eine interessante Option, da sie sich auf unseren Freund
widthverlassen. Nun ist es allgemein bekannt, dass wir keine Element-Abfragen haben (booh!), aber wir haben iframes, die wie eine Element-Abfrage wirken (Meine Antwort wird zur Hälfte wegen eines Emoji-Zeichens wiederholt.
Das unmittelbarste Problem, das ich bei einem CSS-Spiel des Lebens sehe, ist die Fortsetzung des Spiels. Es ist verlockend, zu JS zu greifen, um die Züge auszulösen.
Animationen haben Schritte, aber sie sind endlich. Sie können jedoch wiederholt werden, daher gibt es Potenzial. Eine weitere interessante Tatsache ist, dass nicht alle Eigenschaften atomar geändert werden können, insbesondere Höhe/Breite/Margin/Padding beeinflussen alle das Layout, was theoretisch als Auslösemechanismus genutzt werden könnte. Wir haben nicht viele Listener in CSS, aber wir haben ein paar :hover/:active verlassen sich auf den Benutzer, aber Media Queries sind eine interessante Option, da sie sich auf unseren Freund
widthverlassen. Nun ist es allgemein bekannt, dass wir keine Element-Abfragen haben (booh!), aber wir haben iframes, die wie eine Element-Abfrage wirken :smily-imp:.Theoretisch können wir diese Fakten zusammenfügen. Wir können die Breite des iframes in einer Schleife von klein nach groß animieren. Dann können wir im Kind-Frame unseren Zugwechsel-Schritt in einer Medienabfrage anwenden.
Um das Spiel tatsächlich zu spielen, sehe ich, dass Amelia B R in den Kommentaren oben eine Teillösung hat, also können wir das vielleicht anpassen.
Hinweis: iframes sind manchmal fehlerhaft mit CSS3-Animationen/Übergängen, aber das ist in Ordnung, wir stellen iframe width=100% ein und verwenden einen Container.
Oh Mann! Ich wollte das schon immer mal in CSS schreiben, aber ich hatte immer Angst davor.
Das ist meine Version, bei der die Karte in Chunks aufgeteilt wird, um die Zeit für die Berechnung jeder Generation auf großen Karten zu verkürzen (Warnung: Ich bin kein Designer)
http://hermann.is/conway/
Danke! Tolle Lektüre! Ich werde die C64-Spiele von Commodore nie vergessen ;)))).
Mein Ansatz, nur Sass produziert CSS-Animationen
http://codepen.io/doingweb/pen/GEdHr
Ein weiteres Beispiel Spiel des Lebens + riesige Sammlung interessanter Muster. Viel Spaß :-)
Ich erinnere mich an einen alten Windows 98(?) Computer, auf dem es eine Version des Spiels des Lebens gab, die ein echtes wettkampforientiertes "Spiel" enthielt.
Eine bestimmte Anzahl von "lebenden" Zellen war rot gefärbt.
Rote Zellen können mit blauen Zellen auf die gleiche Weise interagieren.
Das Ziel war es, mit Logik alle roten Zellen zu eliminieren und nur blaue Zellen in einer bestimmten Anzahl von Zügen zu hinterlassen.
Wenn man gewann, bekam man einen digitalen Nobelpreis.
Das wäre interessant, in JS implementiert zu sehen.