[PYTHON] Créez un jeu de vie mis à jour manuellement avec tkinter

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, image.png

Cliquez pour placer ou annuler des cellules. Voici l'arrangement appelé [Pentadecaslon] image.png

Mises à jour chaque fois que vous appuyez sur la touche [Entrée]. image.png

La disposition du [Pentadécaslon] se répète à intervalles réguliers et ne périt pas, En ajoutant une cellule au milieu, image.png L'équilibre est perdu et une nouvelle forme est créée. image.png

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 image.png

Recommended Posts

Créez un jeu de vie mis à jour manuellement avec tkinter
[Fiche d'apprentissage] Créez un mystérieux jeu de donjon avec Pyhton's Tkinter
Créer une application graphique avec Tkinter de Python
J'ai fait un jeu de vie avec Numpy
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
Créer un fichier exécutable GUI créé avec tkinter
Créez une interface utilisateur de jeu à partir de zéro avec pygame2!
Créer une page qui se charge indéfiniment avec python
Créer une matrice avec PythonGUI (combo tkinter)
Créer une fausse classe qui triche également est une instance
Créez une application graphique native avec Py2app et Tkinter
Essayez de créer un Checkbutton dynamiquement avec Tkinter en Python
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
Je souhaite créer manuellement une légende avec matplotlib
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Créez une PythonBox qui sort avec Random après l'entrée PEPPER
[Python] Créez un écran de spécification de chemin de fichier et de dossier avec tkinter
Générez un mot de passe facile à retenir avec apg
Créons un script qui s'enregistre avec Ideone.com en Python.
Créer une page d'accueil avec django
Créer une visionneuse d'images avec Tkinter
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez une API Web capable de fournir des images avec Django
Créer un répertoire avec python
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
Créez un programme qui peut générer votre image préférée avec Selenium
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
[Python] Qu'est-ce qu'une instruction with?
Créer une interface graphique python à l'aide de tkinter
Créez un environnement virtuel avec Python!
Jeu de vie avec Python! (Le jeu de la vie de Conway)
Zura fait comme un jeu de la vie
Créez un stepper de poisson avec numpy.random
Créer un téléchargeur de fichiers avec Django
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
Créez une application Web qui peut être facilement visualisée avec Plotly Dash
Créer un décorateur de fonction Python avec Class
[Python] Un programme qui crée des escaliers avec #
Faisons un jeu de shiritori avec Python
Créez une image factice avec Python + PIL.
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Créer un gros fichier texte avec shellscript
Créez un système stellaire avec le script Blender 2.80
Créer une machine virtuelle avec un fichier YAML (KVM)
Créez une application Web simple avec Flask
Créer un nouveau dict qui combine des dictés
Créer un compteur de fréquence de mots avec Python 3.4
Vivez une vie Twitter sans saisie avec Alexa
[Python] Créez un LineBot qui s'exécute régulièrement
Créer un voisin le plus proche de connexion avec NetworkX