V0.1
Labyrinthgenerierung: Es wird ein „perfektes“ Labyrinth erstellt (ohne Schleifen), das dennoch Sackgassen enthalten kann. Steuerung: Mit den Pfeiltasten bewegst Du den Ball, wobei vor jedem Schritt geprüft wird, ob eine Wand den Weg blockiert. Timer & Anzeige: Vor Spielstart bleibt das Labyrinth unsichtbar. Erst nach Drücken der Leertaste wird es angezeigt und der Timer startet.
This commit is contained in:
167
Labyrinth
Normal file
167
Labyrinth
Normal file
@@ -0,0 +1,167 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user