Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming

Das Leben gestalten: Conways Spiel des Lebens

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Wilhelm Wolf (you can also view the original English article)

Manchmal sogar eine Reihe von einfachen Grundregeln können Ihnen sehr interessante Ergebnisse. In diesem tutorial erstellen wir die Kern-engine von Conway ' s Spiel des Lebens von Grund auf. 

Hinweis: Obwohl dieses tutorial ist geschrieben, mit C# und XNA, Sie sollten in der Lage sein, verwenden Sie die gleichen Techniken und Konzepte, die in fast jedem 2D-game-development-Umgebung. 


Einführung 

 Conway ' s Game of Life ist ein zellulärer Automat, der entwickelt wurde, in den 1970er-Jahren von einem britischen Mathematiker benannt, gut, John Conway.

Gegeben ein zwei-dimensionales Gitter von Zellen, die mit den "auf" oder "alive" und andere "off" oder "tot", und eine Reihe von Regeln, die bestimmt, wie Sie lebendig werden oder sterben, wir haben eine interessante "Leben der form" entfalten, direkt vor uns.   So, durch einfaches zeichnen Sie ein paar Muster in unser raster, und starten Sie dann die simulation, die wir beobachten können grundlegende Lebensformen sich entwickeln, sich ausbreiten, sterben ab, und schließlich stabilisieren. Laden Sie die Letzte Quell-Dateien, oder schauen Sie sich die demo unter:

Nun, dieses "Spiel des Lebens" ist nicht unbedingt ein "Spiel" - es ist mehr eine Maschine, vor allem, weil es ist kein Spieler und kein Ziel, es ist einfach, entwickelt sich auf Grundlage der ersten Bedingungen.   Dennoch, es ist eine Menge Spaß zu spielen, und es gibt viele Prinzipien des game-design kann für die Erstellung. Also, ohne weitere Umschweife, lasst uns loslegen!

 Für dieses tutorial, ich ging voran und baute alles in XNA, weil das ist, was ich am wohlsten. (Es gibt eine Anleitung zum Einstieg in die XNA-hier, wenn Sie interessiert sind.) Jedoch, Sie sollten in der Lage sein zu Folgen zusammen mit jedem 2D-Spiel-Entwicklungsumgebung, mit dem Sie vertraut sind.


Die Schaffung der Zellen 

 Das wichtigste element in Conway ' s Spiel des Lebens sind die Zellen, die die "Lebensformen", die als Grundlage für die gesamte simulation.  Jede Zelle kann in einem der beiden Staaten: "lebendig" oder "tot". Aus Gründen der Konsistenz, bleiben wir auf die beiden Namen für die Zelle Staaten für den rest dieses Tutorials.

 Zellen bewegen sich nicht, Sie einfach auf Ihre Nachbarn, die basierend auf Ihren aktuellen Zustand.

Nun, in Bezug auf die Programmierung Ihrer Funktionalität, es sind die drei Verhaltensweisen, die wir benötigen, um Ihnen: 

  1.  Sie brauchen, um zu verfolgen, Ihre Lage, Grenzen und Staat, so dass Sie angeklickt werden können und korrekt gezeichnet.
  2. Sie brauchen zum Umschalten zwischen lebendig und tot, wenn darauf geklickt wird, ermöglicht es dem Benutzer, um die eigentlich interessanten Dinge geschehen. 
  3. Sie müssen gezogen werden, wie weiß oder schwarz, wenn Sie tot sind oder lebendig, beziehungsweise. 

 Alle der oben genannten kann erreicht werden durch die Schaffung einer Zelle-Klasse enthält den folgenden code:


 Das Netz und Seine Regeln

 Jetzt, dass jede Zelle Los ist, richtig zu Verhalten, wir brauchen ein raster, das hält Sie alle auf und implementieren die Logik, das sagt jeder, ob er kommen sollte, am Leben, am Leben bleiben, sterben, oder Sie bleiben tot (keine zombies!).

