Pygame Probleme bei Darstellung von Rechtecken

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
cihan2411
User
Beiträge: 1
Registriert: Freitag 1. Oktober 2021, 10:50

Guten Tag,

ich habe neulig mit dem Programmieren in Python angefangen.
Ich habe Pygame über PIP installiert und will mit dem Spieleprogrammieren anfangen.
Jedoch bin ich auf eine paar Probleme gestoßen und würde gerne meinen Code zeigen:

Code: Alles auswählen


import pygame
import sys

pygame.init()

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

go = True

richtung = 2

while(go): 
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            
    gedrueckt = pygame.get_pressed()

    if (gedrueckt == pygame.K_UP):
        if (gedrueckt != 3):
            richtung = 1
    if (gedrueckt == pygame.K_RIGHT):
        if (gedrueckt != 4):
            richtung = 2
    if (gedrueckt == pygame.K_DOWN):
        if(gedruckt != 1):
            richtung = 3
    if (gedrueckt == pygame.K_LEFT):
        if(gedrueckt != 2):
            richtung = 4

    schlange = [5,5, 6,5, 7,5, 8,5, 9,5]

    i = 0

    pygame.draw.rect(screen,(255,255,0),25,25,25,25)
    
    #while(i<len(schlange)-2):
     #   pygame.draw.rect(screen, (255,255,0), (25*schlange[i]),25*schlange[i+1],25,25)
      #  i = i + 1

    schlange.remove(0)
    schlange.remove(1)

#    if (richtung==1):
#       schlange.insert(len(schlange)-1, schlange[len(schlange)-1]-1)
#       schlange.insert(len(schlange)-2, schlange[len(schlange)-1])
#   if (richtung==2):
#        schlange.insert(len(schlange)-1, schlange[len(schlange)-1])
#        schlange.insert(len(schlange)-2, schlange[len(schlange)-1]+1)
#    if (richtung==3):
#        schlange.insert(len(schlange)-1, schlange[len(schlange)-1]+1)
#        schlange.insert(len(schlange)-2, schlange[len(schlange)-1])
#    if (richtung==4):
#        schlange.insert(len(schlange)-1, schlange[len(schlange)-1])
#        schlange.insert(len(schlange)-2, schlange[len(schlange)-1]-1)
    
    
    pygame.display.update()

pygame.quit()
    
Ich will snake programmieren, jedoch werden die Rechtecke nicht angezeigt.
Ich habe nur ein schwarzes Fenster.
Könnt ihr mir da vielleicht weiterhelfen.
Ich danke im voraus :-)

Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cihan2411: Welche Rechtecke? Da ist so viel falsch, da weiss man ja gar nicht wo man anfangen soll. Python ist ja so nett und sucht was für einen aus wenn man das startet. Was an der Fehlermeldung verstehst Du denn nicht?

Allgemeine Bemerkungen: `sys` wird importiert aber nicht verwendet.

Um Bedingungen gehören keine unnötigen Klammern.

`go` und `run` werden nicht wirklich verwendet. Das sollte wohl entweder `go` *oder* `run` heissen.

`gedrueckt` kann man nicht mit Zahlen vergleichen. Also kann man schon, aber da kommt halt *immer* `False` bei heraus. Schau Dir mal an was das für einen Wert hat. Und dann benutzt man dafür nur die Konstanten aus dem `pygame`-Modul und nicht irgendwelche literalen Zahlen. Ich vermute *die* wolltest Du mit etwas *anderem* vergleichen. Und das dann auch jedes mal richtig schreiben, und nicht einmal einen Buchstaben weglassen.

Die Schlange wird in einer ungeeigneten Datenstruktur gehalten. Man schreibt keine Listen an denen jedes zweite Element etwas anderes bedeutet als das Nachbarelement. In Listen sollte jedes Element die gleiche Bedeutung haben. Zum Beispiel die Koordinate von *einem* Schlangenglied. Womit jedes Element aus *zwei* Werten besteht. Zum Beispiel Tupel. Oder hier vielleicht auch `pygame.Rect`-Objekte. Die haben ein paar interessante Operationen/Methoden.

`list.remove()` macht ziemlich sicher nicht was Du denkst was es macht.

Wenn man die Grundlagen von Listen durchgearbeitet hat, wird man nicht ``liste[len(liste) - 1]`` schreiben, weil man weiss wie das ohne `len()` geht, und bestimmt nicht ``liste.insert(len(liste) - 1, wert)``, weil dafür `insert()` die falsche Operation ist, denn zum Anhängen an eine Liste gibt es eine eigene Methode. Also noch mal Grundlagen durcharbeiten.

Die Richtung durch die ”magischen” Zahlen 1 bis 4 zu repräsentieren ist unschön. Nicht nur das man bei Rechnern mit 0 zu zählen Anfängt, sondern auch weil das Programm damit schwerer zu verstehen ist, weil man wissen muss das die Richtungen durch Zahlen repräsentiert werden, und umgekehrt, wenn man die Zahlen liest, wissen muss, dass es sich dabei um eine Richtung handeln soll, und auch *welche* das jeweils ist. Für so etwas definiert man sich mindestens Konstanten, damit der Code verständlicher wird. Ein Aufzählungstyp mittels `enum`-Modul wäre aber auch nicht schlecht.

In Zukunft bei Fehlermeldungen bitte gleich auch den Traceback mitliefern. Und bei Problemen ohne Fehlermeldungen kannst Du auch schon sagen was Du versucht hast, was Du erwartet hast, auch an Zwischenergebnissen, und was stattdessen passiert ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Weder `while` noch `if` sind Funktionen, die Klammern daher überflüssig.
Du benutzt ein `go` setzt dann aber ein `run` auf False, das ist falsch.
`pygame.get_pressed` existiert nicht.
`gedrueckt` ist dann eine ScancodeWrapper-Instanz, die niemals gleich einem Taste-Code ist.
Dann hast Du in den weiteren if-Bedingungen `gedrueckt` und `richtung` verwechselt.
`pygame.draw.rect` erwartet ein Rect, bzw. ein Tuple aus 4 Werten.
Statt einer while-Schleife und händisches Zählen eines Indexes benutzt man eine for-Schleife direkt mit der Liste.

Code: Alles auswählen

import pygame

def mainloop(screen):
    richtung = 2
    clock = pygame.time.Clock()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return
        
        gedrueckt = pygame.key.get_pressed()
        if gedrueckt[pygame.K_UP]:
            if richtung != 3:
                richtung = 1
        if gedrueckt[pygame.K_RIGHT]:
            if richtung != 4:
                richtung = 2
        if gedrueckt[pygame.K_DOWN]:
            if richtung != 1:
                richtung = 3
        if gedrueckt[pygame.K_LEFT]:
            if richtung != 2:
                richtung = 4

        schlange = [(5,5), (6,5), (7,5), (8,5), (9,5)]
        pygame.draw.rect(screen,(255,255,0),(25,25,25,25))
        for pos_x, pos_y in schlange:
            pygame.draw.rect(screen, (255,255,0), (25*pos_x, 25*pos_y, 25, 25))

        pygame.display.update()
        clock.tick(30)

def main():
    pygame.init()
    screen = pygame.display.set_mode([500,500])
    try:
        mainloop(screen)
    finally:
        pygame.quit()

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