Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht

Ich bin ein Anfänger mit mehrmonatiger Programmiererfahrung. Ich wollte ein Spiel machen, also habe ich versucht, ein gefallenes Puzzle zu machen, das eine relativ niedrige Schwelle zu haben scheint Dies ist Qiitas erster Beitrag.

Es ist ein Spiel wie dieses (gif 30 Sekunden, lang) ezgif-3-3eee2fbd7703.gif

Die Erklärung ist im Code kommentiert. (Es scheint, dass es viele Fehler gibt)

panepon.py


import tkinter
import random
import math

phase = 0           #Variablen zum Verwalten des Spielfortschritts
cursor_x = 2        #X-Koordinate des Cursors(Initiale)
cursor_y = 11       #Y-Koordinate des Cursors(Initiale)
cursor_dx = 1       #Bewegungsumfang des Cursors x
cursor_dy = 1       #Bewegungsbetrag des Cursors y
block_width = 64    #Blockbreite
block_height = 64   #Blockhöhe

def right(e):                       #Verarbeitung bei gedrückter rechter Taste
    global cursor_x, cursor_dx      #Globale Deklaration zum Umschreiben globaler Variablen
    cursor_x += cursor_dx
    if cursor_x > 4:                #Verarbeitung, um zu verhindern, dass der Cursor rechts vom Spielrahmen angezeigt wird
        cursor_x = 4

def left(e):                        #Verarbeitung bei gedrückter linker Taste
    global cursor_x, cursor_dx
    cursor_x -= cursor_dx
    if cursor_x < 0:                #Verarbeitung, um zu verhindern, dass der Cursor links vom Spielrahmen angezeigt wird
        cursor_x = 0

def up(e):                          #Verarbeitung beim Drücken der Aufwärts-Taste
    global cursor_y, cursor_dy
    cursor_y -= cursor_dy
    if cursor_y < 0:                #Verarbeitung, um zu verhindern, dass der Cursor über den Spielrahmen hinausgeht
        cursor_y = 0

def down(e):                        #Verarbeitung beim Drücken der Abwärtstaste
    global cursor_y, cursor_dy
    cursor_y += cursor_dy
    if cursor_y > 11:               #Verarbeitung, um zu verhindern, dass der Cursor unter den Spielrahmen fällt
        cursor_y = 11

def press_a(e):                     #Verarbeitung beim Drücken der A-Taste
    global a                        #Definition der globalen Variablen a
    a = 1                           #Verwalten, dass eine Taste gedrückt wird

def press_c(e):                     #Verarbeitung bei gedrückter C-Taste
    global c
    c = 1

def press_r(e):                     #Verarbeitung bei gedrückter R-Taste
    global r
    r = 1

block = []  #Ein Array, das die Platzierung von Blöcken verwaltet
check = []  #Array zur Überprüfung

for i in range(17):
    block.append([0,0,0,0,0,0])
    check.append([0,0,0,0,0,0])

def draw_block():                   #Blockzeichnungsfunktion
    cvs.delete("BLOCK")             #Löschen Sie den bisher gezeichneten Block
    for y in range(17):
        for x in range(6):
            if block[y][x] > 0:     #Wenn der Block existiert
                cvs.create_image(x * block_width + 35, y * block_height - block_height * 4 - 35, image=img_block[block[y][x]], tag="BLOCK")
                                    #Blockbild zeichnen Anordnung für Blockbild

def check_block():                  #Funktion zum Überprüfen von Blöcken
    for y in range(17):
        for x in range(6):
            check[y][x] = block[y][x]  #Weisen Sie dem Prüfarray das aktuelle Blocklayout zu

    for y in range(1,16):
        for x in range(6):
            if check[y][x] > 0:      #Wenn der Block existiert
                if check[y-1][x] == check[y][x] and check[y+1][x] == check[y][x]:  #Wenn gleichfarbige Blöcke in 3 oder mehr Reihen vertikal ausgerichtet sind
                    if check[y][x] == 1:  #Wenn die aufgereihten Blöcke rot sind, verwandeln Sie sie in Herzen
                        block[y-1][x] = 6
                        block[y][x] = 6
                        block[y+1][x] = 6
                    if check[y][x] == 2:  #Wenn die Blöcke blau ausgerichtet sind, wechseln Sie zu Delfinen
                        block[y-1][x] = 7
                        block[y][x] = 7
                        block[y+1][x] = 7
                    if check[y][x] == 3:  #Wenn die aufgereihten Blöcke grün sind, wechseln Sie zu Klee
                        block[y-1][x] = 8
                        block[y][x] = 8
                        block[y+1][x] = 8
                    if check[y][x] == 4:  #Wenn die aufgereihten Blöcke gelb sind, wechseln Sie zu Bier
                        block[y-1][x] = 9
                        block[y][x] = 9
                        block[y+1][x] = 9
                    if check[y][x] == 5:  #Wenn die aufgereihten Blöcke lila sind, wechseln Sie zu Wein
                        block[y-1][x] = 10
                        block[y][x] = 10
                        block[y+1][x] = 10
                        

    for y in range(17):
        for x in range(1,5):
            if check[y][x] > 0:
                if check[y][x-1] == check[y][x] and check[y][x+1] == check[y][x]:  #Wenn gleichfarbige Blöcke in 3 oder mehr Reihen nebeneinander angeordnet sind
                    if check[y][x] == 1:
                        block[y][x-1] = 6
                        block[y][x] = 6
                        block[y][x+1] = 6
                    if check[y][x] == 2:
                        block[y][x-1] = 7
                        block[y][x] = 7
                        block[y][x+1] = 7
                    if check[y][x] == 3:
                        block[y][x-1] = 8
                        block[y][x] = 8
                        block[y][x+1] = 8
                    if check[y][x] == 4:
                        block[y][x-1] = 9
                        block[y][x] = 9
                        block[y][x+1] = 9
                    if check[y][x] == 5:
                        block[y][x-1] = 10
                        block[y][x] = 10
                        block[y][x+1] = 10
    

