@xAMIx: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
``global`` bitte gleich wieder vergessen. Funktionen (und Methoden) sollten alles was sie ausser Konstanten benötigen, als Argument(e) übergeben bekommen. Ergebnisse werden als Rückgabewerte an den Aufrufer zurückgegeben.
Sowohl `punkt`, was wohl eher `punkte` heissen sollte, als auch `länge` sind überflüssig weil sie a) immer den gleichen Wert haben, und b) aus der Länge des Schlangenkörpers trivial berechenbar sind.
`kopf` ist im Grunde auch redundant, denn dafür könnte man einfach das erste Element von `KÖRPER` verwenden.
Du solltest Dir auch nicht angewöhnen so viel an Listen zu verändern. Statt beispielsweise die Elemente von `A` neu zu setzen, einfach ein neues Tupel mit Koordinaten für einen Apfel erstellen. Und das am besten in einer Funktion, weil der Code dafür im Moment an *zwei* Stellen im Code steht und sich auch noch unterscheidet.
Funktionen werden üblicherweise nach der Tätigkeit benannt, die sie ausführen. `apfel` ist ein guter Name für einen Wert der den/einen Apfel repräsentiert, nicht für eine Funktion die etwas tut. Und auch wenn `score()` auch eine Tätigkeit sein kann, es ist nicht das was die Funktion mit diesem Namen macht.
`exit()` muss man eigentlich aus `sys` importieren, aber man sollte das Programm an der Stelle nicht auf diese Art hart beenden. Ausserdem fehlt ein `pygame.quit()`-Aufruf.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import random
import pygame
def erzeuge_apfel():
return (random.randint(15, 385), random.randint(15, 435))
def zeichne_schlange(screen, koerper):
for x, y in koerper:
pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(x, y, 19, 19))
def bewege_schlange(screen, apfel, speed_x, speed_y, koerper):
pygame.draw.rect(screen, (0, 255, 0), (apfel[0], apfel[1], 15, 15))
koerper.insert(0, (koerper[0][0] + speed_x, koerper[0][1] + speed_y))
if (
koerper[0][0] + 19 >= apfel[0]
and koerper[0][0] - 19 <= apfel[0]
and koerper[0][1] + 19 >= apfel[1]
and koerper[0][1] - 19 <= apfel[1]
):
return erzeuge_apfel()
else:
koerper.pop()
return apfel
def zeichne_punktestand(screen, punkte):
font = pygame.font.SysFont("Arial Rounded MT Bold", 25)
color = (47, 79, 79)
screen.blit(font.render("SCORE: ", True, color), (25, 20))
screen.blit(font.render(str(punkte), True, color), (100, 20))
def main():
try:
pygame.init()
screen = pygame.display.set_mode((400, 450))
koerper = [(200, 200), (180, 200), (160, 200)]
start_laenge = len(koerper)
speed_x, speed_y = 0, 0
apfel = erzeuge_apfel()
while True:
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed_x = -0.3
speed_y = 0
if event.key == pygame.K_RIGHT:
speed_x = 0.3
speed_y = 0
if event.key == pygame.K_UP:
speed_x = 0
speed_y = -0.3
if event.key == pygame.K_DOWN:
speed_x = 0
speed_y = 0.3
zeichne_schlange(screen, koerper)
apfel = bewege_schlange(screen, apfel, speed_x, speed_y, koerper)
zeichne_punktestand(screen, len(koerper) - start_laenge)
pygame.display.flip()
finally:
pygame.quit()
if __name__ == "__main__":
main()
Dein Problem liegt nicht am `pop()`, denn die Länge des Körpers stimmt. Aber die Koordinaten nicht. Selbst wenn Du grundsätzliche Problem korrigierst. geht das mit 0.3 nicht wirklich, denn dadurch entstehen Koordinaten die weder zu den Spielweltkoordinaten passen (einzelne Schlangenglieder), noch zu den Koordinaten in denen gezeichnet wird (ganze Pixel).