Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht

Was ich gemacht habe

xmastree_s.gif

Umgebung

Python 3.6.8 on linux Abhängige Pakete: PIL (Pillow 5.1.0)

Quellcode

Es ist auf [GitHub] verfügbar (https://github.com/bluejenga/xmastree). Im Folgenden werden nur die Punkte vorgestellt.

UI-Erstellungspunkte

Bildschirm

Verwenden Sie die Module Image und ImageTk des PIL-Pakets, um PNG-Bilder anzuzeigen. Zuerst lade ich eine Reihe von Bildern mit "Image.open ()". Der Grund für "resize ()" ist, dass ich es in Zukunft auf dem Touch-Display von Raspeye verschieben möchte, damit ich die Anzeigegröße flexibel ändern kann.

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)

Das geladene Bild wird auf der Leinwand von Tkinter angezeigt. Verwenden Sie zu diesem Zeitpunkt den Konstruktor PhotoImage (). Es scheint, dass das PhotoImage-Objekt beibehalten werden muss. Es wurde bei Verwendung einer lokalen Variablen nicht angezeigt. Der Rückgabewert von "create_image ()" ist die ID des Objekts auf der Zeichenfläche. Sie benötigen es, wenn Sie während des Spiels Bilder wechseln oder Rotationsanimationen anzeigen.

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)

Um das Bild zu ändern, erstellen Sie ein neues PhotoImage und verwenden Sie die Zeichenfläche "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)

Rotationsanimation

In Tkinter gibt es keine Animationsmethode, daher können Sie das Bild regelmäßig aktualisieren, um die Animation zu erzielen. Um den Prozess regelmäßig aufzurufen, können Sie after () verwenden, eine gängige Methode des Tkinter-Widgets.

app_tk.py


def rotate_cell(self, x, y):
    info = self.img_info[x][y]
    info.angle -= 15   #15 Grad Drehung
    info.photo_img = ImageTk.PhotoImage(info.img.rotate(info.angle))   #Erstellen Sie gedrehtes PhotoImage
    self.canvas.itemconfigure(info.id, image = info.photo_img)   #Bild ersetzen
    if info.angle % 90 == 0:
        #Animation abgeschlossen
        #Aktualisierungsprozess des Spielstatus usw.
    else:
        self.after(15, self.rotate_cell, x, y)   #Aktualisieren Sie das Bild nach 15 Millisekunden erneut

Platziere das Widget auf der Leinwand

Sie können ein Widget mit der Methode "create_window ()" der Zeichenfläche platzieren. Verwenden Sie Frame, wenn Sie mehrere Widgets gleichzeitig verarbeiten möchten.

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)

Klicken Sie auf Ereignis auf Leinwand

Weisen Sie eine Rückrufmethode mit "bind ()" zu. Das Ereignis wird als Argument an die Rückrufmethode übergeben, und Sie können die Koordinaten abrufen, bei denen das Klickereignis in .x, .y aufgetreten ist.

app_tk.py


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

def on_click_canvas(self, event):
    # event.x, event.Holen Sie sich Koordinaten mit y
    x = (event.x - TREE_OFFSET_X) // CELL_LENGTH
    y = (event.y - TREE_OFFSET_Y) // CELL_LENGTH
    #wird bearbeitet

Labyrinth-Algorithmus

Der elektrische Pfad kann als Labyrinth beschrieben werden, das an der Basis des Baumes beginnt. Es gibt verschiedene Algorithmen zum Erstellen eines Labyrinths, aber ich habe es auf meine eigene Weise erstellt. Einfach ausgedrückt lautet der Algorithmus wie folgt.

Ich denke, wir werden eine Labyrinthroute machen, indem wir die Quadrate des quadratischen Papiers verbinden.

  1. Markieren Sie die Startzelle als verwendet.
  2. Listen Sie alle Kombinationen von verwendeten Zellen und benachbarten nicht verwendeten Zellen auf.
  3. Wählen Sie zufällig eine aus der Liste aus, verbinden Sie die ausgewählten Zellen mit einer Passage und markieren Sie die ausgewählten Zellen als verwendet. ..
  4. Wiederholen Sie 2-3, bis alle Zellen aufgebraucht sind.

Es sieht so aus, wenn Sie ein Video darüber machen, wie das Labyrinth fertiggestellt ist.

tree_build.gif

Bonus

Ich wollte eine weihnachtliche Hintergrundmusik spielen, und als ich nachschaute, wie man eine MP3-Datei mit Python abspielt, stellte ich fest, dass es ein Pygame gab. Natürlich können Sie auch Bilder anzeigen, also hätte ich das vielleicht von Anfang an verwenden sollen ...

Recommended Posts

Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
〇✕ Ich habe ein Spiel gemacht
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe einen Blackjack mit Python gemacht!
Ich habe einen Python-Text gemacht
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe mit Sense HAT ein gefallenes Monospiel gemacht
Ich habe einen Line-Bot mit Python gemacht!
Othello-Spieleentwicklung mit Python
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe eine Heatmap mit Seaborn [Python] gezeichnet.
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Weihnachtsklassiker (?) Einen Weihnachtsbaum mit Raspberry Pi und Philips Hue anzünden
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Was ich mit Python-Arrays gemacht habe
Ich habe einen Hanko-Generator mit GAN gemacht
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe ein Tool zum automatischen Durchsuchen mehrerer Websites mit Selenium (Python) erstellt.
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Ich habe einen Stempelersatzbot mit Linie gemacht