Konzept: Funktionen, Parameter und Rückgabewerte#

Bisher hast du Methoden wie on_setup oder act verwendet, die zu einer World oder einem Actor gehören. Jetzt lernst du, wie du eigene Funktionen erstellen kannst. Funktionen sind Unterprogramme, mit denen du Code wiederverwenden kannst, statt ihn zu wiederholen.


Erstes Beispiel#

Du möchtest vier rote Kreise erstellen, wie hier gezeigt:

import miniworlds 

world = miniworlds.World(80, 80)

c1 = Circle((20, 20), 20)
c1.color = (255, 0, 0)
c2 = Circle((60, 20), 20)
c2.color = (255, 0, 0)
c3 = Circle((60, 60), 20)
c3.color = (255, 0, 0)
c4 = Circle((20, 60), 20)
c4.color = (255, 0, 0)

world.run()

Das funktioniert – aber wenn du alle vier grün machen möchtest, müsstest du vier Zeilen ändern. Stattdessen kannst du eine Funktion verwenden:

import miniworlds 

world = World(80, 80)

def create_circle(x, y):
    c = miniworlds.Circle((x, y), 20)
    c.color = (255, 0, 0)

create_circle(20, 20)
create_circle(60, 20)
create_circle(60, 60)
create_circle(20, 60)

world.run()

Allgemein: Funktionen definieren#

Wenn du komplexe Aufgaben automatisieren willst – wie das Erstellen mehrerer Actors – definierst du eine Funktion:

def function_name(parameters):
    code_block

Beispiel:

def create_circle(x, y):
    c = Circle((x, y), 20)
    c.color = (255, 0, 0)

Erklärung:

  • Funktionsname: create_circle

  • Parameter: x, y → werden beim Funktionsaufruf übergeben

  • Funktionskörper: wird von oben nach unten ausgeführt, wenn die Funktion aufgerufen wird


Funktionen aufrufen#

Um eine Funktion zu verwenden, schreibst du:

function_name(arguments)

Zum Beispiel:

create_actor(4, 2)

Komplexe Figuren zeichnen#

Mit Funktionen kannst du komplexe Figuren ganz einfach zeichnen:

import miniworlds 

world = miniworlds.World(400, 220)

def create_face(x, y):
    c = miniworlds.Circle((x, y), 40)
    c.color = (255, 255, 0)
    miniworlds.Circle((x + 15, y - 10), 10)
    miniworlds.Circle((x - 15, y - 10), 10)
    a = Arc((x, y + 20), 40, 20, 180, 360)
    a.center = a.position
    a.color = (255, 0, 0)

create_face(60, 60)
create_face(260, 60)
create_face(160, 160)

world.run()

Actors automatisch erstellen#

Dieses Beispiel zeigt, wie du mit Funktionen effizient mehrere Actors platzieren kannst:

import miniworlds 

world = miniworlds.TiledWorld()
world.rows = 8

def create_actor(x, y):
    t = Actor()
    t.position = (x, y)
    t.add_costume("images/player.png")

def create_wall(x, y):
    t = Actor()
    t.position = (x, y)
    t.add_costume("images/wall.png")

create_actor(4, 2)
create_wall(4, 4)
create_wall(5, 4)
create_wall(6, 4)
create_wall(6, 3)
create_wall(6, 2)
create_wall(6, 1)
create_wall(5, 1)
create_wall(4, 1)
create_wall(3, 1)

world.run()

Verhalten in Funktionen registrieren#

Dieses Beispiel erstellt zufällige Regentropfen, bei denen das Verhalten (registriert mit @c.register) innerhalb der Funktion definiert wird:

import miniworlds 
import random

world = miniworlds.World()
world.add_background((80, 180, 255))

def raindrop(x, y):
    c = miniworlds.Circle((x, y), random.randint(10, 20))
    c.color = (0, 0, random.randint(100, 255), 100)
    c.static = True

    @c.register
    def act(self):
        self.move_down(random.randint(1, 3))

    @c.register
    def on_detecting_not_on_world(self):
        self.remove()

@world.register
def act(self):
    if world.frame % 5 == 0:
        raindrop(random.randint(0, 400), 0)

world.run()

Rückgabewerte#

Bisher haben Funktionen einfach etwas getan. Mit einem Rückgabewert kannst du dir Informationen zurückgeben lassen.

Beispiel:

def is_even(x):
    if x % 2 == 0:
        return True
    else:
        return False

print(is_even(4))  # Output: True

Ein weiteres Beispiel: Färbe einen Kreis rot, wenn er auf der linken Hälfte des Bildschirms ist.

import miniworlds 
import random

world = miniworlds.World(400, 50)

def is_left(obj):
    if obj.x <= 200:
        return True
    else:
        return False

for i in range(20):
    x = random.randint(0, 400)
    y = 25
    c = miniworlds.Circle((x, y), 10)
    if is_left(c):
        c.color = (255, 0, 0)

world.run()