J'ai fait un jeu de puzzle (comme) avec Tkinter of Python

Je suis un débutant avec plusieurs mois d'expérience en programmation. Je voulais faire un jeu, alors j'ai essayé de faire un puzzle tombé qui semble avoir un seuil relativement bas C'est le premier message de Qiita.

C'est un jeu comme celui-ci (gif 30 secondes, long) ezgif-3-3eee2fbd7703.gif

L'explication est commentée sur le code. (Il semble qu'il y ait beaucoup d'erreurs)

panepon.py


import tkinter
import random
import math

phase = 0           #Variables de gestion de la progression du jeu
cursor_x = 2        #Coordonnée X du curseur(initiale)
cursor_y = 11       #Coordonnée Y du curseur(initiale)
cursor_dx = 1       #Quantité de mouvement du curseur x
cursor_dy = 1       #Quantité de mouvement du curseur y
block_width = 64    #Largeur de bloc
block_height = 64   #Hauteur de bloc

def right(e):                       #Traitement lorsque la touche droite est enfoncée
    global cursor_x, cursor_dx      #Déclaration globale pour réécrire les variables globales
    cursor_x += cursor_dx
    if cursor_x > 4:                #Traitement pour empêcher le curseur d'aller à droite de la fenêtre de jeu
        cursor_x = 4

def left(e):                        #Traitement lorsque la touche gauche est enfoncée
    global cursor_x, cursor_dx
    cursor_x -= cursor_dx
    if cursor_x < 0:                #Traitement pour empêcher le curseur d'aller à gauche du cadre du jeu
        cursor_x = 0

def up(e):                          #Traitement lorsque la touche haut est enfoncée
    global cursor_y, cursor_dy
    cursor_y -= cursor_dy
    if cursor_y < 0:                #Traitement pour empêcher le curseur d'aller au-dessus du cadre du jeu
        cursor_y = 0

def down(e):                        #Traitement lorsque la touche bas est enfoncée
    global cursor_y, cursor_dy
    cursor_y += cursor_dy
    if cursor_y > 11:               #Traitement pour empêcher le curseur de passer sous le cadre du jeu
        cursor_y = 11

def press_a(e):                     #Traitement lorsque la touche A est enfoncée
    global a                        #Définition de la variable globale a
    a = 1                           #Gérer qu'une touche est enfoncée

def press_c(e):                     #Traitement lorsque la touche C est enfoncée
    global c
    c = 1

def press_r(e):                     #Traitement lorsque la touche R est enfoncée
    global r
    r = 1

block = []  #Un tableau qui gère le placement des blocs
check = []  #Tableau pour vérification

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

def draw_block():                   #Fonction de dessin de bloc
    cvs.delete("BLOCK")             #Supprimer le bloc dessiné jusqu'à présent
    for y in range(17):
        for x in range(6):
            if block[y][x] > 0:     #Si le bloc existe
                cvs.create_image(x * block_width + 35, y * block_height - block_height * 4 - 35, image=img_block[block[y][x]], tag="BLOCK")
                                    #Arrangement d'image de bloc de dessin pour l'image de bloc

def check_block():                  #Fonction de vérification des blocs
    for y in range(17):
        for x in range(6):
            check[y][x] = block[y][x]  #Attribuer la disposition de bloc actuelle au tableau de contrôle

    for y in range(1,16):
        for x in range(6):
            if check[y][x] > 0:      #Si le bloc existe
                if check[y-1][x] == check[y][x] and check[y+1][x] == check[y][x]:  #Lorsque des blocs de la même couleur sont alignés verticalement sur 3 rangées ou plus
                    if check[y][x] == 1:  #Si les blocs alignés sont rouges, transformez-les en cœurs
                        block[y-1][x] = 6
                        block[y][x] = 6
                        block[y+1][x] = 6
                    if check[y][x] == 2:  #Si les blocs alignés sont bleus, changez en dauphins
                        block[y-1][x] = 7
                        block[y][x] = 7
                        block[y+1][x] = 7
                    if check[y][x] == 3:  #Si les blocs alignés sont verts, changez en trèfle
                        block[y-1][x] = 8
                        block[y][x] = 8
                        block[y+1][x] = 8
                    if check[y][x] == 4:  #Si les blocs alignés sont jaunes, changez en bière
                        block[y-1][x] = 9
                        block[y][x] = 9
                        block[y+1][x] = 9
                    if check[y][x] == 5:  #Si les blocs alignés sont violets, changez en vin
                        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]:  #Lorsque les blocs de la même couleur sont alignés côte à côte sur 3 rangées ou plus
                    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():                  #Fonction d'effacement des blocs
    num = 0                         #Compter le nombre de blocs disparus
    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                                          #Renvoie le nombre de blocs disparus à l'appelant

