Anfängerfehler!?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
markus.heinzer
User
Beiträge: 1
Registriert: Donnerstag 29. April 2021, 10:26

Hi, bin Neuling. Dieses Prog. bleibt bei Zeile 21 stehen, Meldung SyntaxError: bad input on line 21
import pygame
import sys

partikel = 25
schlange = [[13, 13][13, 14]]
richtung = 0

pygame.init()
clock = pygame.time.clock

screen = pygame.display.set_mode([700, 700])

def zeichner():
screen.fill((0, 102, 0))

kopf = True
for x in schlange:
Coords = [x[0] * partikel, x[1]* partikel]
if kopf:
pygame.draw.rect(screen, (0,0,0),(Coords[0], Coords[1], partikel, partikel, 0)
kopf = False
else:
pygame.draw.rect(screen, (47,79,79),(Coords[0], Coords[1], partikel, partikel, 0)
go = True
anhang = None
apfelInd = -1
ende = False
score = 0
while go:
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and richtung != 2:
richtung = 0
if event.key == pygame.K_RIGHT and richtung != 3:
richtung = 1
if event.key == pygame.K_DOWN and richtung != 0:
richtung = 2
if event.key == pygame.K_LEFT and richtung != 1:
richtung = 3
zahl = len(schlange)-1
for i in range(1, len(schlange)):
schlange [zahl] = schlange[zahl-1].copy()
zahl -= 1

if richtung == 0:
schlange[0][1] -= 1
if richtung == 1:
schlange[0][0] += 1
if richtung == 2:
schlange[0][1] += 1
if richtung == 3:
schlange[0][0] -= 1
if ende == False:
zeichner()
pygame.display.update()
else:
print("Du hast " + str(score) + "Punkte erreicht")
sys.exit()
clock.tick(10)
kann mir jemand helfen? Vielen Dank!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Programm bleibt nicht stehen, sondern der Compiler meldet einen Fehler, weil in der Zeile davor eine Klammer fehlt.

Zudem mischst Du in Deinem Programm globale Variablen und Konstanten wild durcheinander, so dass es schwierig ist, den Programmfluß zu verstehen. Alles was eine Funktion braucht, muß sie auch über ihre Argumente bekommen.
`x` ist ein schlechter Name für eine x-y-Koordinate.

Vergiss gleich, dass es sys.exit gibt, ein Programm beendet sich, wenn es die main-Funktion verläßt.
`go` ist immer True, also überflüssig.
`anhang`, `apfelInd` werden nie benutzt.
`ende` ist immer False.
Bei der Initialisierung von `schlange` fehlt ein Komma.

Die for-Schleife, in der Du `schlange` änderst, sieht komisch aus. Du definierst eine `zahl` und hast gleichzeitig ein `i`, das Du gar nicht benutzt.

Code: Alles auswählen

    for i in range(len(schlange)-1, 0, -1):
        schlange[i] = schlange[i-1].copy()
Dann machst Du Kopien von Listen, deren Original Du gleich danach wegwirfst.
Statt Kopien zu machen, würde man bei Bedarf neue Listen erzeugen, statt sie zu ändern.

Statt Strings mit + zusammenzustückeln benutzt man Formatstrings.

Bevor Du also weiter mit Deinem Programm machst, solltest Du es ersteinmal aufräumen.

Code: Alles auswählen

import pygame

PARTIKEL = 25

def zeichner(screen, schlange):
    screen.fill((0, 102, 0))
    
    color = (0, 0, 0)
    for x, y in schlange:
        pygame.draw.rect(screen, color, (x * PARTIKEL, y * PARTIKEL, PARTIKEL, PARTIKEL), width=0)
        color = (47, 79, 79)

def main():
    schlange = [[13, 13], [13, 14]]
    richtung = 0

    pygame.init()
    clock = pygame.time.clock

    screen = pygame.display.set_mode([700, 700])
    score = 0
    ende = False
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                ende = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and richtung != 2:
                    richtung = 0
                elif event.key == pygame.K_RIGHT and richtung != 3:
                    richtung = 1
                elif event.key == pygame.K_DOWN and richtung != 0:
                    richtung = 2
                elif event.key == pygame.K_LEFT and richtung != 1:
                    richtung = 3
        if ende:
            break

        head_x, head_y = schlange[0]
        if richtung == 0:
            new_head = [head_x, head_y - 1]
        elif richtung == 1:
            new_head = [head_x + 1, head_y]
        elif richtung == 2:
            new_head = [head_x, head_y + 1]
        elif richtung == 3:
            new_head = [head_x - 1, head_y]
        schlange = [new_head] + schlange[:-1]
    
        zeichner(screen, schlange)
        pygame.display.update()
        clock.tick(10)
    print(f"Du hast {score} Punkte erreicht")

if __name__ == '__main__':
    main()
Antworten