Seite 1 von 1
Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 13:23
von Vadehoc
Ich versuche eine Funktion zu schreiben , die mir eine Liste von pygame.Rec's erstellt welche ich dann in meinem Roulette-Programm benutzen kann.
Jedoch kommt jedes mal folgender Fehler auf:
Traceback (most recent call last):
File "F:\Pygame\Roulette.py", line 120, in <module>
main()
File "F:\Pygame\Roulette.py", line 81, in main
field = Feldersteller()
File "F:\Pygame\Roulette.py", line 63, in Feldersteller
Feld = Feld+pygame.Rect(((zähler-1)%3)*100+(zähler%3)*50, 90+int((zähler-1)/3), 100, 50)
TypeError: can only concatenate list (not "pygame.Rect") to list
Hier einmal der Code:
Code: Alles auswählen
def Feldersteller():
Feld = [pygame.Rect(200, 20, 100, 50)]
zähler = len(Feld)
while zähler<36:
if zähler == 0:
Feld = Feld+pygame.Rect(200, 20, 100, 50)
zähler=zähler+1
else:
Feld = Feld+pygame.Rect(((zähler-1)%3)*100+(zähler%3)*50, 90+int((zähler-1)/3), 100, 50)
zähler = zähler+1
return Feld
Ich hoffe mir kann vielleicht jemand von euch helfen,vielen Dank schon mal im Vorraus
Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 13:30
von EyDu
Steht doch in der Fehlermeldung ganz ausdrücklich: Du kannst nur Listen an Listen anhängen und nicht Rects an Listen.
- Bei der Gelegenheit solltest du dir map PEP 8 bezüglich der Namensgebung anschauen. Auch solltest du Funktionen mittels Verben benennen, denn diese beschreiben Tätigkeiten. Also "feld_erstellen".
- Wenn die Anzahl der Schleifendurchläufe bekannt ist, dann sollte eine for-Schleife verwendet werden.
- Das if wird niemals ausgeführt. "zähler" ist zu beginn 1, "zähler == 0" wird daher nie zu True ausgewertet.
- Sowohl im if- als auch im else-Teil wird identischer Code ausgeführt, den kannst du zusammenfassen
- Der Ausdruck im else-Teil ist viel zu lang. Zerlege diesen oder Teile in auf mehrere Zeilen auf.
Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 14:20
von BlackJack
Vielleicht noch mal etwas weniger missverständlich formuliert: Man kann an Listen alles mögliche *anhängen*, und genau das sollte man hier wohl am besten auch tun mit der entsprechenden Methode, aber man kann Listen nur mit Listen konkatenieren.
Zum langen Ausdruck: Wenn man Teile der Rechnung da heraus zieht, bietet sich eventuell auch die `divmod()`-Funktion an.
Edit: Da sind auch ziemlich viele ”magische” Zahlen die man vielleicht besser als Argumente und/oder Konstanten definiert.
Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 14:24
von Madmartigan
Vadehoc hat geschrieben:
Code: Alles auswählen
def Feldersteller():
Feld = [pygame.Rect(200, 20, 100, 50)]
zähler = len(Feld)
while zähler<36:
if zähler == 0:
Feld = Feld+pygame.Rect(200, 20, 100, 50)
zähler=zähler+1
else:
Feld = Feld+pygame.Rect(((zähler-1)%3)*100+(zähler%3)*50, 90+int((zähler-1)/3), 100, 50)
zähler = zähler+1
return Feld
- • zähler ist immer 1
• Listen erweiterst du durch append()
• Inkrementierungen schreibst du einfacher:
• englische Bezeichner verwenden, Funktionen klein schreiben, Unterstriche zur Worttrennung (siehe PEP8)
Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 18:14
von /me
Madmartigan hat geschrieben:zähler ist immer 1
So schlimm ist es nun nicht, aber der abgefragte Wert 0 wird in der Tat nicht erreicht.
Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 20:06
von Madmartigan
/me hat geschrieben:Madmartigan hat geschrieben:zähler ist immer 1
So schlimm ist es nun nicht, aber der abgefragte Wert 0 wird in der Tat nicht erreicht.
Schlimm ist, wenn der Kühlschrank keinen ausreichenden Vorrat an Bier aufweist. Ich weiß allerdings nicht worauf du hier hinaus willst!?
zähler ist immer 1, da die Liste unmittelbar in der Zeile davor mit einem einzelnen Wert initialisiert wird und somit letztendlich die darauf folgende
if-Bedingung ad absurdum führt.
Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 20:08
von EyDu
Madmartigan hat geschrieben:zähler ist immer 1, da die Liste unmittelbar in der Zeile davor mit einem einzelnen Wert initialisiert wird und somit letztendlich die darauf folgende if-Bedingung ad absurdum führt.
Das kommt halt darauf an, wie man "immer" definiert. Nach dem ersten Schleifendurchlauf ist "zähler" nämlich nicht mehr 1 sondern 2. Zumindest mir ist diese Definition von "immer" neu

Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 20:22
von Madmartigan
EyDu hat geschrieben:Madmartigan hat geschrieben:zähler ist immer 1, da die Liste unmittelbar in der Zeile davor mit einem einzelnen Wert initialisiert wird und somit letztendlich die darauf folgende if-Bedingung ad absurdum führt.
Das kommt halt darauf an, wie man "immer" definiert. Nach dem ersten Schleifendurchlauf ist "zähler" nämlich nicht mehr 1 sondern 2. Zumindest mir ist diese Definition von "immer" neu

Dieses
immer bezieht sich auf den Aufruf der Methode, die dann jedes Mal eine Liste mit exakt einem Feld generiert und dann für die fixe Länge eine Variable anlegt...
Captain Obvious: "
zähler = zähler + 1 ändert den Wert hinter
zähler."

Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 20:29
von EyDu
Dann solltest du das auch so schreiben

Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 23:23
von Madmartigan
Äh ... genau. Offensichtliches sollte doch wirklich keines Hinweises bedürfen, ... dachte ich.
Ich will seinen Thread nicht weiter zu spammen, also richtigerweise:
zähler ist
nicht immer 1.
Re: Listen und pygame.Rect
Verfasst: Dienstag 6. Mai 2014, 23:29
von Sirius3
Am besten nimmt man eine for-Schleife, dann sieht man auf einen Blick, welche Werte zähler annehmen kann.
