Bei dem `quit()` ganz am Ende habe ich ein Dejavu.
Und ja, Namen sind wichtig! Das ist keine Kosmetik, das ist wichtig um Quelltext zu verstehen und nicht selten auch um szu merken, wenn man etwas was man da programmiert, selbst nicht ganz verstanden hat.
Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahemen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
`asteroid` (Einzahl) ist kein passender Name für eine Liste mit Asteroiden (Mehrzahl).
`gameExit` wird definiert und dann nur in der nächsten Zeile verwendet, nirgends sonst. Wenn man den Wert dort einsetzt, steht da ``while not False:``, was man direkter und kürzer als ``while True:`` schreiben kann.
`crashed` wird nirgends verwendet. An der Stelle möchte man vielleicht die Funktion verlassen.
In `astMove()` willst Du nicht das Display aktualisieren. Die Funktion sollte die Asteroiden bewegen, *das* gibt der Name her. Mehr nicht.
Hier ist auch wieder so eine komische ``while``-Schleife mit einem `insert()` in die Liste. Du willst doch alle Asteroiden bewegen und nicht am Ende eine Liste mit doppelt so vielen Asteroiden haben. Wie schon gesagt wurde, verändert man Listen in der Regel auch nicht. Man erstellt einfach eine *neue* Liste, mit den veränderten Asteroiden. Und die gibt man dann als Ergebnis an den Aufrufer zurück.
`ast` ist auch eine blöde Abkürzung. Vor allem weil diese Abkürzung in der Informatik eine Bedeutung hat: „abstrakt syntax tree”. Wenn Du `asteroid` (oder `asteroids`) meinst, dann schreib das auch, schon ist keiner verwirrt was das wohl bedeuten mag.
`createAst()` sollte die Liste der Asteroiden gar nicht übergeben bekommen. Die wird doch von der Funktion überhaupt nicht benötigt um ihre Aufgabe zu erfüllen. Die braucht nur den Asteroiden erstellen und zurück geben. Wobei sie das bei Dir ja sogar schon tut, nur das Du damit dann gar nichts machst.
`asteroids` ist kein guter Name für eine Funktion. Das ist keine Tätigkeit. `blit_asteroids()` wäre beispielsweise passender.
``asteroids[len(asteroids)-1]`` ist eine umständliche Schreibweise für ``asteroids[-1]``. Und mir ist nicht ganz klar warum Du immer den letzten Asteroiden für jeden Asteroiden in der Liste blitten willst‽ Und schon wieder so ein ``while`` mit manuellem Zähler. Das ist einfach nur eine ``for``-Schleife über die Asteroiden. Dabei kann man die auch gleich auf Namen entpacken.
Und das `Surface` auf dem geblittet werden soll, muss als Argument übergeben werden.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import random
import time
import pygame
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 600
ASTEROID_IMAGE = pygame.image.load('asteroidC.png')
DIFFICULTY = 10
def moved_asteroids(asteroids):
return [(x - speed, y, speed) for x, y, speed in asteroids]
def create_asteroid():
return (DISPLAY_WIDTH, random.randint(0, DISPLAY_HEIGHT), 3)
def blit_asteroids(screen, asteroids):
for x, y, _ in asteroids:
screen.blit(ASTEROID_IMAGE, (x, y))
def game_loop(screen):
asteroids = list()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
asteroids = moved_asteroids(asteroids)
while len(asteroids) < DIFFICULTY:
asteroids.append(create_asteroid())
screen.fill(0, 0, 0)
blit_asteroids(screen, asteroids)
pygame.display.update()
def main():
pygame.init()
try:
screen = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT))
game_loop(screen)
finally:
pygame.quit()
if __name__ == '__main__':
main()
Man will da vielleicht noch beim `moved_asteroids()` einbauen das Asteroiden die aus dem Bildschirm geflogen sind, nicht in die Rückgabeliste aufgenommen werden.
Das Problem bei unvollständigen Problembeschreibungen ist, das man hier jetzt Beispielsweise vorher nicht wusste, dass es die `Rect`-Klasse und die Sachen aus dem `sprites`-Modul gibt. Man würde hier nämlich dann für die Position ein `Rect`-Objekt nehmen, das Bild und die Position in ein `Sprite`-Objekt stecken, und die Asteroiden in eine Sprite-Gruppe.