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