## Kapitel 18 – Ereignisse und Kollisionen

# Seite 237 – Ereignisse und Kollisionen
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Krebs – Startversion")

font = pygame.font.SysFont(None, 60)

# Krebs
krebs_text = "(\\°-°/)"
krebs_color = (200, 0, 0)
krebs_x = 300
krebs_y = 420
krebs_speed = 6

clock = pygame.time.Clock()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Steuerung
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        krebs_x -= krebs_speed
    if keys[pygame.K_RIGHT]:
        krebs_x += krebs_speed

    # Begrenzung
    krebs_x = max(0, min(krebs_x, 530))

    # Zeichnen
    screen.fill((180, 220, 255))
    krebs = font.render(krebs_text, True, krebs_color)
    screen.blit(krebs, (krebs_x, krebs_y))

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

# Seite 239 – Da fällt was runter …!
# Blase (oben)
blase_text = "o"
blase_color = (0, 0, 200)
blase_x = random.randint(0, 600)
blase_y = -50
blase_speed = 3

# Seite 240 – Da fällt was runter …!
punkte = 0

# Seite 240 – Da fällt was runter …!
    # Blase nach unten bewegen
    blase_y += blase_speed

    # … unten angekommen
    if blase_y > 480:
        blase_y = -50
        blase_x = random.randint(0, 600)

# Seite 240 – Da fällt was runter …!
    # Kollision prüfen
    krebs_rect = pygame.Rect(krebs_x, krebs_y, 60, 40)
    blase_rect = pygame.Rect(blase_x, blase_y, 40, 40)

# Seite 240 – Da fällt was runter …!
    if krebs_rect.colliderect(blase_rect):
        punkte += 1
        blase_y = -50
        blase_x = random.randint(0, 600)

# Seite 241 – Da fällt was runter …!
    krebs = font.render(krebs_text, True, krebs_color)
    blase = font.render(blase_text, True, blase_color)

    screen.blit(krebs, (krebs_x, krebs_y))
    screen.blit(blase, (blase_x, blase_y))

# Seite 241 – Da fällt was runter …!
    # Punkte anzeigen
    punkte_anzeige = font.render(str(punkte), True, (0, 0, 0))
    screen.blit(punkte_anzeige, (10, 10))

# Seite 242 – Da fällt was runter …! Programm am Stück
import pygame
import random

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Krebs & Blasen")

font = pygame.font.SysFont(None, 60)

krebs_text = "(\\°-°/)"
krebs_color = (200, 0, 0)
krebs_x, krebs_y, krebs_speed = 300, 420, 6

blase_text = "o"
blase_color = (0, 0, 200)
blase_x = random.randint(0, 600)
blase_y = -50
blase_speed = 3

punkte = 0
clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        krebs_x -= krebs_speed
    if keys[pygame.K_RIGHT]:
        krebs_x += krebs_speed
    krebs_x = max(0, min(krebs_x, 530))
    blase_y += blase_speed
    if blase_y > 480:
        blase_y = -50
        blase_x = random.randint(0, 600)

    krebs_rect = pygame.Rect(krebs_x, krebs_y, 100, 40)

    blase_rect = pygame.Rect(blase_x, blase_y, 40, 40)
    if krebs_rect.colliderect(blase_rect):
        punkte += 1
        blase_y = -50
        blase_x = random.randint(0, 600)

    screen.fill((180, 220, 255))

    krebs = font.render(krebs_text, True, krebs_color)
    blase = font.render(blase_text, True, blase_color)
    screen.blit(krebs, (krebs_x, krebs_y))
    screen.blit(blase, (blase_x, blase_y))
    punkte_anzeige = font.render(str(punkte), True, (0, 0, 0))
    screen.blit(punkte_anzeige, (10, 10))

    pygame.display.flip()
    clock.tick(60)
pygame.quit()

# Seite 244 – Hüte dich vor den roten Kugeln
import pygame
import random

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Krebs & Blasen")

font = pygame.font.SysFont(None, 60)

# Krebs
krebs_text = "(\\°-°/)"
krebs_color = (200, 0, 0)
krebs_x = 300
krebs_y = 420
krebs_speed = 6

# Blase
blase_text = "o"
blase_x = random.randint(0, 600)
blase_y = -50
blase_speed = 3

