Implémentation du jeu de vie en Python

en premier

J'ai implémenté le programme en utilisant Pygame pour la première fois depuis longtemps. Cette fois, j'ai implémenté un jeu de vie un peu éloigné du jeu. (Le nom inclut un jeu, mais ce n'est pas un jeu, donc c'est sûr.) La difficulté de mise en œuvre n'est pas si élevée.

Qu'est-ce qu'un jeu de la vie?

Les jeux de la vie sont simplement des simulations de la vie. Vous pouvez observer comment les créatures naissent et meurent au fil du temps. Il n'y a que quelques règles dans les jeux de la vie, et le nombre de blocs appelés cellules est mis à jour en conséquence.

Règles du jeu de la vie

Les règles de mise à jour du jeu de vie sont divisées en naissance, survie et mort. La naissance, c'est quand une cellule est morte, une cellule qui vit dans une cellule adjacente est née, mais quand il y a trois nouvelles cellules qui vivent dans cette cellule naissent. D'autre part, une cellule vivante survit lorsque le nombre de cellules vivantes adjacentes est de 3 ou 4, et meurt à d'autres moments. La mort correspond ici au dépeuplement et à la surpopulation du monde réel. Ici, dans la figure ci-dessous, les règles de naissance, de survie, de mort (dépeuplement) et de mort (surpeuplement) sont appliquées à la cellule centrale à partir de la gauche, respectivement. Screenshot from 2019-11-09 00-49-25.png Vous êtes libre de décider du nombre de cellules dont vous avez besoin pour que la règle s'applique. Cette fois, j'ai utilisé le nombre expliqué ci-dessus, qui est souvent utilisé.

la mise en oeuvre

