[PYTHON] Ich habe ein Lebensspiel mit Numpy gemacht

Erster Beitrag des Artikels über den Spielplatz-Adventskalender!

Was ist ein Lebensspiel?

Unten [wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3 Zitiert aus% 83% A0). ~~ Ich denke, es ist einfacher zu verstehen, wenn Sie zum Link springen, als das folgende Zitat zu lesen w ~~

Im Lebensspiel wird der nachfolgende Zustand nur durch den Ausgangszustand bestimmt. Es gibt ein Gitter wie ein Go-Board, und ein Gitter wird als Zelle bezeichnet. Jede Zelle hat acht nahe gelegene Zellen. Jede Zelle hat zwei Zustände, "Leben" und "Tod", und der Zustand des nächsten Schritts (der nächsten Generation) einer Zelle wird durch den Zustand der umgebenden acht Zellen in der aktuellen Generation bestimmt.

Das Leben und der Tod einer Zelle folgen den folgenden Regeln.

Geburt Wenn genau drei lebende Zellen neben einer toten Zelle liegen, wird die nächste Generation geboren. ** Überleben ** Wenn zwei oder drei lebende Zellen neben einer lebenden Zelle liegen, überlebt sie in der nächsten Generation. ** Entvölkert ** Befindet sich weniger als eine lebende Zelle neben einer lebenden Zelle, stirbt diese aufgrund der Entvölkerung ab. ** Überfüllt ** Wenn sich 4 oder mehr lebende Zellen neben einer lebenden Zelle befinden, stirbt diese aufgrund von Überfüllung. Unten sehen Sie ein Beispiel für Leben und Tod im nächsten Schritt in der zentralen Zelle. Lebende Zellen sind mit ■ und tote Zellen mit □ gekennzeichnet.

Paket verwendet

import matplotlib.pyplot as plt
import numpy as np

Ausgangszustand

n = 50

#Erstellen Sie eine zufällige Zelle
cells = np.random.randint(0, 2, (n, n), dtype=bool)

Durch zufällige Auswahl von "Wahr" oder "Falsch" wird eine n × n-Matrix von Elementen erstellt. ("Leben" für "Wahr", "Tod" für "Falsch") (Wenn Sie es auf ungefähr "n = 500" erhöhen, wird es schwer ...)

Zählen Sie die Anzahl benachbarter "roher" Zellen

sum_around = lambda i, j : cells[max(0, i-1):i+2, max(0, j-1):j+2].sum() - cells[i, j]

Zuerst wird eine 3 × 3-Matrix, die auf der Spaltenkomponente "i" row "j" der Matrix zentriert ist, extrahiert und die Summe der Elemente der Matrix erhalten. Das Subtrahieren der Mitte vom Ergebnis ergibt die Anzahl der "rohen" Zellen neben der Spaltenkomponente "i" row "j". (Berechnet als "Wahr = 1, Falsch = 0")

Grund für die Verwendung der Funktion "max"

Wenn Sie die Zelle links (oder höher) von der Zelle in der 0. Zeile (oder 0. Spalte) angeben möchten, auch wenn "i -1 = -1", "max (0, -1) = 0" Daher kann nur auf den Bereich innerhalb der Wand Bezug genommen werden. Python scheint in Ordnung zu sein, wenn der Index die Größe der Matrix überschreitet und ich für die n-te Zeile (oder n-te Spalte) nicht dasselbe tun musste.

Update auf die nächste Generation

def update(old):

    sum_around = lambda i, j : cells[max(0, i-1):i+2, max(0, j-1):j+2].sum() - cells[i, j]
    
    around = np.fromfunction(np.vectorize(sum_around), old.shape)
    new = np.where(old , ((2 <= around) & (around <= 3)), (around == 3))
    return new

Durch Einfügen der Funktion "sum_around" in das erste Argument der Funktion "np.fromfunction" wird eine neue Matrix "around" erstellt, in der ** der Wert jedes Elements = die Anzahl benachbarter "roher" Zellen ** ist. Wenn jedes Element "wahr" ist, dh wenn es eine "rohe" Zelle ist, wird das Beurteilungsergebnis von "Überleben / Entvölkerung / Überfüllung" zurückgegeben, und wenn es "falsch" ist, dh wenn es eine "Todeszelle" ist, wird das Beurteilungsergebnis zurückgegeben. Gibt das Urteilsergebnis von ** Geburt ** zurück. Der Rückgabewert ist vom Typ "bool", der so wie er ist die Zelle der nächsten Generation.

