Seite 1 von 1

Mehrere Funktionen untereinander verbinden

Verfasst: Mittwoch 13. April 2022, 16:09
von k-net
Hallo,

wenn ich z. B. folgendes Programm schreiben:

Code: Alles auswählen

import pygame

pygame.init()

WIDTH = 250
HIGHT = 250
AKTIV = True

BLACK = (0, 0, 0,)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

screen = pygame.display.set_mode((WIDTH, HIGHT))
pygame.display.set_caption("Hallo!")

player_x = 100
player_y = 100
player_color = WHITE


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


    player = pygame.draw.rect(screen, player_color, (player_x, player_y, 25, 25), 0)

    cube_topleft = pygame.draw.rect(screen, YELLOW, (5, 5, 25, 25), 0)
    cube_topright = pygame.draw.rect(screen, RED, (220, 5, 25, 25), 0)
    cube_bottomleft = pygame.draw.rect(screen, BLUE, (5, 220, 25, 25), 0)
    cube_bottomright = pygame.draw.rect(screen, GREEN, (220, 220, 25, 25), 0)

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]:
        player_x -= 0.1
    if pressed[pygame.K_RIGHT]:
        player_x += 0.1
    if pressed[pygame.K_UP]:
        player_y -= 0.1
    if pressed[pygame.K_DOWN]:
        player_y += 0.1

    if player.colliderect(cube_topleft):
        player_color = YELLOW
    if player.colliderect(cube_topright):
        player_color = RED
    if player.colliderect(cube_bottomleft):
        player_color = BLUE
    if player.colliderect(cube_bottomright):
        player_color = GREEN

    pygame.display.flip()

    screen.fill(BLACK)

    pygame.time.Clock()

pygame.quit()
Dann funktioniert das ja soweit problemlos.

Zum einen finde ich es aber nicht gut, alles in den Loop zu schreiben und spätestens wenn Programme komplexer werden, verliere ich da die Übersicht. Jetzt würde ich natürlich gerne mehrere Funktionen bilden, die dann jeweils nur im Loop aufgerufen werden. Zum Beispiel sowas hier:

Code: Alles auswählen

def cubes_corner():
    cube_topleft = pygame.draw.rect(screen, YELLOW, (5, 5, 25, 25), 0)
    cube_topright = pygame.draw.rect(screen, RED, (220, 5, 25, 25), 0)
    cube_bottomleft = pygame.draw.rect(screen, BLUE, (5, 220, 25, 25), 0)
    cube_bottomright = pygame.draw.rect(screen, GREEN, (220, 220, 25, 25), 0)
wenn ich die Funktion im Loop mit

Code: Alles auswählen

cubes_corner()
aufrufe, werden die Quadrate auch korrekt dargestellt, aber ich kann sie nicht mehr mit den Eingaben von Player interagieren lassen. Logisch, denn sie sind ja nur innerhalb der Funktion bekannt. Wie kann ich das ändern? Wenn man mehrere Funktionen hat mit mehreren Variablen, wie kann ich erreichen, dass in einer Funktion etwas geschieht, aufgrund von Eingaben oder Werten die in einer anderen Funktion oder im Loop aufgerufen werden?

Vielen Dank!

Re: Mehrere Funktionen untereinander verbinden

Verfasst: Mittwoch 13. April 2022, 21:39
von Dennis89
Hallo,
k-net hat geschrieben: Mittwoch 13. April 2022, 16:09 Wie kann ich das ändern? Wenn man mehrere Funktionen hat mit mehreren Variablen, wie kann ich erreichen, dass in einer Funktion etwas geschieht, aufgrund von Eingaben oder Werten die in einer anderen Funktion oder im Loop aufgerufen werden?
Allgemein hast du die Möglichkeit der Funktion beim Aufruf Objekte zu übergeben (nennt man Argumente). Mit diesen macht die Funktion dann was. Danach kann eine Funktion wieder Objekte an den Aufruf zurück geben

Code: Alles auswählen

def calculate_something(a, b):
    return a ** 2 + b ** 2


def main():
    c_square = calculate_something(5, 4)
    print(c_square)


if __name__ == "__main__":
    main()
'calculate_something' wir aufgerufen und bekommt die Argumente 5 und 4 übergeben. In der Funktion sie die Werte an die Namen 'a' und 'b' gebunden. 'return' gibt dann etwas zurück, in dem Fall die Berechnung von a^2 + b^2. Die Rückgabe ist dann in der aufgerufenen Funktion verfügbar, in dem Fall unter dem Name 'c_square'. Damit kannst du dann wieder was machen.

Ich hoffe das hilft dir weiter.

Grüße
Dennis

Re: Mehrere Funktionen untereinander verbinden

Verfasst: Freitag 15. April 2022, 13:33
von k-net
Danke, das hat es!

Ich habe es jetzt so umgesetzt:

Code: Alles auswählen

import pygame

pygame.init()

WIDTH = 250
HIGHT = 250
AKTIV = True

BLACK = (0, 0, 0,)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

screen = pygame.display.set_mode((WIDTH, HIGHT))
pygame.display.set_caption("Hallo!")

player_x = 100
player_y = 100
player_color = WHITE

def cubes_corner(arg1, arg2, arg3, arg4):
    return pygame.draw.rect(arg1, arg2, (arg3), arg4)



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

    player = pygame.draw.rect(screen, player_color, (player_x, player_y, 25, 25), 0)

    cube_topleft = cubes_corner(screen, YELLOW, (5, 5, 25, 25), 0)
    cube_topright = cubes_corner(screen, RED, (220, 5, 25, 25), 0)
    cube_bottomleft = cubes_corner(screen, BLUE, (5, 220, 25, 25), 0)
    cube_bottomright = cubes_corner(screen, GREEN, (220, 220, 25, 25), 0)

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]:
        player_x -= 0.1
    if pressed[pygame.K_RIGHT]:
        player_x += 0.1
    if pressed[pygame.K_UP]:
        player_y -= 0.1
    if pressed[pygame.K_DOWN]:
        player_y += 0.1

    if player.colliderect(cube_topleft):
        player_color = YELLOW
    if player.colliderect(cube_topright):
        player_color = RED
    if player.colliderect(cube_bottomleft):
        player_color = BLUE
    if player.colliderect(cube_bottomright):
        player_color = GREEN

    pygame.display.flip()

    screen.fill(BLACK)

    pygame.time.Clock()

pygame.quit()
Hattest du quasi an soetwas gedacht?

Gruß und Dank!

Re: Mehrere Funktionen untereinander verbinden

Verfasst: Samstag 16. April 2022, 13:23
von __blackjack__
@k-net: Das sieht ein bisschen sinnfrei aus, die Funktion macht ja nicht wirklich etwas eigenes sondern exakt was `pygame.draw.rect()` macht. Ein Alias könnte man auch kürzer und effizienter definieren:

Code: Alles auswählen

cubes_corner = pygame.draw.rect
Wobei der Name keine Tätigkeit beschreibt, was Funktions- und Methodennamen üblicherweise tun sollten. Das scheint mir nicht zum Verständnis beizutragen.