×
produktlogotitle

 DOWNLOADSEITE

Seite: ha_aufgabe2
Diese Seite wurde aktualisiert am 17.08.2025

LOGIN
Benutzer:
Passwort:
 
Geogebra-
   ifwp.net-schulbuch.de
Startseite Projekte Projekte: Kapitel 1 Diese Seite wurde aktualisiert am 17.08.2025

Pygame - Aufgaben 2

Icon 2 Sterne 30x30 Aufgabe 1

In dieser Aufgabe sollst du dein erstes Spiel entwickeln. Vom "Himmel" fallen Bälle herunter, die du möglichst schnell entfernst, indem du mit der Maus darauf klickst. Verschwindet ein Ball aus der Zeichnfläche wird er automatisch wieder nach oben gesetzt und erscheint wieder. Das Spiel soll beendet sein, wenn alle Bälle geklickt wurden. Die Zeit, die du benötigst, wird gemessen (s. Video).

  1. Kopiere das Programm 9 aus dem Abschnitt Maus-Click-Events und füge es in Webtigerpython ein.
  2. Verändere die Funktion get_random_circle_list so, dass die Kreise alle oberhalb der sichtbaren Zeichenfläche liegen (zwischen -radius und -2*HEIGHT). Setze die Bewegung dy in y-Richtung  auf einen Zufallswert zwischen 2 und 5, setze den Zufallswert für den Radius auf einen Wert zwischen 20 und 50.  
  3. Die Kreise sollen sich jetzt nach unten bewegen. Wenn du auf sie klickst, verschwinden sie vom Bildschirm.
    Verwende move_circle aus Programm 5 im Einführungskapitel
  4. Die Kreise, die du nicht weggeklickt hast, laufen unten aus der Zeichenfläche heraus. Schreibe eine Funktion move_circle_up(circle) , die den Kreis wieder nach oben verschiebt (y auf Zufallswert zwischen -radius und -HEIGHT setzen).
  5. Jetzt fehlt nur noch die Zeitanzeige. 
    Mit folgender Funktion zeichnest du den Text txt an der Position (x,y) in der Farbe col und der Größe size auf die Zeichenfläche.
    def draw_text(screen, txt, x, y, col, size):
        font = pygame.font.Font(None, size)
        text_surface = font.render(txt, True, col)
        screen.blit(text_surface, (x, y))

    Die Zeit vom Start des Programms kann mit folgender Anweisungsfolge bestimmt werden.
    start_ticks = pygame.time.get_ticks()#Zu beginn des Programms
    ...
    end_ticks = pygame.time.get_ticks()#Wenn die abgelaufene Zeit angezigt werden soll
    time = (end_ticks - start_ticks) / 1000
    draw_text(screen, str(time), .....
    Mit get_ticks fragt man den Wert eines Timers ab, der in Millisekunden zählt und nach Abschluss von init gestartet wird.

    Erweitere das Programm nun um die Zeitanzeige. Wenn die Kreisliste die Länge 0 hat, soll das Programm beendet werden.
  6. Du kannst das Programm selbstverständlich noch erweitern. Hier sind einige Vorschläge:
    - Erhöhung der Geschwindigkeit der Kreise durch Vergößerung von dy.
    - Beim Zurücksetzen nach Oben auch die x-Koordinate ändern.
    - Bälle in den Farben rot und blau, nur die roten dürfen geklickt werden.

 

 
Icon 2 Sterne 30x30 Aufgabe 2   

Auf der Zeichenfläche befindet sich eine Röhre in Form eines Rechtecks und ein Kreis. Der Kreis soll mit der Maus bis zum Ende der Röhre bewegt werden, ohne dass der Rand der Röhre berührt wird. Im Falle einer Berührung wird das Programm beendet. Schreibe ein Python-Programm.

Der Kreis berührt den Röhrenrand, wenn er nicht vollständig in der Röhre liegt.

Aufgabe 3   

Auf der Zeichenfläche befinden sich ein Kreis und ein Quadrat. Der Durchmesser des Kreises ist etwas kleiner als die Seitenlänge des Quadrats. Der Kreis kann mit der Maus verschoben werden. Das Programm ist beendet, wenn der Kreis vollständig im Quadrat liegt.

 

Verwende Programm 10 als Grundlage

Die folgende Funktion prüft, ob ein Kreis vollständig in einem Rechteck liegt.
def circle_in_rect(circle, rect):
    radius = circle["radius"]
    d1 = circle["x"]-rect["r"][0]
    d2 = rect["r"][0]+rect["r"][2]-circle["x"]
    d3 = circle["y"]-rect["r"][1]
    d4 = rect["r"][1]+rect["r"][2]-circle["y"]
    return d1 > radius and d2 > radius and d3 > radius and d4 > radius


Aufgabe 4   

Auf dem Tablet kann man nicht die rechte Maustaste drücken, um ein Pygame-Programm zu beenden. Dies soll durch einen Button möglich sein.

  1. Erweitere das Programm 1 so, dass oben rechts in der Ecke des Grafikfensters ein kleiner quadratischer Button mit der Aufschrift X erscheint. Ein Klick auf diesen Button soll das Programm beenden.
  2. Erweitere das Programm so, dass mithilfe einer Funktion title(screen, name) der Name des Programms oben im Grafikfenster angezeigt wird.
Icon 2 Sterne 30x30 Aufgabe 5  

In dieser Aufgabe sollst du dass Malen-Programm (Programm 12) erweitern

  1. Erweitere das Programm um zwei Buttons mit den Farben gelb und schwarz
  2. Erweitere das Programms um zwei Buttons schmal und breit, die die Linienbreite auf 3 Pixel bzw. 15 Pixel setzen. Die aktive Linienbreite wird durch eine kurze Linie mit der gewählten Breite und Farbe anstelle der aktiven Farbe angezeigt. 
Icon 3 Sterne 30x30 Aufgabe 6   

a. Starte das folgende Programm in WebTigerPython und analysiere es sorgfältig.

b. Fülle den folgenden Lückentext aus.

Mit dem Programm kann man mit der Maus
 Linien zeichnen. Eine Linie beginnt an der Position, an der die linke Maustaste
wurde und endet an der Postion, an der die Maustaste
 wurde. Während die Maustaste gedrückt ist, wird eine
 Linie vom Startpunkt bis zur aktuellen
gezeichnet. Wenn die Maustaste losgelassen wird, wird die Linie endgültig in
gezeichnet. Die Variable
hat als Wert den Anfangspunkt einer Linie und
den momentanen Endpunkt. Die Variable
wird auf True gesetzt, wenn die
Maustaste losgelassen wurde. Die Variable
hat solange den Wert
wie die linke Maustaste gedrückt ist. Alle diese Variablen erhalten ihre Werte als Rückgabe von der Funktion
. Die gezeichneten Linien werden in einer Liste mit dem Namen
gespeichert. Jede Linie wird als
 in die Liste eingefügt. Das Programm wird durch Drücken der
Maustaste beendet.
gerade
gedrückt
losgelassen
blaue
Mausposition
rot
from_pos
to_pos
new_line
linke
drawing
True
handle_events
lines
Dictionary
rechten
krumme

c. Verändere das Programm so, das nicht Linien, sondern nicht gefüllte Rechtecke mit der Liniebreite 3 gezeichnet werden.

Du musst lediglich die Funktionen get_line, draw_line  in get_rect und draw_rect ändern und die Koordinaten des Linienendpunktes durch Breite und Höhe des Rechtecks ersetzen.  Außerdem muss du in der Funktion main einige Namen und die Aufrufe dieser Funktionen ändern.

 

import pygame

WIDTH = 650
HEIGHT = 450
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
LIGHTGREY = (240, 240, 240)


def init():
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    screen.fill(LIGHTGREY)
    pygame.display.flip()
    return screen


def handle_events(drawing, from_pos):
    to_pos =pygame.mouse.get_pos()
    for event in pygame.event.get(): 
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:  # Linke Maustaste
                drawing = True
                from_pos = event.pos
                return True, drawing, from_pos, to_pos, False
            elif event.button == 3:  # Rechte Maustaste
                return False, drawing, from_pos, None, False
        elif event.type == pygame.MOUSEBUTTONUP:
            if event.button == 1:
                drawing = False
                return True, drawing, from_pos, event.pos, True
    return True, drawing, from_pos, to_pos, False



def get_line(start_x, start_y,end_x, end_y, color):
    return {"sx":start_x, "sy":start_y, "ex":end_x, "ey":end_y, "color":color}

def draw_line(screen, line):
    pygame.draw.line(screen, line["color"], (line["sx"], line["sy"]), (line["ex"], line["ey"]), 3)

def main():
    clock = pygame.time.Clock()
    screen = init()
    drawing = False
    from_pos = None
    to_pos = None
    running = True
    lines = []
    while running:
        # Events verarbeiten
        running, drawing, from_pos, to_pos, new_line = handle_events(drawing, from_pos)
        screen.fill(LIGHTGREY)
        if new_line:
            lines.append(get_line(from_pos[0], from_pos[1], to_pos[0], to_pos[1], RED))
        for line in lines:
                draw_line(screen, line)
        # Zeichnen nur in main - nur wenn beide Positionen gültig sind
        if drawing and from_pos and to_pos:
            draw_line(screen, get_line(from_pos[0], from_pos[1], to_pos[0], to_pos[1], BLUE))
        pygame.display.flip()
        clock.tick(60)
    pygame.quit()

main()

Aufgabe 7  

Mit folgendem (unvollständigen) Programm, soll sich eine Kugel auf der Zeichenfläche bewegen und an den Rändern abprallen. Den blauen Schläger, an dem die Kugel abprallt, kann man mit der Rechts- und der Linkspfeiltaste bewegen. Es soll verhindert werden, dass die Kugel den unteren Rand berührt.

  1. Vervollständige die Funktion handleEvents und die fehlenden Zuweisungen in der Funktion main in WebTigerPython.
  2. Erweitere das Programm so, dass es beendet wird, sobald die Kugel den unteren Rand der Zeichenfläche berührt.

 

import pygame

WIDTH = 650
HEIGHT = 450
WHITE = (255, 255, 255)
BLACK = (0, 0, 0, 0)
RED = (255, 0, 0, 0)
GREEN= (0, 255, 0)
BLUE = (0, 0, 255)
LIGHTGREY = (240, 240, 240)


def init():
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    screen.fill(LIGHTGREY)  # Schwarzer Hintergrund
    pygame.display.flip()
    return screen

def get_circle_dict(x, y, r, col, dx, dy):
    return {"x":x, "y":y, "radius": r, "color":col,"dx":dx, "dy":dy}
    
def draw_circle(screen,c):
    pygame.draw.circle(screen, c["color"], ( c["x"],c["y"]), c["radius"])
 
def get_rect_dict(x, y, w, h, col, dx, dy):
    return {"x":x, "y":y, "width": w, "height": h, "color":col,"dx":dx, "dy":dy}
    
def draw_rect(screen,r):
    pygame.draw.rect(screen, r["color"], ( r["x"],r["y"], r["width"], r["height"]))


def move_rect(keys_pressed, rect):
    if keys_pressed[pygame.K_LEFT]:
        if rect["x"] > 0:
            rect["x"] = rect["x"] - rect["dx"]
    elif keys_pressed[pygame.K_RIGHT]:
        if rect["x"]+rect["width"]<=WIDTH:
            rect["x"] = rect["x"] + rect["dx"]
    return rect

def move_circle(circle):
    circle["x"] = circle["x"] + circle["dx"]
    circle["y"] = circle["y"] + circle["dy"]
    return circle
 
def edge_left_right(circle):
    if circle["x"] + circle["radius"] >= WIDTH or circle["x"] - circle["radius"] <= 0:
        circle["dx"] = circle["dx"] * -1
    return circle

def edge_up_down(circle):
   if circle["y"] + circle["radius"] > HEIGHT or circle["y"] - circle["radius"] < 0:
        circle["dy"] = circle["dy"] * -1
   return circle

def handle_events(keys_pressed):
    #hier vervollständigen
    return True, keys_pressed

def circle_intersects_rect(c, r):
    if c["y"]+c["radius"]>=r["y"] and c["x"] >= r["x"] and r["x"]+r["width"]>=c["x"]:
        #c["dx"]=c["dx"]* -1
        c["dy"]=c["dy"]* -1
    return c

def main():
    clock = pygame.time.Clock()
    screen = init()
    circle = get_circle_dict(200, 300, 15, RED,3, 3)
    rect =  get_rect_dict(WIDTH // 2 - 60, HEIGHT - 30, 120, 15, BLUE, 5, 0)
    running = True
    keys_pressed = {pygame.K_RIGHT:False, pygame.K_LEFT:False, pygame.K_UP:False,pygame.K_DOWN:False}
    
    while running:
        screen.fill(LIGHTGREY)
        running, keys_pressed = handle_events(keys_pressed)
       
        draw_rect(screen,rect)
        rect = move_rect(keys_pressed,rect)
        circle =#vervollständigen
        circle = #vervollständigen
        circle =#vervollständigen
        circle =#vervollständigen
        draw_circle(screen, circle)
        clock.tick(60)
        pygame.display.flip()
    pygame.quit()

main()
      
    

Impressum
© 2023  Net-Schulbuch.de

10.07  0.0977  8.1.33