Tetris in Python mit Pygame und Numpy

SleezyPants

Cadet 2nd Year
Registriert
Juli 2022
Beiträge
31
Hi,

ich habe die letzten Wochen angefangen Python mit Hilfe des Kurses auf www.python-lernen.de zu lernen. Dort lernt man am Beispiel einiger kleiner Spiele den Einstieg in Python und Pygame. Meine Zielsetzung war am Ende des Kurses eigenständig Tetris in Python zu programmieren. Hier ein Video vom aktuellen Stand:

Habe mal den aktuellen Stand meines Python-Projekts angehängt. Vielleicht kann sich ja mal jemand mit mehr Erfahrung das angucken und mir ein Feedback dazu geben. Noch gibt es 1-2 kleinere Bugs bei der Kollisionsabfrage und dem Rotieren der Blöcke, da werde ich mich die Tage nochmal ran machen und versuchen, das zu fixen.

PS: Welche IDE würdet ihr für Python empfehlen? Ich nutze zur Zeit Thonny, bin eigentlich ganz zufrieden damit, aber ich hätte gerne die Funktion, dass ich eingerückte Blöcke zu klappen kann und diese mit vertikalen Linien angezeigt bekomme.

MfG Sleezy
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dasBaum_CH, Der Lord, QXARE und eine weitere Person
Code bitte auf Github / Gitlab oder vergleichbaren plattformen.

Bei der IDE sind inzwischen alle irgendwie bei pycharm gelandet.
 
Sieht doch schon recht gut aus (anhand des Videos)! Als IDE wäre VS Code mit Python Plugins eine kostenlose Alternative.

Tipp: Wenn du die Datei mit entsprechender Dateiendung committest würde auch das Syntax-Highlighting funktionieren!
 
nette programmieraufgabe, debuggen auf den letzten i punkt lohnt sich nicht

mach die steine noch bunt, verwende bitfelder statt arrays (rein als übung), sonst lass es und mach das nächste projekt

ianal aber ist leider so das Tetris ein copyright verseuchter titel ist also der name, die gameboymusik usw sind alle geschützt wird bis heute vermarktet und man könnte Ärger bekommen. man darf die idee selber programmieren und die musik (korobeiniki) selber nachspielen aber halt alles nicht im original verwenden oder benennen
 
QXARE schrieb:
Sieht doch schon recht gut aus (anhand des Videos)! Als IDE wäre VS Code mit Python Plugins eine kostenlose Alternative.
Die Community Edition von PyCharm kostet nichts (was da gegenüber der kostenpflichtigen Version fehlt ist im Wesentlichen die Unterstützung von WebFrameworks).
 
  • Gefällt mir
Reaktionen: QXARE und BeBur
Ich nehm VisualCode als Python IDE, funktioniert super :)
 
@BeBur Wie läuft das bei Pycharm mit dem installieren von Modulen? Thonny hat quasi eine Art Repository mit an Bord, da kann ich Module suchen und runterladen/installieren. Gibt es so etwas bei Pycharm auch?
 
Schon mal ein guter Anfang.
Aber hier und da hast du komische Konstrukte eingebaut, z.B.:
Python:
        #Spiel schneller machen, mit steigender Punktzahl
        if punkte<25 and stein_schnell==False:
            FPS=1
            level=1
        elif punkte>=25 and punkte<50 and stein_schnell==False:
            FPS=2
            level=2
        elif punkte>=50 and punkte<75 and stein_schnell==False:
            FPS=3
            level=3
        elif punkte>=75 and punkte<100 and stein_schnell==False:
            FPS=4
            level=4
        elif punkte>=100 and punkte<125 and stein_schnell==False:
            FPS=5
            level=5
        elif punkte>=125 and punkte<150 and stein_schnell==False:
            FPS=6
            level=6
        elif punkte>=150 and punkte<175 and stein_schnell==False:
            FPS=7
            level=7
        elif punkte>=175 and punkte<200 and stein_schnell==False:
            FPS=8
            level=8
        elif punkte>=200 and punkte<225 and stein_schnell==False:
            FPS=9
            level=9
        elif punkte>=225 and stein_runter()==False:
            FPS=10
            level=10