def drop_block():                                       #Fonction pour déposer un bloc
    flg = False                                         #Vérifier la transition de phase
    for y in range(15, -1, -1):                         #Trouvez y dans la deuxième ligne à partir du bas
        for x in range(6):
            if block[y][x] != 0 and block[y+1][x] == 0: #S'il y a un bloc à l'endroit que vous vérifiez et qu'il n'y a pas de bloc un carré en dessous
                block[y+1][x] = block[y][x]             #Copiez le bloc ci-dessous
                block[y][x] = 0                         #Effacer le bloc d'origine
                flg = True
    return flg                                          #Renvoyer flg à l'appelant

def over_block():           #Fonction pour le traitement du jeu
    for x in range(6):
        if block[5][x] > 0: #Lorsque le bloc est en haut du cadre de jeu
            return True
    return False

def set_up():                               #Une fonction qui fait monter un bloc d'un cran
    for y in range(5, 16):
        for x in range(6):
            block[y][x] = block[y + 1][x]

def set_block():                            #Fonction qui met le bloc en bas
    for x in range(6):
        block[16][x] = random.randint(1, 5) #En bas, 1 du tableau d'image de bloc~Disposer 5 au hasard

def ojama_block(ojama_num):                     #Une fonction qui organise aléatoirement les blocs dans la rangée supérieure
    for y in range(0, ojama_num):
        for x in range(6):
            block[y][x] = random.randint(1, 5)

def cross_block():                                                          #Une fonction qui permute à gauche et à droite dans le curseur
    if c == 1:                                                              #Lorsque la touche C est enfoncée
        source = block[cursor_y + 5][cursor_x]                              #Assignez le bloc sur le côté gauche du curseur à la source de variable
        block[cursor_y + 5][cursor_x] = block[cursor_y + 5][cursor_x + 1]   #Rendre le bloc sur le côté gauche du curseur le même que le bloc sur le côté droit
        block[cursor_y + 5][cursor_x + 1] = source                          #Rendre le bloc sur le côté droit du curseur identique à la source

def draw_text(text, x, y, size, col, tag):                         #Fonction pour afficher du texte
    font = ("Times New Roman", size, "bold")                       #Saisissez d'abord la police, la taille de la police et l'épaisseur des caractères.
    cvs.create_text(x, y, text=text, fill=col, font=font, tag=tag) #Afficher le texte Basé sur les coordonnées et les informations apportées comme arguments

