Nachdem ich nach Paizas Python-Kurs gesucht hatte, was ich bei Google machen sollte, wie man ein Lebensspiel in [Python ab Null] von My Navi News (https://news.mynavi.jp/article/zeropython-) erstellt. Da es 9 /) gab, habe ich versucht, ein Lebensspiel manuell zu aktualisieren, indem ich darauf Bezug genommen habe.
Bei der Ausführung wird der folgende schwarze Bildschirm angezeigt:
Klicken Sie hier, um Zellen zu platzieren oder abzubrechen. Das Folgende ist die Anordnung namens [Pentadecaslon]
Wird jedes Mal aktualisiert, wenn die [Eingabetaste] gedrückt wird.
Die Anordnung von [Pentadecaslon] wiederholt sich in regelmäßigen Abständen und geht nicht zugrunde, Durch Hinzufügen einer Zelle in der Mitte Das Gleichgewicht geht verloren und eine neue Form entsteht.
import tkinter as tk
WIDTH, HEIGHT = 600, 400 #Leinwandgröße
cell = {'size': 20, 'color': 'green'} #Zellinformationen
COLS, ROWS = WIDTH//cell['size'], HEIGHT//cell['size'] #Anzahl der Spalten und Zeilen von Canvas
data = [[False for x in range(COLS)] for y in range(ROWS)] #Existenz der Zelle
win = tk.Tk()
win.title('LifeGame')
#Anzahl der Generierungsaktualisierungen
text = tk.StringVar() #Widget-Variable, die die Zeichenfolge enthält
update = 0 #Anfangswert der Aktualisierungsanzahl
text.set(update) #Legen Sie die Anzahl der Updates fest
label = tk.Label(win, textvariable=text, font=('IPAex Gothic', '24'))
label.pack()
#Canvas-Einstellungen
cv = tk.Canvas(win, width=WIDTH, height=HEIGHT, bg='black')
cv.pack()
#Zeichnen Sie Linien in einem Raster, um das Anordnen von Zellen zu vereinfachen
def draw_grid():
for x in range(COLS):
x1 = x * cell['size']
cv.create_line(x1, 0, x1, HEIGHT, fill='white')
for y in range(ROWS):
y1 = y * cell['size']
cv.create_line(0, y1, WIDTH, y1, fill='white')
#Platzieren und löschen Sie Zellen mit einem Mausklick
def place_cells(e):
draw_grid()
#Berechnen Sie den Index, um die Zelle aus den angeklickten Koordinaten zu zeichnen
x, y = e.x // cell['size'], e.y // cell['size']
#Löschen Sie die bereits gezeichnete Zelle.
if data[y][x]:
cv.delete('current')
data[y][x] = False
#Zeichne eine Zelle.
else:
x1, y1 = x * cell['size'], y * cell['size']
cv.create_oval(x1, y1, x1+cell['size'], y1+cell['size'], fill=cell['color'])
data[y][x] = True
cv.bind('<Button>', place_cells) #Wenn Canvas angeklickt wird
#Das Schicksal der nächsten Generation hängt davon ab, wie viele Zellen um Sie herum leben
def check_cells(x, y):
#Relative Koordinaten der umgebenden Zellen
tbl = [(-1, -1), (0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0)]
cnt = 0 #Anzahl lebender Zellen
#Überprüfen Sie die umgebenden Zellen nacheinander
for t in tbl:
xx, yy = x + t[0], y + t[1] #Berechnen Sie den absoluten Wert der umgebenden Zellen.
if not 0 <= xx < COLS or not 0 <= yy < ROWS:
continue
if data[yy][xx]:
cnt += 1 #Zählen Sie, ob die umgebenden Zellen leben.
if cnt == 3:
return True #Geburt
if data[y][x]: #Wenn du lebst
if 2 <= cnt <= 3:
return True #Überleben
return False #Überfüllt und entvölkert
return data[y][x] #Behalten Sie den Status Quo bei
#Finden Sie das Schicksal der nächsten Generation von Zellen heraus.
def next_turn(e):
global data
global update
#Speichern Sie die aktualisierten Daten um 1 Uhr
data2 = [[check_cells(x, y) for x in range(COLS)] for y in range(ROWS)]
data = data2 #Daten aktualisieren
update += 1 #Zählen Sie die Anzahl der Updates
text.set(update) #Aktualisieren Sie die Anzahl der Generationen
draw()
win.bind('<Return>', next_turn) #Wenn die Eingabetaste gedrückt wird
#Zeichne eine Zelle.
def draw():
cv.delete('all')
for y in range(ROWS):
for x in range(COLS):
if data[y][x]:
x1, y1 = x * cell['size'], y * cell['size']
cv.create_oval(x1, y1, x1+cell['size'], y1+cell['size'], fill=cell['color'])
win.mainloop()
Lebensspiele scheinen verschiedene Muster zu haben. https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0
Recommended Posts