def sweep_block():                  #Funktion zum Löschen von Blöcken
    num = 0                         #Zählen der Anzahl verschwundener Blöcke
    for y in range(17):
        for x in range(6):
            if block[y][x] == 6:
                block[y][x] = 0
                num += 1
            if block[y][x] == 7:
                block[y][x] = 0
                num += 1
            if block[y][x] == 8:
                block[y][x] = 0
                num += 1
            if block[y][x] == 9:
                block[y][x] = 0
                num += 1
            if block[y][x] == 10:
                block[y][x] = 0
                num += 1
    return num                                          #Gibt die Anzahl der verschwundenen Blöcke an den Anrufer zurück

def drop_block():                                       #Funktion zum Löschen eines Blocks
    flg = False                                         #Auf Phasenübergang prüfen
    for y in range(15, -1, -1):                         #Finden Sie y aus der zweiten Reihe von unten
        for x in range(6):
            if block[y][x] != 0 and block[y+1][x] == 0: #Wenn sich an der Stelle, die Sie überprüfen, ein Block befindet und kein Block ein Quadrat darunter ist
                block[y+1][x] = block[y][x]             #Kopieren Sie den folgenden Block
                block[y][x] = 0                         #Löschen Sie den ursprünglichen Block
                flg = True
    return flg                                          #Geben Sie flg an den Anrufer zurück

def over_block():           #Funktion zur Überbearbeitung von Spielen
    for x in range(6):
        if block[5][x] > 0: #Wenn sich der Block oben im Spielrahmen befindet
            return True
    return False

def set_up():                               #Eine Funktion, die einen Block um einen Schritt nach oben bewegt
    for y in range(5, 16):
        for x in range(6):
            block[y][x] = block[y + 1][x]

def set_block():                            #Funktion, die den Block nach unten setzt
    for x in range(6):
        block[16][x] = random.randint(1, 5) #Unten 1 des Blockbild-Arrays~Ordne 5 zufällig an

def ojama_block(ojama_num):                     #Eine Funktion, die Blöcke in der oberen Reihe zufällig anordnet
    for y in range(0, ojama_num):
        for x in range(6):
            block[y][x] = random.randint(1, 5)

def cross_block():                                                          #Eine Funktion, die im Cursor nach links und rechts wechselt
    if c == 1:                                                              #Wenn die C-Taste gedrückt wird
        source = block[cursor_y + 5][cursor_x]                              #Weisen Sie den Block auf der linken Seite des Cursors der Variablenquelle zu
        block[cursor_y + 5][cursor_x] = block[cursor_y + 5][cursor_x + 1]   #Stellen Sie den Block auf der linken Seite des Cursors auf den Block auf der rechten Seite ein
        block[cursor_y + 5][cursor_x + 1] = source                          #Machen Sie den Block auf der rechten Seite des Cursors mit der Quelle identisch

def draw_text(text, x, y, size, col, tag):                         #Funktion zum Anzeigen von Text
    font = ("Times New Roman", size, "bold")                       #Geben Sie zuerst die Schriftart, Schriftgröße und Zeichendicke ein.
    cvs.create_text(x, y, text=text, fill=col, font=font, tag=tag) #Text anzeigen Basierend auf den Koordinaten und Informationen, die als Argumente eingegeben wurden

