Jeu de vie avec Python! (Le jeu de la vie de Conway)

introduction

[Life game] [link01], qui est connu comme un automate à cellules, semblait intéressant, j'ai donc écrit le code pour générer le tableau de cartes du jeu de la vie avec Python et numpy. En donnant un tableau de carte de première génération écrit en «0» (mort) et «1» (en direct), il est implémenté en tant que générateur pour générer le tableau de carte de prochaine génération en itératif. J'ai aussi essayé de faire correspondre la carte à la condition aux limites périodique (l'état où les extrémités sont connectées)!

lifegame.py

Importez et utilisez le lifegame.py suivant comme module. Consultez l'exemple de code ci-dessous pour un exemple d'utilisation réel. Les règles d'évolution sont basées sur le «23/3» présenté sur Wikipédia, mais vous pouvez facilement les modifier en modifiant le code.

usage

>>> lg_map = lifegame.MapGenerator(map_init, periodic=False)
>>> lg_map.evolve()
array([...]) #Tableau de carte de 0e génération(= map_init)
>>> lg_map.evolve()
array([...]) #Tableau de carte de 1ère génération
>>> ...

lifegame.py

lifegame.py


import numpy as np
from itertools import product

class MapGenerator(object):
    def __init__(self, map_init, periodic=False):
        self.map_init  = np.array(map_init, np.int64)
        self.periodic  = periodic
        self.generator = self.map_evolver()

    def map_evolver(self):
        map_now   = self.map_init
        map_shape = self.map_init.shape

        while True:
            map_next = np.zeros_like(map_now, np.int64)
            for (i,j) in product(range(map_shape[0]), range(map_shape[1])):
                islive = bool(map_now[i,j])
                nlive  = self.num_live_neighbours(map_now, i, j)
                # write the rules of lifegame here!
                # ........................................
                if nlive == 2:
                    if islive: map_next[i,j] = 1
                elif nlive == 3:
                    map_next[i,j] = 1
                # ........................................

            yield map_now
            map_now = map_next

    def num_live_neighbours(self, map_now, i, j):
        if self.periodic:
            neighbours = np.roll(np.roll(map_now, -i+1, 0), -j+1, 1)[:3,:3]
        else:
            sl_i = slice(0,i+2) if i == 0 else slice(i-1,i+2)
            sl_j = slice(0,j+2) if j == 0 else slice(j-1,j+2)
            neighbours = map_now[sl_i,sl_j]

        return neighbours.sum() - map_now[i,j]

    def evolve(self):
        return self.generator.next()

Exemple de code utilisant matplotlib

Voici un exemple de code d'un type d'oscillateur appelé [Pulsar] [link02] qui évolue à l'infini sur une carte 15x15. Comme il ne s'agit que d'un échantillon, il semble qu'il soit limité par l'efficacité de dessin de matplotlib plutôt que par la vitesse de calcul du tableau ...

Exemple de code

pulsar.py


import time
import numpy as np
import matplotlib.pyplot as plt
import lifegame

pulsar = np.array([
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

lg_map = lifegame.MapGenerator(map_init=pulsar, periodic=False)
plt.ion()
while True:
    plt.pcolormesh(lg_map.evolve())
    plt.xlim([0, pulsar.shape[1]])
    plt.ylim([0, pulsar.shape[0]])
    plt.draw()
    plt.clf()
    time.sleep(0.05)

État du dessin

![lifegame-pulsar.png][link03]

Plans futurs?

Pour le moment, il est nécessaire de préparer à l'avance le tableau de la carte de la première génération dans le texte, donc je voudrais utiliser matplotlib.widgets pour que le tableau de la carte puisse être entré à partir de l'écran. C'est une pièce, donc il est indécis quand le faire (rires)

[link01]: http://ja.wikipedia.org/wiki/Life jeu [link02]: http://ja.wikipedia.org/wiki/Pulsar_ (jeu de la vie) [link03]: https://qiita-image-store.s3.amazonaws.com/0/44000/18e4ac52-9120-dae6-b683-8ca29cd1d507.png

Recommended Posts

Jeu de vie avec Python! (Le jeu de la vie de Conway)
Implémentation du jeu de vie en Python
Briller la vie avec Python et OpenCV
Premiers pas avec Python Bases de Python
Développement de jeux Othello avec Python
10 fonctions du "langage avec batterie" python
Implémentation de la méthode Dyxtra par python
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Etude de base d'OpenCV avec Python
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
Bases du traitement d'images binarisées par Python
[Exemple d'amélioration de Python] Apprentissage de Python avec Codecademy
Faisons un jeu de shiritori avec Python
Exécuter le script Python avec TS-220 cron
Vérifier l'existence du fichier avec python
Obstrué par la mise à jour Python de la console GCP ①
Introduction facile de la reconnaissance vocale avec Python
UnicodeEncodeError lutte avec la sortie standard de python3
1. Statistiques apprises avec Python 1-3. Calcul de diverses statistiques (statistiques)
Dessin avec Matrix-Reinventor of Python Image Processing-
Recommandation d'Altair! Visualisation des données avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un jeu rogue-like avec Python
Comparaison de la vitesse de transposition de la matrice par Python
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Jouez avec 2016-Python
Testé avec Python
Bases de python ①
Utile au quotidien!? Semi-automatisation de la méthode de planification expérimentale la plus puissante de COSPA avec Python
Copie de python
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Introduction de Python
Cast avec python
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
J'ai essayé des centaines de millions de SQLite avec python
Préparer l'environnement d'exécution de Python3 avec Docker
Fonctionnement automatique de Chrome avec Python + Sélénium + pandas
Comparaison des performances du détecteur de visage avec Python + OpenCV
[Python] axe limite du graphe 3D avec Matplotlib
Mathématiques Todai 2016 résolues avec Python
[Note] Exportez le html du site avec python.
Obstruction de la mise à jour python de la console GCP ② (Solution)