Après avoir suivi le cours Python de Paiza, alors que je cherchais quoi faire sur google, comment créer un jeu de vie en [Python à partir de zéro] de My Navi News (https://news.mynavi.jp/article/zeropython- Puisqu'il y avait 9 /), j'ai essayé de faire un jeu de vie à mettre à jour manuellement en référence à celui-ci.
Une fois exécuté, l'écran noir suivant apparaîtra,
Cliquez pour placer ou annuler des cellules. Voici l'arrangement appelé [Pentadecaslon]
Mises à jour chaque fois que vous appuyez sur la touche [Entrée].
La disposition du [Pentadécaslon] se répète à intervalles réguliers et ne périt pas, En ajoutant une cellule au milieu, L'équilibre est perdu et une nouvelle forme est créée.
import tkinter as tk
WIDTH, HEIGHT = 600, 400 #Taille de la toile
cell = {'size': 20, 'color': 'green'} #Informations sur la cellule
COLS, ROWS = WIDTH//cell['size'], HEIGHT//cell['size'] #Nombre de colonnes et de lignes de Canvas
data = [[False for x in range(COLS)] for y in range(ROWS)] #Existence de cellule
win = tk.Tk()
win.title('LifeGame')
#Nombre de mises à jour de génération
text = tk.StringVar() #Variable de widget contenant la chaîne
update = 0 #Valeur initiale du nombre de mises à jour
text.set(update) #Définir le nombre de mises à jour
label = tk.Label(win, textvariable=text, font=('IPAex Gothic', '24'))
label.pack()
#Paramètres du canevas
cv = tk.Canvas(win, width=WIDTH, height=HEIGHT, bg='black')
cv.pack()
#Tracez des lignes dans une grille pour faciliter l'organisation des cellules
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')
#Placez et annulez des cellules d'un simple clic de souris
def place_cells(e):
draw_grid()
#Calculez l'index pour dessiner la cellule à partir des coordonnées cliquées
x, y = e.x // cell['size'], e.y // cell['size']
#Supprimez la cellule qui a déjà été dessinée.
if data[y][x]:
cv.delete('current')
data[y][x] = False
#Dessinez une cellule.
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) #Lorsque vous cliquez sur Canvas
#Le sort de la prochaine génération est déterminé par le nombre de cellules vivantes autour de vous
def check_cells(x, y):
#Coordonnées relatives des cellules environnantes
tbl = [(-1, -1), (0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0)]
cnt = 0 #Nombre de cellules vivantes autour
#Vérifiez les cellules environnantes une par une
for t in tbl:
xx, yy = x + t[0], y + t[1] #Calculez la valeur absolue des cellules environnantes.
if not 0 <= xx < COLS or not 0 <= yy < ROWS:
continue
if data[yy][xx]:
cnt += 1 #Comptez si les cellules environnantes sont vivantes.
if cnt == 3:
return True #naissance
if data[y][x]: #Si tu es vivant
if 2 <= cnt <= 3:
return True #Survie
return False #Surpeuplé et dépeuplé
return data[y][x] #maintenir le statut quo
#Découvrez le sort de la prochaine génération de cellules.
def next_turn(e):
global data
global update
#Sauvegardez les données mises à jour à 1 heure
data2 = [[check_cells(x, y) for x in range(COLS)] for y in range(ROWS)]
data = data2 #Mettre à jour les données
update += 1 #Comptez le nombre de mises à jour
text.set(update) #Mettre à jour le nombre de générations
draw()
win.bind('<Return>', next_turn) #Lorsque vous appuyez sur Entrée
#Dessinez une cellule.
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()
Les jeux de la vie semblent avoir différents modèles. 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