Gründe für die Verwendung der Funktion "np.vectorize"

Es scheint, dass die Funktion des ersten Arguments eine universelle Funktion (ufunc) sein muss.

Parameters :

function : callable The function is called with N parameters, where N is the rank of shape. Each parameter represents the coordinates of the array varying along a specific axis. For example, if shape were (2, 2), then the parameters would be array([[0, 0], [1, 1]]) and array([[0, 1], [0, 1]]) numpy.fromfunction

Da das Argument der Funktion "sum_around" den Typ "int" annimmt, wird es mit "np.vectorize" ersetzt, damit es den Typ "ndarray" empfangen kann.

Ausgabe

while True:
# for _ in range(200):  #Wenn Sie die Anzahl der Male angeben möchten

    cells = update(cells)
    
    plt.imshow(cells)
    plt.pause(.01)   # 0.Alle 01 Sekunden aktualisiert
    plt.cla()        #Ohne dies wird es immer schwerer

: santa: Weihnachtsfarbe: christus_tree:

from matplotlib.colors import LinearSegmentedColormap

colors = ['green', 'red']
xmas = LinearSegmentedColormap.from_list('xmas', colors)
norm = plt.Normalize(0, 1)

plt.tick_params(labelbottom=False, labelleft=False,
                bottom=False, left=False)

Sie können zur angegebenen Farbe wechseln, indem Sie das Innere der while-Anweisung in "plt.imshow (Zellen, cmap = xmas, norm = norm)" ändern.

Ausführungsergebnis

ezgif-3-866aafd6a847.gif

Ganzer Code

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap


n = 15

cells = np.zeros([n, n], dtype=bool)

#Galaxis
cells[3:9, 3:5] = True
cells[3:5, 6:12] = True
cells[-5:-3, 3:9] = True
cells[6:12, -5:-3] = True

#zufällig
# cells = np.random.randint(0, 2, (n, n), dtype=bool)


def update(old):

    sum_around = lambda i, j : cells[max(0, i-1):i+2, max(0, j-1):j+2].sum() - cells[i, j]
    
    around = np.fromfunction(np.vectorize(sum_around), old.shape, dtype=int)
    new = np.where(old , ((2 <= around) & (around <= 3)), (around == 3))
    return new


colors = ['green', 'red']
xmas = LinearSegmentedColormap.from_list('xmas', colors)
norm = plt.Normalize(0, 1)

plt.tick_params(labelbottom=False, labelleft=False,
                bottom=False, left=False)

# for _ in range(200):
while True:

    cells = update(cells)
    
    plt.imshow(cells, cmap=xmas, norm=norm)
    plt.pause(.01)
    plt.cla()

: 8ball: Impressionen: 8ball:

Es ist wahrscheinlich das erste Mal seit ich mit dem Programmieren angefangen habe, dass etwas, das ich selbst gemacht habe, funktioniert hat ... Ich habe es getan (dringende Rekrutierung: Verbalisierung der Freude)

Recommended Posts

Ich habe ein Lebensspiel mit Numpy gemacht
〇✕ Ich habe ein Spiel gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Sense HAT ein gefallenes Monospiel gemacht
Ich habe mit Python eine Lotterie gemacht.
Zura machte wie ein Lebensspiel
Ich habe mit Python einen Daemon erstellt
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe mit Python eine Hex-Map erstellt
Ich habe einen Hanko-Generator mit GAN gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Mattermost Bot mit Python gemacht (+ Flask)
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe GP mit Numpy geschrieben
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe einen Blackjack mit Python gemacht!
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Ich habe COVID19_simulator mit JupyterLab erstellt
Ich habe Word2Vec mit Pytorch gemacht
Ich habe mit Python einen Blackjack gemacht.
Ich habe mit Ren’py ein Einführungsspiel für das Schulfest gemacht
Ich habe Wordcloud mit Python gemacht.
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Erstellen Sie ein Lebensspiel, das manuell mit tkinter aktualisiert wird
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe ein Numer0n-Kampfspiel in Java gemacht (ich habe auch KI gemacht)
Ich habe einen Ressourcenmonitor für Raspberry Pi mit einer Tabelle erstellt
Ich habe einen harten Pomodoro-Timer entwickelt, der mit CUI funktioniert
Ich habe zum ersten Mal eine Überwachungskamera mit Raspberry PI gemacht.
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.