def game_main():                #Traitement principal
    global phase, a, c, r, score, combo, ojama_num, over, force, cursor_x, cursor_y
    if phase == 0:              #Quand la phase est précoce(écran titre)
        cvs.delete("OVER")      #Supprimer le processus de redémarrage à partir d'ici
        cvs.delete("CHARA")
        cvs.delete("RESTART")
        for y in range(17):
            for x in range(6):
                block[y][x] = 0
                draw_block()    #Supprimer le processus de redémarrage jusqu'à ici
        draw_text("Panneau ◯", 384, 334, 100,"violet","TITLE") #Texte de dessin
        draw_text(
        """
Avec la touche A
Jeu
Commençons!
        
        """, 425, 590, 25, "blue", "TITLE")
        cvs.create_image(576, 650, image=chara, tag="CHARA")
        phase = 1       #Passer à la phase 1
        score = 0       #Valeur numérique pour l'affichage du score
        combo = 1       #Variables de gestion du nombre de combos
        ojama_num = 0   #Valeur numérique pour déposer des blocs par le haut
        force = 1       #Valeur numérique pour déposer des blocs par le haut
        over = 0        #Variables pour le jeu sur la gestion
        a = 0           #Une touche n'est pas enfoncée
        c = 0
        r = 0
    elif phase == 1:                 #Lorsque la phase est 1
        if a == 1:                   #Lorsque vous appuyez sur la touche A
            for y in range(15):
                for x in range(6):
                    block[y][x] = 0
                    a = 0               #Revenir à l'état où la touche A n'est pas enfoncée
                    draw_block()        #Blocs de dessin
                    cvs.delete("TITLE") #Titre(texte)Effacer
                    draw_text("Description du jeu", 576, 30, 40, "blue", "READ")
                    draw_text("↑ ↓ ← → Le curseur se déplace avec la touche!", 576, 130, 20, "blue", "READ")
                    draw_text("Utilisez la touche A pour mettre un bloc en bas!", 576, 180, 20, "blue", "READ")
                    draw_text("Swap gauche et droite avec la touche C!", 576, 230, 20, "blue", "READ")
                    draw_text("Il disparaîtra si 3 ou plus sont alignés verticalement ou horizontalement!", 576, 280, 20, "blue", "READ")
                    draw_text("Si vous l'effacez un certain nombre de fois, les blocs tomberont d'en haut!", 576, 330, 20, "blue", "READ")
                    draw_text("Ne le faites pas lorsque le bloc atteint le sommet!", 576, 380, 20, "blue", "READ")
                    phase = 2
    elif phase == 2:
        if c == 1:
            cross_block()
            c = 0
        if drop_block() == False:  #Si flg est faux
            phase = 3
        draw_block()
    elif phase == 3:
        check_block()
        draw_block()
        phase = 4
    elif phase == 4:
        sc = sweep_block()  #Remplacez le nombre num où le bloc a disparu en sc
        if sc > 9:        #Gérer le montant de l'augmentation du score sc en fonction du nombre disparu d'ici
            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                 #Gérer l'augmentation du score sc en fonction du nombre de disparus
        sc *= combo ** 4            #Multipliez la 4e puissance du montant du combo par l'augmentation du score sc
        score += sc                 #Ajouter le montant de l'augmentation au score
        if sc > 0:                  #Si le bloc a été effacé
            combo += 1              #Plus 1 numéro combiné
            if combo > 2:
                cvs.delete("COMBO") #Suppression de l'affichage combiné qui était affiché jusqu'à présent
                draw_text(str(combo - 1)+"chaîne!", 480, 550, 50, "blue", "COMBO")
                                    #Texte pour afficher le nombre de combos
            ojama_num += 0.4        #Le nombre de blocs déposés par le haut est de 0.4 augmentation
            force += 0.05           #Chaque fois que vous effacez un bloc, ojama_Le nombre à multiplier par num augmente
            phase = 2
        else:
            if over_block() == False:
                phase = 5
            else:
                over = 1            #Pour jouer sur le traitement
        draw_block()
    elif phase == 5:
        combo = 1                   #Restaurer le nombre de combos
        cvs.delete("COMBO")         #Désactiver l'affichage des numéros combinés
        if ojama_num >= 1:          #ojama_Lorsque num est égal ou supérieur à 1
            ojama_num = math.floor(ojama_num * (force))  #ojama_Multipliez num par la force et tronquez-en quelques-uns
            ojama_block(ojama_num)  #ojama_Même nombre que le nombre de num(Colonne), Activez le bloc
            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")  #Désactiver l'affichage du score
    if phase > 1:
        draw_text("SCORE", 576, 450, 40, "black", "INFO")
        draw_text(score * 10, 576, 490, 40, "black", "INFO") #Afficher le score
    draw_block()
    if over == 1:           #Game over processing
        cvs.delete("CHARA")                                    #Effacez le personnage que vous dessiniez
        cvs.create_image(576, 650, image=chara2, tag="CHARA")  #Changer l'image du personnage en une autre
        draw_text("GAME OVER", 384, 384, 100, "black", "OVER")
        cvs.delete("READ")  #Effacer la description de la règle
        cvs.delete("COMBO") #Désactiver l'affichage combiné
        draw_text(
        """
Avec touche R
Dans le titre
Je reviendrai...
        
        """, 425, 590, 25, "blue", "RESTART")
        if r == 1:
            phase = 0
    cvs.delete("CURSOR")  #Effacer l'image du curseur
    cvs.create_image(cursor_x * block_width + 67, cursor_y * block_height + 29, image=cursor, tag="CURSOR")
                          #Dessiner une image de curseur
    root.after(100,game_main)  #0.1 seconde partie plus tard_Appeler la fonction principale

root = tkinter.Tk()          #Faire une fenêtre
root.title("Panneau ◯")         #Réglage du titre
root.resizable(False,False)  #Empêche la taille de la fenêtre d'être modifiée
root.bind("<Right>",right)   #La fonction droite est appelée lorsque la touche Droite est enfoncée.
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)  #Faire la taille de la toile 768x768 pixels
cvs.pack()                                        #Placez la toile

bg = tkinter.PhotoImage(file="bg.png ")  #Image de remplacement pour 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 ")
]   #Disposition des images de bloc

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()  #Afficher l'interface graphique

En regardant les choses comme ça, il y a de nombreux nombres magiques. Je veux faire attention

Je veux faire un RPG la prochaine fois. (J'ai étudié un peu, mais c'est vraiment difficile.)

Recommended Posts

J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai fait un jeu rogue-like avec Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un jeu de cueillette avec Python
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai fait un programme de gestion de la paie en 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
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
〇✕ 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 jouer à un jeu de frappe avec Python
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
J'ai créé un programme cryptographique César en Python.
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 fenêtre pour la sortie du journal avec Tkinter
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
Je veux travailler avec un robot en python.
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!
J'ai créé un package pour filtrer les séries chronologiques avec python
Numer0n avec des objets fabriqués avec Python
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai fait un jeu de combat Numer0n en Java (j'ai aussi fait de l'IA)
Développement de jeux Othello avec Python
Zura fait comme un jeu de la vie
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Différence de comportement du cadre transparent réalisé avec tkinter dans pyinstaller [Python]
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é de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter