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)
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