Listen und pygame.Rect

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Vadehoc
User
Beiträge: 3
Registriert: Mittwoch 12. März 2014, 21:15

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
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.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

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:

    Code: Alles auswählen

    zähler += 1
    • englische Bezeichner verwenden, Funktionen klein schreiben, Unterstriche zur Worttrennung (siehe PEP8)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

/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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 ;-)
Das Leben ist wie ein Tennisball.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

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." :twisted:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann solltest du das auch so schreiben ;-)
Das Leben ist wie ein Tennisball.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Äh ... genau. Offensichtliches sollte doch wirklich keines Hinweises bedürfen, ... dachte ich.

Bild

Ich will seinen Thread nicht weiter zu spammen, also richtigerweise: zähler ist nicht immer 1.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Am besten nimmt man eine for-Schleife, dann sieht man auf einen Blick, welche Werte zähler annehmen kann. :roll:
Antworten