Die Regeln sind Recht einfach: 

  1.  Jede live Zelle mit weniger als zwei live Nachbarn stirbt, als ob durch zu geringe Bevölkerung.
  2.  Jede live Zelle mit zwei oder drei live-Nachbarn lebt, die nächste generation.
  3. Jede live Zelle mit mehr als drei live Nachbarn stirbt, als ob durch überfüllung. 
  4. Jede tote Zelle mit genau drei Nachbarn Leben wird ein Leben der Zelle, als ob durch Reproduktion. 

 Hier ist eine schnelle visuelle Anleitung, um diese Regeln in dem Bild unten. Jede Zelle markiert durch einen blauen Pfeil, wird betroffen sein durch den entsprechenden numerierten Regel oben.  In anderen Worten, die Zelle 1 wird sterben, Zelle 2 wird am Leben bleiben, Zelle 3 wird sterben, und die Zelle 4 wird lebendig.

 So, wie das Spiel simulation läuft ein update in Konstanten zeitlichen Abständen, wird das raster überprüfen jede dieser Regeln für alle Zellen im raster. Das kann bewerkstelligt werden, indem Sie den folgenden code in eine neue Klasse, ich nenne Grid:

 Das einzige was uns noch fehlt, von hier aus ist die Magie GetLivingNeighbors-Methode, die einfach zählt, wie viele der aktuellen Zelle die Nachbarn sind derzeit am Leben. Also, lassen Sie ' s fügen Sie diese Methode, um unser Grid-Klasse:

 Beachten Sie, dass im obigen code die erste if-Anweisung jedes paar ist einfach die Kontrolle, dass wir nicht auf dem Rand des Gitters. Wenn wir nicht über diese Prüfung, wir würden in laufen mehrere Ausnahmen von der überschreitung der Grenzen des Arrays.  Auch, da dies wird dazu führen, zu zählen, niemals inkrementiert, wenn wir die Kontrolle über die Kanten, das heißt das Spiel "übernimmt" die Kanten sind tot, also ist es äquivalent zu einer dauerhaften Grenze der weißen, Toten Zellen, um unser Spiel zu windows.


 Aktualisierung der Gitter in Diskrete Zeitschritte

 So weit, alle die Logik, die wir implementiert haben, ist sound, aber es wird nicht ordentlich benehmen, wenn wir nicht vorsichtig sind, um sicherzustellen, dass unsere simulation läuft in diskreten Zeitschritten. Dies ist nur eine Phantasie Art zu sagen, dass alle unsere Zellen werden aktualisiert und an der exakt gleichen Zeit, um Kohärenz.  Wenn wir nicht diese umzusetzen, würden wir uns seltsam Verhalten, da die Reihenfolge, in der die Zellen geprüft wurden, wäre die Sache, also die strengen Regeln, die wir eben eingestellt würde auseinander fallen, und mini-chaos würde entstehen.

 Zum Beispiel unsere Schleife über prüft, ob alle Zellen von Links nach rechts, so dass, wenn die Zelle auf der linken Seite, die wir gerade überprüft wurde lebendig, dies würde sich ändern, die Anzahl der für die Zelle in der Mitte, die wir jetzt prüfen und vielleicht machen es lebendig.  Aber, wenn wir die überprüfung von rechts nach Links statt, die Zelle auf der rechten Seite könnte tot sein, und die Zelle auf der linken Seite nicht kommen, am Leben noch, so dass unsere mittlere Zelle bleiben würde, tot.  Das ist schlecht, weil es inkonsistent! Wir sollten in der Lage sein zu überprüfen, werden die Zellen in einer zufälligen Reihenfolge wir wollen (wie eine Spirale!) und der nächste Schritt sollte immer identisch sein.

Zum Glück, das ist wirklich Recht einfach zu implementieren im code. Alles, was wir brauchen, ist eine zweite Zellen-raster im Speicher für den nächsten Zustand des Systems.   Jedes mal, wenn wir bestimmen den nächsten Zustand einer Zelle, speichern wir es in unserem zweiten Gitter für den nächsten Zustand des gesamten Systems. Dann, wenn wir gefunden haben, in den nächsten Zustand jeder Zelle tragen wir Sie alle zur gleichen Zeit. So können wir hinzufügen, ein 2D-array von booleans nextCellStates als eine private variable, und fügen Sie diese Methode, um die Grid-Klasse: 

Schließlich, vergessen Sie nicht, um das Update-Methode oben, so weist es das Ergebnis auf den nächsten Zustand und nicht als das aktuelle, dann rufen Sie SetNextState am Ende der Update-Methode direkt nach dem Schleifen abgeschlossen ist. 


Zeichnung der Raster 

 Jetzt, da wir fertig sind, desto schwieriger Teile der Gitter der Logik, die wir brauchen, um in der Lage sein, um es zu zeichnen auf dem Bildschirm. Das raster ziehen wird jede Zelle durch Aufruf Ihrer Methoden zeichnen ein zu einer Zeit, so dass alle lebenden Zellen werden schwarz, und der tote wird weiß sein.

 Das aktuelle Gitter nicht brauchen, etwas zu zeichnen, aber es ist viel klarer aus der Sicht des Benutzers wenn wir hinzufügen, einige Rasterlinien. Dies ermöglicht dem Benutzer, mehr leicht erkennen, Zelle Grenzen, und darüber hinaus kommuniziert ein Gefühl der Skala, so erstellen wir eine Draw-Methode wie folgt:

 Beachten Sie, dass im obigen code, wir nehmen ein einzelnes pixel und Dehnung, um eine sehr lange und dünne Linie. Ihre speziellen game-engine kann eine einfache DrawLine-Methode, in dem Sie angeben können, zwei Punkte und eine Linie zwischen Ihnen gezogen, die würde es sogar noch einfacher als die oben genannten.