Besonders das mitelif ... stein_runter()==False, finde ich ist sehr komisch.

Den ganzen Block kann man getrost ersetzen mit:
Python:
        #Spiel schneller machen, mit steigender Punktzahl
        if not stein_schnell:
            level=min(punkte, 225)//25+1
            FPS=level

Außerdem werden Variablen wie Multiplikator, W nicht konsequent im Code verwendet, so dass eine Änderung der Variabel seltsames Verhalten hervorruft.

Aber insgesamt, schön gemacht.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: SleezyPants
Danke für die Vereinfachung des Level-Systems :) der Befehl min war mir bislang nicht bekannt, muss ich mal nachschlagen, was der genau macht. Auch das mit den // weiß ich nicht was das bedeutet...

PS: Das mit "elif ... stein_runter()==False" ist tatsächlich ein Fehler, das sollte wie in den anderen Zeilen auch "stein_schnell==False" sein.
 
Python:
x=min(5,8) # Ergebnis: x=5 - kleinste Zahl wird genommen
y=15/8 # Ergebnis: y=1.875 - normale Division
z=15//8 # Ergebnis: z=1 - Ganzzahl-Division - alles nach dem Komma wird abgekniffen
In diesem Fall habe ich // genommen, da Level logischerweise keine ungeraden Werte haben können, sondern in 25er-Schritten um eins hochspringt.
 
Alles klar Danke, dann habe ich das soweit verstanden. Den Befehl min habe ich in meinem Python-Fachbuch nachgeschlagen. :)

Ich habe nun gerade noch eingebaut, dass das Spiel am Spiel-Ende sich nicht einfach schließt, sondern auf Input wartet. Mit einem Druck auf Leertaste kann nun das Spiel neu gestartet werden oder alternativ mit Escape beendet werden. :) Hier der Code dazu:

Code:
if kollision() and y_pos==1:
            text_verloren="Game Over!"
            text_esc="Press ESC to quit"
            text_space="or Space to restart"
            font=pygame.font.SysFont(None, 40)
            font2=pygame.font.SysFont(None, 25)
            text_verloren=font.render(text_verloren, True, ROT)
            text_esc=font2.render(text_esc, True, SCHWARZ)
            text_space=font2.render(text_space, True, SCHWARZ)
            fenster.blit(text_verloren, [20, 180])
            fenster.blit(text_esc, [20, 220])
            fenster.blit(text_space, [20, 240])
            pygame.display.flip()
            print("Du hast verloren!")
            steinaktiv=False
            spiel_verloren=True
            pygame.event.clear()
            while spiel_verloren==True:
                event = pygame.event.wait()
                if event.type == QUIT or event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE:
                    spielaktiv=False
                    pygame.quit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == K_SPACE:
                        print("Spiel Neustart")
                        spielfeld=np.zeros((H,W), dtype=int)
                        fenster.fill(WEISS)
                        spiel_verloren=False
                        spiel_aktiv=True
                        stein_aktiv=True
                        punkte=0
                        FPS=1

PS: Ich habe hier davon abgesehen, das in eine eigene Funktion zu packen. Zum einen müsste ich ein elendig langes return schreiben, zum anderen denke ich nicht, dass ich diesen Code nochmal an anderer Stelle innerhalb des Tetris-Projekts brauchen werde.
 
Zuletzt bearbeitet:
Hier mal ein kleines Update:

Und hier gibt es den Code dazu: https://github.com/SleezyPants/Tetris/blob/main/Tetris
 
Thonny könnte man politisch neutral machen, und die Support-Ukraine Schaltfläche raus patchen.
Screenshot 2024-10-09 132638.png
 

Anhänge

Zurück
Oben