Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)

Cette fois, j'ai créé Game of Life de Conway au lieu d'une simulation numérique.

J'ai commencé avec l'intention de faire une pause, mais quand je l'ai fait, j'en étais accro, alors j'ai fait beaucoup d'essais et d'erreurs. Par conséquent, le produit fini a finalement une forme mobile. Si j'ai compris les spécifications, je pense que je pourrais faire quelque chose de mieux, mais je n'avais pas envie de lire autant. .. ..

Life Game_007

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

Tout d'abord, une brève explication des jeux de la vie. Un jeu de vie est un type d'automate cellulaire qui a des informations selon lesquelles les points de la grille sont "vivants" et "morts", et lorsque le temps (génération) avance d'un, il est à l'intérieur selon les règles données en fonction de la situation environnante. Cela change l'état de. En règle générale, en ce qui concerne les points dans les 8 carrés environnants sur une grille carrée, si 2 ou 3 sont vivants, ils survivront, et s'il y a 3 points de grille survivants dans les environs, ils seront nouvellement nés. Je pense qu'il y en a 3 etc. Puisque le jeu de la vie est complètement tuuring, vous pouvez reproduire l'ordinateur dans le jeu de la vie. Pour plus d'informations

<a href = "http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3% 83% A0 "target =" _ blank "title =" Life Game --Wikipedia: "> Life Game --Wikipedia: <a href="http://www.nicovideo.jp/watch/sm19347846" target="_blank" title="Life Game World 1 [Système complexe. Système complexe] - Vidéo de Niko Niko: GINZA:

Prière de se référer à. La vidéo est particulièrement recommandée.

Jeu de vie sur le terminal

Je voulais faire un jeu de vie en utilisant Tkinter, mais cela me semblait difficile, alors j'ai d'abord défini les règles du jeu de vie pour pouvoir le vérifier sur le terminal.

C'est le suivant.

lifegame_console.py


#! /usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, June 2014.

import numpy as np
import sys
import time
import os

class LifeGame:

    def __init__(self, L=50, rule="2 3/3"):
        self.L = L # lattice size
        p = 0.2
        self.survive = [int(i) for i in rule.split("/")[0].split()]
        self.birth = [int(i) for i in rule.split("/")[1].split()]
        lattice = np.random.random([self.L+2, self.L+2])
        self.lattice = lattice<p
        self.lattice[0,:] = self.lattice[self.L+1,:] = False
        self.lattice[:,0] = self.lattice[:,self.L+1] = False

    def canvas_update(self):
        os.system("clear")
        print "\n"
        l = ""
        for y in range(1,self.L+1):
            for x in range(1,self.L+1):
                if self.lattice[x,y]:
                    l += u" ■"
                else:
                    l += u" □"
            l += "\n"
        print l
        print "\n"
        time.sleep(0.1)
                
    def progress(self):
        L = self.L
        Tmax = 2000
        t = 0
        while t < Tmax:
            try:
                self.canvas_update()
                nextsites = []
                
                #Condition aux limites périodique
                self.lattice[0,0] = self.lattice[self.L,self.L]
                self.lattice[0,self.L+1] = self.lattice[self.L,1]
                self.lattice[self.L+1,0] = self.lattice[1,self.L]
                self.lattice[self.L+1,self.L+1] = self.lattice[1,1]
                for m in range(1, self.L+1):
                    self.lattice[m, self.L+1] = self.lattice[m, 1]
                    self.lattice[m, 0] = self.lattice[m, self.L]
                    self.lattice[0, m] = self.lattice[self.L, m]
                    self.lattice[self.L+1, m] = self.lattice[1, m]
                
                #Jugement des points de grille adjacents
                for m in range(1,self.L+1):
                    for n in range(1,self.L+1):
                        
                        if self.lattice[m,n]:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])-1
                            if neighber in self.survive:
                                nextsites.append((m,n))
                        else:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])
                            if neighber in self.birth:
                                nextsites.append((m,n))
                                
                #Mettre à jour le treillis
                self.lattice[:] = False
                for nextsite in nextsites:
                    self.lattice[nextsite] = True
                
                t += 1
                
            except KeyboardInterrupt:
                print "stopped."
                break

if __name__ == '__main__':
    
    lg = LifeGame()
    lg.progress()

La condition initiale était que les points sous le seuil de la matrice auxquels les nombres aléatoires étaient attribués survivent. Pour l'affichage, j'ai réussi à effacer le terminal en premier et à imprimer les sites survivants en tant que ■ et les autres sites en tant que □. Si le temps de retard est inférieur à 0,1, le scintillement s'aggrave dans mon environnement, il semble donc qu'il ne peut pas être accéléré.

Je fais une vidéo alors s'il te plaît

<img src = "https://i.ytimg.com/vi/7KMluy0fRq8/2.jpg " alt = "Facile avec Python" J'ai créé un jeu de la vie (numpy) "border =" 0 "width =" 145 "height =" 109 "/> J'ai fait un jeu de vie simple avec Python (numpy)

