Files

168 lines
5.9 KiB
Python

import pygame
import random
import sys
import time
# Konfiguration des Labyrinths
CELL_SIZE = 40
COLS = 15
ROWS = 15
WIDTH = COLS * CELL_SIZE
HEIGHT = ROWS * CELL_SIZE
# Farben
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# Richtungsdefinitionen
DIRS = {'N': (0, -1), 'S': (0, 1), 'E': (1, 0), 'W': (-1, 0)}
OPPOSITE = {'N': 'S', 'S': 'N', 'E': 'W', 'W': 'E'}
class Cell:
def __init__(self, col, row):
self.col = col
self.row = row
self.walls = {'N': True, 'S': True, 'E': True, 'W': True}
self.visited = False
def generate_maze():
# Erzeuge ein Gitter von Zellen
grid = [[Cell(col, row) for row in range(ROWS)] for col in range(COLS)]
stack = []
current = grid[0][0]
current.visited = True
while True:
neighbours = []
for direction, (dx, dy) in DIRS.items():
nx = current.col + dx
ny = current.row + dy
if 0 <= nx < COLS and 0 <= ny < ROWS:
neighbour = grid[nx][ny]
if not neighbour.visited:
neighbours.append((direction, neighbour))
if neighbours:
direction, next_cell = random.choice(neighbours)
current.walls[direction] = False
next_cell.walls[OPPOSITE[direction]] = False
stack.append(current)
next_cell.visited = True
current = next_cell
elif stack:
current = stack.pop()
else:
break
# Öffnungen: Start links (oben links) und Ziel rechts (unten rechts)
grid[0][0].walls['W'] = False
grid[COLS - 1][ROWS - 1].walls['E'] = False
return grid
def draw_maze(screen, grid):
for col in range(COLS):
for row in range(ROWS):
x = col * CELL_SIZE
y = row * CELL_SIZE
cell = grid[col][row]
# Zeichne Wände
if cell.walls['N']:
pygame.draw.line(screen, WHITE, (x, y), (x + CELL_SIZE, y), 2)
if cell.walls['S']:
pygame.draw.line(screen, WHITE, (x, y + CELL_SIZE), (x + CELL_SIZE, y + CELL_SIZE), 2)
if cell.walls['E']:
pygame.draw.line(screen, WHITE, (x + CELL_SIZE, y), (x + CELL_SIZE, y + CELL_SIZE), 2)
if cell.walls['W']:
pygame.draw.line(screen, WHITE, (x, y), (x, y + CELL_SIZE), 2)
def main():
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Labyrinth-Spiel")
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 24)
grid = generate_maze()
# Startposition des Balls (in der Mitte der Startzelle)
ball_col, ball_row = 0, 0
ball_x = ball_col * CELL_SIZE + CELL_SIZE // 2
ball_y = ball_row * CELL_SIZE + CELL_SIZE // 2
ball_radius = CELL_SIZE // 4
show_maze = False
start_time = None
game_over = False
while True:
dt = clock.tick(30) / 1000.0 # Zeit seit dem letzten Frame
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if not show_maze and event.key == pygame.K_SPACE:
# Starte das Spiel: Labyrinth anzeigen und Timer starten
show_maze = True
start_time = time.time()
elif show_maze and not game_over:
new_col, new_row = ball_col, ball_row
if event.key == pygame.K_UP:
new_row -= 1
direction = 'N'
elif event.key == pygame.K_DOWN:
new_row += 1
direction = 'S'
elif event.key == pygame.K_LEFT:
new_col -= 1
direction = 'W'
elif event.key == pygame.K_RIGHT:
new_col += 1
direction = 'E'
else:
direction = None
if direction is not None:
# Prüfe, ob die Bewegung innerhalb des Gitters liegt und ob keine Wand im Weg ist
if 0 <= new_col < COLS and 0 <= new_row < ROWS:
current_cell = grid[ball_col][ball_row]
if not current_cell.walls[direction]:
ball_col, ball_row = new_col, new_row
ball_x = ball_col * CELL_SIZE + CELL_SIZE // 2
ball_y = ball_row * CELL_SIZE + CELL_SIZE // 2
screen.fill(BLACK)
if show_maze:
draw_maze(screen, grid)
# Markiere Start (grün) und Ziel (rot)
pygame.draw.rect(screen, GREEN, (0, 0, CELL_SIZE, CELL_SIZE))
pygame.draw.rect(screen, RED, ((COLS - 1) * CELL_SIZE, (ROWS - 1) * CELL_SIZE, CELL_SIZE, CELL_SIZE))
# Zeichne den Ball
pygame.draw.circle(screen, BLUE, (ball_x, ball_y), ball_radius)
# Zeige Timer an
if start_time is not None:
elapsed = time.time() - start_time
timer_text = font.render(f"Zeit: {elapsed:.1f} sec", True, WHITE)
screen.blit(timer_text, (10, HEIGHT - 30))
# Überprüfe, ob das Ziel erreicht wurde
if ball_col == COLS - 1 and ball_row == ROWS - 1:
game_over = True
over_text = font.render("Gewonnen!", True, WHITE)
screen.blit(over_text, (WIDTH // 2 - 40, HEIGHT // 2))
else:
# Vor dem Start: Zeige Instruktion an
text = font.render("Drücke SPACE zum Starten", True, WHITE)
screen.blit(text, (WIDTH // 2 - 100, HEIGHT // 2))
pygame.display.flip()
if __name__ == "__main__":
main()