Zum Inhalt

Tetris ähnliche Objekte

rotate_a_square_automatisch.py
##########################################
# Pygames - Tetris ähnliche Elemente
# Autor: M. Schmid
##########################################

##########################################
# Externe Bibliotheken einbinden
##########################################
import pygame as py
from random import randint


##########################################
# Pygames initialisieren
##########################################
py.init()

# Fenstergrösse setzen
win_size = (800,800)
screen = py.display.set_mode(win_size)

# Titel des Fensters
py.display.set_caption("Tetris")

# Schrift für den Text erstellen
my_font = py.font.SysFont('Comic Sans MS', 36)
my_font_greater = py.font.SysFont('Comic Sans MS', 54)


#########################################################################
# Beginn der Klassendefinitionen
#########################################################################
class Block_empty(py.sprite.Sprite):
    """This class represents the ball."""
    def __init__(self, x_pos = 200, y_pos = 200, lenge = 100, breite = 100):
        super().__init__()
        self.image = py.Surface([lenge, breite], py.SRCALPHA, 32)
        self.image = self.image.convert_alpha()    
        self.rect = self.image.get_rect()
        self.rot_image = self.image
        self.angle = 0
        self.rect.x = x_pos
        self.rect.y = y_pos
        self.draw_border(lenge, breite)

    def draw_border(self, lenge, breite):
        py.draw.rect(self.image, [0,0,0], (0, 0, lenge, breite), 4)

class Block(Block_empty):
    def __init__(self, x_pos = 200, y_pos = 200, lenge = 100, breite = 100, color = [0,255,0]):
        super().__init__(x_pos, y_pos, lenge, breite)
        self.image.fill(color)
        self.draw_border(lenge, breite)



###########################################
# Globale Funktionen definieren
##########################################

# Funktion, die die Tasten-Events überprüft
def key_handler():
    pass


# Funktion: "load_images",
# die alle Bilder für eine Klasse lädt
#
# Eingaben:
#   - path = Pfad zum Ordner, wo die Bilder drin sind
#   - names = Bildernamen ohne Nummerierung
#   - ending = Bildformat, z.B. ".gif" oder anderes
#   - number = Anzahl Bilder, die geladen werden sollen
#   - xpix,ypix = Groesse des Bildes im Spiel 
#
# Ausgabe:
#   - Liste mit Pygame-Bildern
def load_images(path,names,ending,number,xpix,ypix):
    # In Animation werden die Pygame-Bilder gespeichert
    animation = []

    for i in range(number):
        file_name = path + names + str(i) + ending
        img = py.image.load(file_name).convert_alpha() 
        animation.append(py.transform.scale(img, (xpix, ypix)))

    return animation


def draw_matrix():
    for i in range(len(spiel_feld)):
        text = my_font.render(str(spiel_feld[i]), True, [0, 0, 0])     
        screen.blit(text, (2*win_size[0] / 3 ,50+i*30))


def print_matrix(matrix):
    for i in matrix:
        print(i)

def get_i_j(x, y):
    i = (y - starty) // delta
    j = (x - startx) // delta
    return i, j
##########################################
# Globale Variabeln initialisieren
##########################################
startx = 50
starty = 50
delta = 50

m = 5
n = 7

spiel_feld = [[0 for j in range(n)] for i in range(m)]

blocks_spiel_feld = py.sprite.Group()
for i in range(m):
    for j in range(n):
        blocks_spiel_feld.add(Block_empty(startx + j*delta, starty + i*delta, delta, delta))

blocks_farbig = py.sprite.Group()
all_sprites = py.sprite.Group()

all_sprites.add(blocks_spiel_feld)

game_is_running = True

# Eine Pygame-Uhr um die Framerate zu kontrollieren
clock = py.time.Clock()

# Framerate: fps = frames per second
fps = 24


##########################################
# Hauptschleife
##########################################
while game_is_running:

    ##########################################
    # Events abfragen
    ##########################################
    for event in py.event.get():
        # Wird das Fenster geschlossen, soll
        # auch das Spiel beendet werden
        if event.type == py.QUIT or (event.type == py.KEYDOWN and event.key == py.K_ESCAPE):
            game_is_running = False
        if event.type == py.MOUSEBUTTONUP:
            pos = py.mouse.get_pos()
            # Überprüfe, ob auf das Sprite geklickt wurde
            in_blocks_spiel_feld = False
            for sprite in blocks_spiel_feld:
                if sprite.rect.collidepoint(pos):
                    # Matrix anpassen
                    i, j = get_i_j(sprite.rect.x, sprite.rect.y)
                    spiel_feld[i][j] = 1

                    block = Block(sprite.rect.x, sprite.rect.y, delta, delta)
                    sprite.kill()
                    blocks_farbig.add(block)
                    all_sprites.add(block)
                    in_blocks_spiel_feld = True

            if not in_blocks_spiel_feld:
                for sprite in blocks_farbig:
                    if sprite.rect.collidepoint(pos):
                        i, j = get_i_j(sprite.rect.x, sprite.rect.y)
                        spiel_feld[i][j] = 0

                        block = Block_empty(sprite.rect.x, sprite.rect.y, delta, delta)
                        sprite.kill()
                        blocks_spiel_feld.add(block)
                        all_sprites.add(block)

    ##########################################
    # Alles zeichnen
    ##########################################
    # Hintergrund zeichnen = alles löschen
    screen.fill([255,255,255])

    all_sprites.draw(screen)
    draw_matrix()
    py.display.update()
    clock.tick(fps)

##########################################
# Hauptschleife beendet -> Game Over
##########################################

##########################################
# Spiel ist beendet
##########################################
py.quit()

Tetris