Affichage à l'aide de Tkinter

Ensuite, je présenterai ce que j'ai réalisé avec le Canvas de Tkinter. La chose la plus étouffante de faire ceci était de pouvoir changer la «vie» et la «mort» de chaque grille en cliquant. C'est peut-être plus facile de le faire avec Pygame, et d'après ce que j'ai enquêté, je n'ai vu que des gens l'utiliser. Cependant, je pense que les bases sont les mêmes, j'ai donc décidé d'utiliser Tkinter lui-même, que je continuerai à utiliser. Tous sont listés ci-dessous.

lifegame.py


#! /usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, September 2014.

from tkinter import *
import numpy as np
import sys
# import time


class LifeGame:

    def __init__(self, L=30, rule="2 3/3", p=None, pattern=None):
        self.L = L  # lattice size
        self.survive = [int(i) for i in rule.split("/")[0].split()]
        self.birth = [int(i) for i in rule.split("/")[1].split()]

        if p:
            lattice = np.random.random([self.L + 2, self.L + 2])
            self.lattice = lattice < p
            self.lattice[0, :] = self.lattice[self.L+1, :] = False
            self.lattice[:, 0] = self.lattice[:, self.L + 1] = False
        else:
            self.lattice = np.zeros([self.L + 2, self.L + 2], dtype=bool)
            if pattern:
                for x, y in pattern:
                    self.lattice[x, y] = True

    def progress(self, canvas_update, update):
        Tmax = 2000
        t = 0
        self.loop = True
        while self.loop:
            try:
                past_lattice = self.lattice.copy()

                nextsites = []

                #Condition aux limites périodique
                self.lattice[0, 0] = self.lattice[self.L, self.L]
                self.lattice[0, self.L + 1] = self.lattice[self.L, 1]
                self.lattice[self.L + 1, 0] = self.lattice[1, self.L]
                self.lattice[self.L + 1, self.L + 1] = self.lattice[1, 1]
                for m in range(1, self.L+1):
                    self.lattice[m, self.L+1] = self.lattice[m, 1]
                    self.lattice[m, 0] = self.lattice[m, self.L]
                    self.lattice[0, m] = self.lattice[self.L, m]
                    self.lattice[self.L+1, m] = self.lattice[1, m]

                #Jugement des points de grille adjacents
                for m in range(1, self.L + 1):
                    for n in range(1, self.L + 1):

                        if self.lattice[m, n]:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])-1
                            if neighber in self.survive:
                                nextsites.append((m, n))
                        else:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])
                            if neighber in self.birth:
                                nextsites.append((m, n))

                #Mettre à jour le treillis
                self.lattice[:] = False
                for nextsite in nextsites:
                    self.lattice[nextsite] = True

                #Mise à jour du dessin
                changed_rect = np.where(self.lattice != past_lattice)
                for x, y in zip(changed_rect[0], changed_rect[1]):
                    if self.lattice[x, y]:
                        color = "green"
                    else:
                        color = "black"
                    canvas_update(x, y, color)
                update()
               # time.sleep(0.1)

                t += 1
                if t > Tmax:
                    self.loop = False

            except KeyboardInterrupt:
                print("stopped.")
                break


class Draw_canvas:

    def __init__(self, lg, L):

        self.lg = lg
        self.L = L
        default_size = 640  # default size of canvas
        self.r = int(default_size / (2 * self.L))
        self.fig_size = 2 * self.r * self.L
        self.margin = 10
        self.sub = Toplevel()
        self.sub.title("Life Game")
        self.canvas = Canvas(self.sub, width=self.fig_size + 2 * self.margin,
                             height=self.fig_size + 2 * self.margin)
        self.c = self.canvas.create_rectangle
        self.update = self.canvas.update
        self.rects = dict()
        for y in range(1, self.L + 1):
            for x in range(1, self.L + 1):
                if self.lg.lattice[x, y]:
                    live = True
                else:
                    live = False
                tag = "%d %d" % (x, y)
                self.rects[tag] = Rect(x, y, live, tag, self)
        self.canvas.pack()

    def canvas_update(self, x, y, color):
        v = self.rects["%d %d" % (x, y)]
        v.root.canvas.itemconfig(v.ID, fill=color)


class Rect:

    def __init__(self, x, y, live, tag, root):
        self.root = root
        self.x = x
        self.y = y
        self.live = bool(live)
        if live:
            color = "green"
        else:
            color = "black"
        self.ID = self.root.c(2*(x-1)*self.root.r + self.root.margin,
                              2*(y-1)*self.root.r + self.root.margin,
                              2*x*self.root.r + self.root.margin,
                              2*y*self.root.r + self.root.margin,
                              outline="#202020", fill=color, tag=tag)
        self.root.canvas.tag_bind(self.ID, '<Button-1>', self.pressed)

    def pressed(self, event):
        if self.live:
            self.live = False
            color = "black"
        else:
            self.live = True
            color = "green"
        self.root.lg.lattice[self.x, self.y] = self.live
        self.root.canvas.itemconfig(self.ID, fill=color)