def game_main():                #Hauptverarbeitung
    global phase, a, c, r, score, combo, ojama_num, over, force, cursor_x, cursor_y
    if phase == 0:              #Wenn die Phase früh ist(Titelbildschirm)
        cvs.delete("OVER")      #Löschen Sie den Prozess für den Neustart von hier aus
        cvs.delete("CHARA")
        cvs.delete("RESTART")
        for y in range(17):
            for x in range(6):
                block[y][x] = 0
                draw_block()    #Löschvorgang für Neustart bis hierher
        draw_text("Panel ◯", 384, 334, 100,"violet","TITLE") #Text zeichnen
        draw_text(
        """
Mit der A-Taste
Spiel
Lass uns anfangen!
        
        """, 425, 590, 25, "blue", "TITLE")
        cvs.create_image(576, 650, image=chara, tag="CHARA")
        phase = 1       #Fahren Sie mit Phase 1 fort
        score = 0       #Numerischer Wert für die Punkteanzeige
        combo = 1       #Variablen zum Verwalten der Anzahl von Combos
        ojama_num = 0   #Numerischer Wert zum Löschen von Blöcken von oben
        force = 1       #Numerischer Wert zum Löschen von Blöcken von oben
        over = 0        #Variablen für Game over Management
        a = 0           #Eine Taste wird nicht gedrückt
        c = 0
        r = 0
    elif phase == 1:                 #Wenn die Phase 1 ist
        if a == 1:                   #Wenn Sie die A-Taste drücken
            for y in range(15):
                for x in range(6):
                    block[y][x] = 0
                    a = 0               #Kehren Sie in den Zustand zurück, in dem die A-Taste nicht gedrückt wurde
                    draw_block()        #Zeichenblöcke
                    cvs.delete("TITLE") #Titel(Text)Löschen
                    draw_text("Spielbeschreibung", 576, 30, 40, "blue", "READ")
                    draw_text("↑ ↓ ← → Der Cursor bewegt sich mit der Taste!", 576, 130, 20, "blue", "READ")
                    draw_text("Verwenden Sie die A-Taste, um einen Block unten zu löschen!", 576, 180, 20, "blue", "READ")
                    draw_text("Mit der C-Taste nach links und rechts tauschen!", 576, 230, 20, "blue", "READ")
                    draw_text("Es verschwindet, wenn 3 oder mehr vertikal oder horizontal ausgerichtet sind!", 576, 280, 20, "blue", "READ")
                    draw_text("Wenn Sie es eine bestimmte Anzahl von Malen löschen, fallen Blöcke von oben!", 576, 330, 20, "blue", "READ")
                    draw_text("Tu es nicht, wenn der Block die Spitze erreicht!", 576, 380, 20, "blue", "READ")
                    phase = 2
    elif phase == 2:
        if c == 1:
            cross_block()
            c = 0
        if drop_block() == False:  #Wenn flg False ist
            phase = 3
        draw_block()
    elif phase == 3:
        check_block()
        draw_block()
        phase = 4
    elif phase == 4:
        sc = sweep_block()  #Ersetzen Sie die Nummer num, wo der Block in sc verschwunden ist
        if sc > 9:        #Verwalten Sie den Betrag der Erhöhung der Punktzahl sc entsprechend der von hier verschwundenen Zahl
            sc += 100
        elif sc > 8:
            sc += 50
        elif sc > 7:
            sc += 30
        elif sc > 6:
            sc += 15
        elif sc > 5:
            sc += 7
        elif sc > 4:
            sc += 3
        elif sc > 3:
            sc += 1                 #Verwalten Sie die Erhöhung der Punktzahl sc entsprechend der Anzahl der Verschwundenen
        sc *= combo ** 4            #Multiplizieren Sie die 4. Potenz des Kombinationsbetrags mit der Punktzahlerhöhung sc
        score += sc                 #Addieren Sie den Betrag der Erhöhung zur Punktzahl
        if sc > 0:                  #Wenn der Block gelöscht wurde
            combo += 1              #Plus 1 Combo-Nummer
            if combo > 2:
                cvs.delete("COMBO") #Die bisher angezeigte Combo-Anzeige wurde gelöscht
                draw_text(str(combo - 1)+"Kette!", 480, 550, 50, "blue", "COMBO")
                                    #Text zur Anzeige der Anzahl der Combos
            ojama_num += 0.4        #Die Anzahl der von oben abgelegten Blöcke beträgt 0.4 erhöhen
            force += 0.05           #Jedes Mal, wenn Sie einen Block löschen, Ojama_Die Zahl, die mit num multipliziert werden soll, erhöht sich
            phase = 2
        else:
            if over_block() == False:
                phase = 5
            else:
                over = 1            #Überbearbeitung spielen
        draw_block()
    elif phase == 5:
        combo = 1                   #Stellen Sie die Anzahl der Combos wieder her
        cvs.delete("COMBO")         #Schalten Sie die Combo-Nummernanzeige aus
        if ojama_num >= 1:          #ojama_Wenn num 1 oder mehr ist
            ojama_num = math.floor(ojama_num * (force))  #ojama_Multiplizieren Sie num mit Gewalt und schneiden Sie einige ab
            ojama_block(ojama_num)  #ojama_Gleiche Nummer wie die Nummer von num(Säule), Setzen Sie den Block ein
            ojama_num = 0
        if c == 1:
            cross_block()
            c = 0
            phase = 2
        if a == 1:
            a = 0
            set_up()
            set_block()
            score += 10
            phase = 2
    cvs.delete("INFO")  #Schalten Sie die Punkteanzeige aus
    if phase > 1:
        draw_text("SCORE", 576, 450, 40, "black", "INFO")
        draw_text(score * 10, 576, 490, 40, "black", "INFO") #Zeigen Sie die Punktzahl an
    draw_block()
    if over == 1:           #Spiel über Verarbeitung
        cvs.delete("CHARA")                                    #Löschen Sie das Zeichen, das Sie gezeichnet haben
        cvs.create_image(576, 650, image=chara2, tag="CHARA")  #Ändern Sie das Charakterbild in ein anderes
        draw_text("GAME OVER", 384, 384, 100, "black", "OVER")
        cvs.delete("READ")  #Löschen Sie die Regelbeschreibung
        cvs.delete("COMBO") #Schalten Sie die Combo-Anzeige aus
        draw_text(
        """
Mit R-Taste
Im Titel
Ich werde wiederkommen...
        
        """, 425, 590, 25, "blue", "RESTART")
        if r == 1:
            phase = 0
    cvs.delete("CURSOR")  #Löschen Sie das Cursorbild
    cvs.create_image(cursor_x * block_width + 67, cursor_y * block_height + 29, image=cursor, tag="CURSOR")
                          #Zeichnen Sie ein Cursorbild
    root.after(100,game_main)  #0.1 Sekunde später Spiel_Rufen Sie die Hauptfunktion auf

