Dieses Mal habe ich Conways Spiel des Lebens anstelle einer numerischen Simulation gemacht.
Ich begann mit der Absicht, eine Pause zu machen, aber als ich es schaffte, war ich süchtig danach, also machte ich viel Versuch und Irrtum. Daher ist das fertige Produkt endlich in einer beweglichen Form. Wenn ich die Spezifikationen verstehe, denke ich, dass ich etwas besser machen könnte, aber ich hatte keine Lust, so viel zu lesen. .. ..
Zunächst eine kurze Erklärung der Lebensspiele. Ein Lebensspiel ist eine Art Zellautomat, der Informationen darüber enthält, dass die Gitterpunkte "lebendig" und "tot" sind. Wenn die Zeit (Generation) um eins voranschreitet, befindet sie sich gemäß den vorgegebenen Regeln entsprechend der Umgebungssituation im Inneren. Es ändert den Zustand von. In der Regel überleben Punkte in den umliegenden 8 Quadraten auf einem quadratischen Gitter, wenn 2 oder 3 am Leben sind, und wenn es 3 überlebende Gitterpunkte in der Umgebung gibt, werden sie neu geboren. Ich denke es gibt 3 etc. Da das Lebensspiel vollständig funktioniert, können Sie den Computer innerhalb des Lebensspiels reproduzieren. Für mehr Informationen
<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 =" Lebensspiel - Wikipedia: "> Lebensspiel - Wikipedia: Life Game World 1 [ Komplexes System] --Niko Niko Video: GINZA:
Bitte beziehen Sie sich auf. Das Video wird besonders empfohlen.
Ich wollte mit Tkinter ein Lebensspiel machen, aber es schien schwierig zu sein, also machte ich zuerst die Regeln des Lebensspiels, damit ich es auf dem Terminal überprüfen konnte.
Das ist der nächste.
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 = []
#Periodische Randbedingung
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]
#Beurteilung benachbarter Gitterpunkte
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))
#Gitter aktualisieren
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()
Die Ausgangsbedingung war, dass die Punkte unterhalb des Schwellenwerts in der Matrix, denen Zufallszahlen zugewiesen wurden, überlebten. Für die Anzeige konnte ich zuerst das Terminal löschen und die überlebenden Sites als ■ und die anderen Sites als □ drucken. Wenn die Verzögerungszeit kleiner als 0,1 ist, wird das Flimmern in meiner Umgebung schlimmer, so dass es anscheinend nicht schneller gemacht werden kann.
Ich mache also bitte ein Video
<img src = "https://i.ytimg.com/vi/7KMluy0fRq8/2.jpg " alt = "Einfach mit Python" Ich habe ein Lebensspiel (numpy) "border =" 0 "width =" 145 "height =" 109 "/> erstellt Ich habe ein einfaches Lebensspiel mit Python (numpy) gemacht
Als nächstes werde ich vorstellen, was ich mit Tkinter's Canvas gemacht habe. Das stickigste daran war, das "Leben" und den "Tod" jedes Gitters durch Klicken ändern zu können. Mit Pygame ist das vielleicht einfacher, und soweit ich sehen kann, habe ich nur Leute gesehen, die es benutzt haben. Ich denke jedoch, dass die Grundlagen dieselben sind, deshalb habe ich mich für Tkinter selbst entschieden, das ich weiterhin verwenden werde. Alle sind unten aufgeführt.
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 = []
#Periodische Randbedingung
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]
#Beurteilung benachbarter Gitterpunkte
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))
#Gitter aktualisieren
self.lattice[:] = False
for nextsite in nextsites:
self.lattice[nextsite] = True
#Zeichnungsaktualisierung
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
#Stirb langsam
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()
Der Unterschied zur vorherigen Datei lifegame_console.py besteht darin, dass LifeGame .__ init__ kleine Variablen verarbeitet, canvas_update auf eine andere Klasse Draw_canvas festgelegt ist und der Teil, der das Raster zeichnet, in eine andere Klasse Rect unterteilt ist. Infolgedessen kann jeder Gitterpunkt als unabhängiger behandelt werden. Wenn Sie auf den Gitterpunkt drücken, können Sie zwischen "Leben" und "Tod" wechseln. Bitte werfen Sie einen Blick auf die tatsächliche Ausführung (die zweite Hälfte dient nur dazu, der Codeverbindung zu folgen. Wenn Sie also nicht interessiert sind, können Sie sie überspringen).
<img src = "https://i.ytimg.com/vi/1M9sc5TlWQg/3.jpg " alt = "Leben mit Python" Ich habe ein Spiel [Tkinter] "border =" 0 "width =" 145 "height =" 109 "/> gemacht Ich habe ein Lebensspiel mit Python [Tkinter] gemacht
Dieses Mal spiele ich hauptsächlich, aber ich habe neue Dinge gelernt und ich denke, dass das Spektrum der Simulationen in Zukunft erweitert wird. Außerdem sollten Sie dem Video Untertitel und Erklärungen hinzufügen. .. .. Ich würde es gerne etwas mehr anfassen.
Recommended Posts