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