Hinzufügen Von High-Level-Spiel Logik 

 An diesem Punkt haben wir alle die grundlegenden Stücke, die wir brauchen, um das Spiel ausführen, brauchen wir nur, um Sie alle zusammen. Also, für Vorspeisen, die in Ihrem Spiel die main-Klasse (die, die alles anfängt) zu erzeugen, müssen wir ein paar Konstanten, wie die Abmessungen des Rasters und der framerate (wie schnell es aktualisiert wird), und all die anderen Dinge, die wir brauchen, wie die einzelnen pixel, die Display-Größe, und so weiter.

 Wir müssen auch initialisiert werden viele dieser Dinge, wie das erstellen der raster-Einstellung die Größe des Fensters für das Spiel, und sicherstellen, dass die Maus sichtbar ist, so können wir klicken auf die Zellen.  Aber all diese Sachen sind engine-spezifisch und nicht sehr interessant, so werden wir überspringen und direkt über es und lernen Sie die guten Sachen. (Natürlich, wenn Sie folgende entlang in XNA, können Sie den Quellcode herunterladen um alle details.)

 Nun, wir haben alles eingerichtet und bereit zu gehen, und wir sollten in der Lage sein, führen Sie einfach das Spiel! Aber nicht so schnell, denn es gibt ein problem: wir können nicht wirklich etwas tun, denn das Spiel läuft immer.  Es ist im Grunde unmöglich zu ziehen spezifische Formen, weil Sie auseinander brechen, wie Sie ziehen Sie Sie, so dass wir wirklich brauchen, um in der Lage sein, um das Spiel anzuhalten.  Es wäre auch schön, wenn wir könnten, deaktivieren Sie das raster, wenn es zu einem Chaos, weil unsere Kreationen wachsen oft außer Kontrolle und hinterlassen ein Chaos hinter sich.

 Also, lassen Sie ' s fügen Sie einige code, um das Spiel zu unterbrechen, wenn die Leertaste gedrückt wird, und den Bildschirm löschen, wenn backspace gedrückt wird:

 Es würde auch helfen, wenn wir es sehr klar gemacht, dass das Spiel unterbrochen wurde, so als schreiben wir unsere Draw-Methode fügen wir etwas code, um den hintergrund rot, und schreiben Sie "Pause" im hintergrund:

 Das ist es! Alles sollte nun funktionieren, so können Sie es geben einen Wirbel, ziehen einige Lebensformen und sehen, was passiert!  Gehen Sie und erkunden Sie interessante Muster können Sie machen, indem Sie auf der Wikipedia-Seite wieder. Sie können auch spielen mit der framerate, die Zelle, die Größe und das raster Abmessungen, zu optimieren es nach Ihren wünschen.


Hinzufügen Von Verbesserungen 

 An diesem Punkt, das Spiel ist voll funktionsfähig und es ist keine Schande nannte es ein Tag.  Aber ein ärgernis ist Euch vielleicht aufgefallen ist, dass die Maus Klicks nicht immer registrieren, wenn Sie versuchen, zu aktualisieren, eine Zelle, so dass, wenn Sie klicken und ziehen Sie Ihre Maus über das raster, es lasse eine gepunktete Linie hinter eher als solide ein.  Dies geschieht, weil die rate, mit der die Zellen aktualisieren, ist auch die rate, mit der die Maus gecheckt, und es ist viel zu langsam. Also brauchen wir einfach nur zu entkoppeln, die rate, die das Spiel-updates, und die rate der ist, liest die Eingabe.

Definieren Sie zunächst die update-rate und die framerate-separat in der main-Klasse: 

 Nun, bei der Initialisierung des Spiels, verwenden Sie die framerate (FPS) festlegen, wie schnell Sie Lesen werden, der Maus und ziehen, was eine schöne glatte 60 FPS zumindest:

 Dann, fügen Sie einen timer, um Ihre Grid-Klasse, so dass es nur aktualisiert, wenn es muss, unabhängig von der framerate:

Nun, Sie sollten in der Lage sein, das Spiel in der gewünschten Geschwindigkeit, die Sie wollen, einmal sehr langsam 5 updates pro Sekunde, so können Sie sorgfältig beobachten Sie Ihre simulation zu entfalten, während noch in der Lage zu zeichnen schöne glatte Linien auf einer soliden framerate. 


Fazit 

 Sie haben jetzt eine glatte und funktional-Spiel des Lebens auf Ihren Händen, aber in Fall, dass Sie wollen, es weiter zu erforschen, es gibt immer mehr tweaks, können Sie es hinzufügen. Zum Beispiel, das Netz wird derzeit davon ausgegangen, dass über seine Kanten, alles ist tot.  Sie konnte es ändern, so dass das Gitter umschließt, so dass ein Segelflugzeug Fliegen würde, für immer! Es gibt keinen Mangel an Variationen über dieses beliebte Spiel, so lassen Sie Ihrer Fantasie freien Lauf.

 Vielen Dank für das Lesen, ich hoffe, Sie haben gelernt, einige nützliche Dinge heute!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.