class TopWindow:

    def show_window(self, title="title", *args):
        self.root = Tk()
        self.root.title(title)
        frames = []
        for i, arg in enumerate(args):
            frames.append(Frame(self.root, padx=5, pady=5))
            for k, v in arg:
                Button(frames[i], text=k, command=v).pack(expand=YES, fill='x')
            frames[i].pack(fill='x')
        self.root.mainloop()


class Main:

    def __init__(self):
        L = 100
        rule = "2 3/3"
        self.top = TopWindow()
        c = L / 2
        #Mourir dur
        pattern = [(c-1, c+1), (c, c+1), (c, c+2), (c+4, c+2),
                   (c+5, c), (c+5, c+2), (c+6, c+2)]

        self.lg = LifeGame(L, rule, p=None, pattern=pattern)
        self.top.show_window("Life game", (('set', self.init),),
                             (('start', self.start),
                              ('pause', self.pause)),
                             (('save', self.pr),),
                             (('quit', self.quit),))

    def init(self):
        self.DrawCanvas = Draw_canvas(self.lg, self.lg.L)

    def start(self):
        self.lg.progress(self.DrawCanvas.canvas_update, self.DrawCanvas.update)

    def pause(self):
        self.lg.loop = False

    def pr(self):
        import tkinter.filedialog
        import os
        if self.DrawCanvas is None:
            return 1
        fTyp = [('eps file', '*eps'), ('all files', '*')]
        filename = tkinter.filedialog.asksaveasfilename(filetypes=fTyp,
                                                  initialdir=os.getcwd(),
                                                  initialfile='figure_1.eps')
        if filename is None:
            return 0
        self.DrawCanvas.canvas.postscript(file=filename)

    def quit(self):
        self.pause()
        sys.exit()

if __name__ == '__main__':

    app = Main()

La différence avec le lifegame_console.py précédent est que LifeGame .__ init__ gère de petites variables, canvas_update est défini sur une autre classe Draw_canvas et la partie qui dessine la grille est divisée en une autre classe Rect. En conséquence, chaque point de grille peut être traité comme un point indépendant, et si vous appuyez sur le point de grille, vous pouvez basculer entre «vie» et «mort». J'ai capturé l'exécution réelle, alors jetez un œil (la seconde moitié est juste pour suivre la connexion du code, donc si vous n'êtes pas intéressé, vous pouvez l'ignorer).

<img src = "https://i.ytimg.com/vi/1M9sc5TlWQg/3.jpg " alt = "La vie avec Python" J'ai créé un jeu [Tkinter] "border =" 0 "width =" 145 "height =" 109 "/> J'ai fait un jeu de vie avec Python [Tkinter]

Résumé

Cette fois, je joue principalement, mais j'ai appris de nouvelles choses et je pense que la gamme de simulations à l'avenir s'élargira. Vous devez également ajouter des sous-titres et des explications à la vidéo. .. .. J'aimerais y toucher un peu plus.

Recommended Posts

Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un jeu rogue-like avec Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai essayé de jouer avec la calculatrice avec tkinter
J'ai fait un jeu de cueillette avec Python
J'ai fait quelque chose avec python qui NOW LOADING se déplace de gauche à droite sur le terminal
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai fait un blackjack avec du python!
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
[Python] J'ai installé le jeu depuis pip et j'ai essayé de jouer
[Je l'ai fait avec Python] Outil pour la sortie par lots de données XML
J'ai fait une loterie avec Python.
Développement de jeux Othello avec Python
Jeu de vie avec Python! (Le jeu de la vie de Conway)
J'ai aimé le tweet avec python. ..
J'ai créé un démon avec Python
CUM_plot, que je vois souvent sur le site de fabrication, n'est pas tombé sur le net, donc je l'ai fait avec python
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai fait un compteur de caractères avec Python
Télécharger des fichiers sur le Web avec Python
J'ai fait une carte hexadécimale avec Python
[Python] Une barre de progression sur le terminal
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
Je veux tweeter Twitter avec Python, mais j'y suis accro
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
[Python] J'ai analysé le journal d'un homme au cours de sa première année de vie professionnelle et j'ai fait un jugement positif / négatif sur la vie professionnelle.
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de "différencier" l'image avec Python + OpenCV
Outil de rognage d'image GUI réalisé avec Python + Tkinter
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
Introduction à Python avec Atom (en route)
Made Mattermost Bot avec Python (+ Flask)
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Je n'ai pas pu importer le module python avec VSCODE, mais je pouvais le faire sur jupyterlab, j'ai donc recherché la cause (2)
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
〇✕ J'ai fait un jeu
Coordonnées les plus à droite de l'étiquette faite avec tkinter
J'ai essayé Python sur Mac pour la première fois.