En gros, je l'ai implémenté comme expliqué. Il est important de noter que lors de la mise à jour des cellules, si elles sont mises à jour séquentiellement, les cellules peuvent mourir à la fois. Par conséquent, lors de la mise à jour d'une cellule, il est nécessaire de conserver une fois l'état de cellule mis à jour dans un autre emplacement et de le mettre à jour en une seule fois après l'obtention de tous les états mis à jour. (Je suis resté coincé quand j'ai implémenté le jeu de la vie pour la première fois) De plus, nous avons ajouté quelques fonctions cette fois.

Écran couleur

La plupart des jeux de la vie affichent des cellules dans une couleur, mais cette fois j'ai utilisé des cellules multicolores. Plus précisément, nous avons commencé avec quatre types de blanc, vert, rouge et bleu à l'état initial, et lorsque le processus de naissance est effectué, des cellules avec la couleur moyenne des cellules adjacentes naissent.

Entrée clé

Vous pouvez utiliser les touches fléchées pour avancer rapidement et ralentir le passage du temps, et utiliser les touches numériques pour initialiser à tout moment. Si la touche numérique initiale enfoncée est n, elle sera initialisée de sorte que le rapport de cellule soit n0%.

Organisme du programme

import pygame
from pygame.locals import *
import sys

display = [1010, 1010]
world_size = [100, 100]
num_key = [K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9]

class World:
    def __init__(self):
        self.speed = 1 #Vitesse de dessin
        self.world = np.zeros(tuple(world_size + [3]))
        self.color = np.asarray([[255.0, 255.0, 255.0], [255.0, 0.0, 0.0], [0.0, 255.0, 0.0], [0.0, 0.0, 255.0], [0.0, 0.0, 0.0]])
        
    #Drapeau initialisé au hasard=Si True, la couleur est également aléatoire
    def random_init(self, p, color_flag=False):
        for i in range(world_size[0]):
            for j in range(world_size[1]):
                if random.random() > p:
                    continue
                
                if color_flag:
                    color = self.color[random.randint(0, 3)]
                else:
                    color = self.color[0]
                self.world[i, j] = color
        
    def draw(self, screen):
        for i in range(world_size[0]):
            for j in range(world_size[1]):
                pygame.draw.rect(screen, tuple(self.world[i, j]), Rect(10*j + 10, 10*i + 10, 10, 10))
        
    def update(self):
        next_world = np.zeros(tuple(world_size + [3]))
        flags = self.world.sum(axis=2) > 0
        
        for i in range(world_size[0]):
            for j in range(world_size[1]):
                min_x = max(0, j-1)
                max_x = min(world_size[1], j+2)
                min_y = max(0, i-1)
                max_y = min(world_size[0], i+2)
                count = np.sum(flags[min_y:max_y, min_x:max_x])
                if flags[i, j] == 0: #Cellule morte
                    if count == 3: #naissance
                        area = self.world[min_y:max_y, min_x:max_x]
                        next_world[i, j] = area.reshape(-1, 3).sum(axis=0) / count
                else:
                    if 3 < count < 6: #pas dépeuplé ou surpeuplé
                        next_world[i, j] = self.world[i, j]
                        
        self.world = next_world

def main():
    pygame.init()
    screen = pygame.display.set_mode(display)
    pygame.display.set_caption("Lifegame")
    
    world = World()
    world.random_init(0.3, True)
    counter = 0
    
    while(1):
        screen.fill((0, 0, 0))
        
        world.draw(screen)
        pygame.display.update()
        pygame.time.wait(5)
        
        counter += 1
        if counter > world.speed:
            world.update()
            counter = 0

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()      
                if event.key == K_DOWN:
                    world.speed = world.speed+1
                if event.key == K_UP:
                    world.speed = max(0, world.speed-1)
                if event.key in num_key:
                    world.random_init((num_key.index(event.key)+1.0)*0.1, True)
                
if __name__ == "__main__":
    main()

C'est beaucoup plus court que le dernier Tetris.

Écran de sortie

Cela ressemble à une tempête de sable. Le taux de cellules est de 30%. Screenshot from 2019-11-09 01-05-36.png Un certain temps s'est écoulé. Je sens que le mélange des couleurs (accouplement) progresse bien. Screenshot from 2019-11-09 01-05-56.png Comme prévu, il existe de nombreuses couleurs sales qui survivent en fin de vie. Il semble que le mélange de couleurs ait beaucoup progressé. Au début, il y en avait tellement. Screenshot from 2019-11-09 01-06-02.png

en conclusion

C'est la fin de la mise en œuvre du jeu de vie. Pour dire la vérité, je voulais ajouter un peu plus de fonctionnalités, mais j'ai abandonné car la vitesse de traitement de Python était suspecte. Peut-être que je le réimplémenterai en utilisant C ++. à la prochaine

Recommended Posts

Implémentation du jeu de vie en Python
Implémentation du tri rapide en Python
Jeu de vie avec Python! (Le jeu de la vie de Conway)
Implémentation du tri original en Python
Implémentation ValueObject en Python
Implémentation SVM en python
Explication de la distance d'édition et de l'implémentation en Python
Jugement d'équivalence d'objet en Python
Mise en œuvre de la théorie des jeux - Le dilemme du prisonnier -
Implémentation Python du filtre à particules
Implémentation de réseau neuronal en python
Implémentation d'estimation la plus probable du modèle de sujet en python
Implémentation d'estimation bayésienne de variante du modèle de sujet en python
Un mémorandum sur la mise en œuvre des recommandations en Python
Manipulation des pixels d'image en Python
Algorithme de tri et implémentation en Python
Implémentation de l'estimation des paramètres HMM en python
Implémentation Python du filtre à particules auto-organisateur
Implémentation de distribution normale mixte en python
Implémentation de la fonction de connexion dans Django
Diviser timedelta dans la série Python 2.7
Échappement automatique des paramètres MySQL en python
Gestion des fichiers JSON en Python
Affichage de la forme d'onde audio en Python
Implémentation des notifications de bureau à l'aide de Python
Implémentation Python de l'arborescence de segments non récursive
Implémentation de Light CNN (Python Keras)
La loi des nombres en python
Etude, jeu de numérotation avec Python
Implémentation de la méthode Dyxtra par python
Brouillage réversible d'entiers en Python
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
Conversion de la chaîne <-> date (date, datetime) en Python
Pratique d'utilisation de ceci en Python (mauvais)
Théorie générale de la relativité en Python: Introduction
Arborescence de sortie des fichiers en Python
Afficher une liste d'alphabets en Python 3
Module d'implémentation de file d'attente et Python "deque"
Comparaison des modules de conversion japonais en Python3
C'est une implémentation de ConnectionPool dans redis.py
Résumé de diverses instructions for en Python
Le résultat de l'installation de python sur Anaconda
Modèles Gang of Four (GoF) en Python
Principes de base pour exécuter NoxPlayer en Python
Remplacement en bloc des chaînes dans les tableaux Python
Projet Euler # 16 "Somme des pouvoirs" en Python
Traffic Safety-kun: Reconnaissance des panneaux de signalisation en Python
Résumé des méthodes intégrées, etc. de la liste Python
Utilisation d'opérateurs non logiques de ou en python
À la recherche du FizzBuzz le plus rapide en Python
Exemple pratique d'architecture hexagonale en Python
Projet Euler # 17 "Nombre de caractères" en Python
Equation de mouvement à double pendule en python
Débarrassez-vous des images DICOM en Python
Implémentation Python du modèle Markov caché continu
Statut de chaque système de traitement Python en 2020
Projet Euler # 1 "Multiple de 3 et 5" en Python