# Farbe und Position der Blase
def neue_blase():
    x = random.randint(0, 600)
    y = -50
    if random.random() < 0.75:
        farbe = (0, 0, 200)
    else:
        farbe = (200, 0, 0)
    return x, y, farbe

blase_x, blase_y, blase_color = neue_blase()

punkte = 0
clock = pygame.time.Clock()
running = True
game_over = False

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False


    if not game_over:
        # Steuerung
        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT]:
            krebs_x -= krebs_speed
        if keys[pygame.K_RIGHT]:
            krebs_x += krebs_speed

        krebs_x = max(0, min(krebs_x, 530))

        # Blase bewegen
        blase_y += blase_speed

        # Neue Blase, wenn unten
        if blase_y > 480:
            blase_x, blase_y, blase_color = neue_blase()

        # Kollision
        krebs_rect = pygame.Rect(krebs_x, krebs_y, 100, 40)
        blase_rect = pygame.Rect(blase_x, blase_y, 40, 40)

        if krebs_rect.colliderect(blase_rect):
            if blase_color == (200, 0, 0):  # rote Blase
                game_over = True
            else:
                punkte += 1
                blase_x, blase_y, blase_color = neue_blase()

    # Zeichnen
    screen.fill((180, 220, 255))

    krebs = font.render(krebs_text, True, krebs_color)
    blase = font.render(blase_text, True, blase_color)

    screen.blit(krebs, (krebs_x, krebs_y))
    screen.blit(blase, (blase_x, blase_y))

    # Punkte
    punkte_anzeige = font.render(str(punkte), True, (0, 0, 0))
    screen.blit(punkte_anzeige, (10, 10))

    # Game Over
    if game_over:
        go = font.render("GAME OVER", True, (255, 0, 0))
        screen.blit(go, (200, 200))

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

# Seite 248 – Im Tal der tanzenden Bälle
import pygame
pygame.init()

WIDTH, HEIGHT = 600, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

class Ball:
    # hier fehlt noch einiges
    pass

ball1 = Ball(100, 100, 3, 3, 20, (255, 0, 0))
ball2 = Ball(150, 150, 1, 5, 30, (0, 80, 150))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    ball1.update()
    ball2.update()

    screen.fill((90, 140, 255))
    ball1.draw(screen)
    ball2.draw(screen)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

# Seite 250 – Die Magie liegt in der Klasse
class Ball:
    def __init__(self, x, y, dx, dy, radius, farbe):
        pass

    def update(self):
        pass

    def draw(self, surface):
        pass

# Seite 250 – Die Magie liegt in der Klasse
class Ball:
# Hier haben wir den Konstruktor
    def __init__(self, x, y, dx, dy, radius, farbe):
        self.x = x
        self.y = y
        self.dx = dx
        self.dy = dy
        self.radius = radius
        self.color = farbe

    def update(self):
        self.x += self.dx
        self.y += self.dy

        if self.x < self.radius or self.x > WIDTH - self.radius:
            self.dx = -self.dx
        if self.y < self.radius or self.y > HEIGHT - self.radius:
            self.dy = -self.dy

    def draw(self, surface):
        pygame.draw.circle(surface, self.color, (self.x, self.y),self.radius)

# Seite 251 – Grafiken gehen natürlich auch
class Ball:
    def __init__(self, x, y, dx, dy, radius, bilddatei):
        self.x = x
        self.y = y
        self.dx = dx
        self.dy = dy
        self.radius = radius

        self.image = pygame.image.load(bilddatei).convert_alpha()
        self.image = pygame.transform.scale(self.image, (radius * 2,radius * 2))

# Seite 252 – Grafiken gehen natürlich auch
    def update(self):
        self.x += self.dx
        self.y += self.dy

        if self.x < self.radius or self.x > WIDTH - self.radius:
            self.dx = -self.dx
        if self.y < self.radius or self.y > HEIGHT - self.radius:
            self.dy = -self.dy


    def draw(self, surface):
        surface.blit(self.image, (self.x - self.radius, self.y -self.radius))

# Seite 252 – Grafiken gehen natürlich auch
ball1 = Ball(100, 100, 3, 3, 20, "ball.png")
ball2 = Ball(150, 150, 1, 5, 30, "ball.png")

