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. .. ..
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.
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)
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]
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