root = tkinter.Tk()          #Mach ein Fenster
root.title("Panel ◯")         #Titeleinstellung
root.resizable(False,False)  #Verhindert, dass die Fenstergröße geändert wird
root.bind("<Right>",right)   #Die richtige Funktion wird aufgerufen, wenn die rechte Taste gedrückt wird.
root.bind("<Left>",left)
root.bind("<Up>",up)
root.bind("<Down>",down)
root.bind("<a>",press_a)
root.bind("<c>",press_c)
root.bind("<r>",press_r)
cvs = tkinter.Canvas(root,width=768, height=768)  #Machen Sie die Leinwandgröße 768x768 Pixel
cvs.pack()                                        #Platziere die Leinwand

bg = tkinter.PhotoImage(file="bg.png ")  #Ersatzbild für bg

img_block = [
  None,
  tkinter.PhotoImage(file="red.png "),
  tkinter.PhotoImage(file="blue.png "),
  tkinter.PhotoImage(file="green.png "),
  tkinter.PhotoImage(file="yellow.png "),
  tkinter.PhotoImage(file="purple.png "),
  tkinter.PhotoImage(file="heart.png "),
  tkinter.PhotoImage(file="dolphin.png "),
  tkinter.PhotoImage(file="clover.png "),
  tkinter.PhotoImage(file="ale.png "),
  tkinter.PhotoImage(file="wine.png ")
]   #Anordnung für Blockbilder

cursor = tkinter.PhotoImage(file="cursor.png ")
chara = tkinter.PhotoImage(file="chara.png ")
chara2 = tkinter.PhotoImage(file="chara2.png ")
cvs.create_image(384,384,image=bg)
game_main()
root.mainloop()  #GUI anzeigen

Wenn man es so betrachtet, gibt es viele magische Zahlen. Ich möchte vorsichtig sein

Ich möchte das nächste Mal ein Rollenspiel machen. (Ich habe ein wenig gelernt, aber es ist wirklich schwierig.)

Recommended Posts

Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
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
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
〇✕ 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 ein Tippspiel zu spielen
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
Ich habe ein Caesar-Kryptografieprogramm in Python 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 Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich möchte mit einem Roboter in Python arbeiten.
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!
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Numer0n mit Elementen, die mit Python erstellt wurden
Ich habe einen schnellen Feed-Reader mit Feedparser in Python erstellt
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe ein Numer0n-Kampfspiel in Java gemacht (ich habe auch KI gemacht)
Othello-Spieleentwicklung mit Python
Zura machte wie ein Lebensspiel
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Unterschied im Verhalten des transparenten Frames mit tkinter im Pyinstaller [Python]
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Ich habe versucht, ein missverstandenes Gefangenendilemma in Python zu implementieren
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet