J'ai fait un jeu d'éclairage de sapin de Noël avec Python

Ce que j'ai fait

xmastree_s.gif

environnement

Python 3.6.8 on linux Paquets dépendants: PIL (Pillow 5.1.0)

Code source

Il est disponible sur GitHub. Seuls les points seront présentés ci-dessous.

Points de création de l'interface utilisateur

Affichage de l'image

Utilisez les modules Image et ImageTk du package PIL pour afficher les images PNG. Tout d'abord, je charge un ensemble d'images avec ʻImage.open () . La raison de resize ()` est que je veux le déplacer sur l'écran tactile de Raspeye à l'avenir, afin que je puisse modifier la taille d'affichage de manière flexible.

app_tk.py


IMG_STAR_OFF = Image.open('image/star_off.png').resize(STAR_SIZE, Image.BILINEAR)
IMG_STAR_ON = Image.open('image/star_on.png').resize(STAR_SIZE, Image.BILINEAR)

L'image chargée est affichée sur le canevas de Tkinter. À ce stade, utilisez le constructeur PhotoImage (). Il semble que l'objet PhotoImage doit être conservé. Il n'était pas affiché lors de l'utilisation d'une variable locale. La valeur de retour de create_image () est l'ID de l'objet sur le canevas. Vous en aurez besoin pour changer d'images ou afficher des animations de rotation pendant le jeu.

app_tk.py


self.canvas = tk.Canvas(self, width=w, height=h)
self.star_img = ImageTk.PhotoImage(IMG_STAR_ON)
self.star_id = self.canvas.create_image(STAR_OFFSET_X,
                                        STAR_OFFSET_Y,
                                        image=self.star_img,
                                        anchor=tk.NW)

Pour changer l'image, créez une nouvelle PhotoImage et utilisez le canevas ʻitemcomfigure () `.

app_tk.py


if tree.is_complete():
    self.star_img = ImageTk.PhotoImage(IMG_STAR_ON)
else:
    self.star_img = ImageTk.PhotoImage(IMG_STAR_OFF)
self.canvas.itemconfigure(self.star_id, image=self.star_img)

Animation de rotation

Il n'existe pas de méthode d'animation dans Tkinter, vous pouvez donc mettre à jour l'image régulièrement pour réaliser l'animation. Pour appeler périodiquement le processus, vous pouvez utiliser ʻafter () `, qui est une méthode courante du widget de Tkinter.

app_tk.py


def rotate_cell(self, x, y):
    info = self.img_info[x][y]
    info.angle -= 15   #Rotation de 15 degrés
    info.photo_img = ImageTk.PhotoImage(info.img.rotate(info.angle))   #Créer une image photo pivotée
    self.canvas.itemconfigure(info.id, image = info.photo_img)   #Remplacer l'image
    if info.angle % 90 == 0:
        #Animation terminée
        #Processus de mise à jour de l'état du jeu, etc.
    else:
        self.after(15, self.rotate_cell, x, y)   #Mettre à jour l'image à nouveau après 15 millisecondes

Placer le widget sur le canevas

Vous pouvez placer un widget avec la méthode create_window () du canevas. Utilisez Frame si vous souhaitez gérer plusieurs widgets à la fois.

app_tk.py


frame = tk.Frame(self, bg='#e5f8cf', padx=5)
start = tk.Button(frame, text='Start', command=self.start_new_game,
                  fg='#345834', font=('', 22, 'bold'))
start.pack(side=tk.LEFT, padx=5, pady=10)
self.counter_text = tk.StringVar()
self.counter_text.set('00:00')
self.counter_label = tk.Label(frame, textvariable=self.counter_text,
                              bg='#e5f8cf', fg='#345834',
                              font=('', 22, 'bold'))
self.counter_label.pack(side=tk.LEFT, padx=5, pady=10)
self.canvas.create_window(20, 20, window=frame, anchor=tk.NW)

Cliquez sur l'événement sur la toile

Assignez une méthode de rappel avec bind (). L'événement est passé en tant qu'argument à la méthode de rappel et vous pouvez obtenir les coordonnées où l'événement de clic s'est produit dans .x, .y.

app_tk.py


self.canvas.bind('<ButtonRelease-1>', self.on_click_canvas)

def on_click_canvas(self, event):
    # event.x, event.Obtenez des coordonnées avec y
    x = (event.x - TREE_OFFSET_X) // CELL_LENGTH
    y = (event.y - TREE_OFFSET_Y) // CELL_LENGTH
    #En traitement

Algorithme de labyrinthe

Le chemin électrique peut être décrit comme un labyrinthe commençant à la base de l'arbre. Il existe différents algorithmes pour créer un labyrinthe, mais je l'ai fait à ma manière. Pour faire simple, l'algorithme est le suivant.

Je pense que nous allons faire un parcours de labyrinthe en reliant les carrés du papier carré.

  1. Marquez la cellule de départ comme utilisée.
  2. Répertoriez toutes les combinaisons de cellules utilisées et de cellules inutilisées adjacentes.
  3. Sélectionnez-en une au hasard dans la liste, connectez les cellules sélectionnées avec un passage et marquez les cellules sélectionnées comme utilisées. ..
  4. Répétez 2-3 jusqu'à ce que toutes les cellules soient épuisées.

Cela ressemble à ceci lorsque vous faites une vidéo de la façon dont le labyrinthe est terminé.

tree_build.gif

prime

Je voulais jouer un BGM de Noël, et quand j'ai cherché comment lire un fichier mp3 avec Python, j'ai découvert qu'il y avait un Pygame. Bien sûr, il semble que vous puissiez également afficher des images, alors j'aurais peut-être dû l'utiliser depuis le début ...

Recommended Posts

J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un jeu de cueillette avec Python
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
〇✕ J'ai fait un jeu
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
Made Mattermost Bot avec Python (+ Flask)
J'ai fait un blackjack avec du python!
J'ai fait un texte Python
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai fait un jeu mono tombé avec Sense HAT
J'ai fait un Line-bot avec Python!
Développement de jeux Othello avec Python
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
Faisons un jeu de shiritori avec Python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
J'ai fait un programme de gestion de la paie en Python!
J'ai dessiné une carte thermique avec Seaborn [Python]
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
Classique de Noël (?) Éclairage d'un arbre de Noël avec Raspberry Pi et Philips Hue
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
J'ai essayé un langage fonctionnel avec Python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
Ce que j'ai fait avec les tableaux Python
J'ai fait un générateur Hanko avec GAN
Après avoir étudié Python3, j'ai créé un Slackbot
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
J'ai fait une application WEB avec Django
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
J'ai fait un robot de remplacement de tampon avec une ligne