Init vor schleife und pygame.image im zentrum ansprechen

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
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Hallo,
ich bin recht neu in Python und habe hier gleich zwei Fragen:
1. Folgender Code:

Code: Alles auswählen

while c != 0:
...
Dies wird ja nicht funktionieren, da er versucht auf eine nochnicht vorhandene Variable zuzugreifen.. (Zuindest bei mir gehts nicht!)
Gibt es einen weg, variablen quasi manuell zu initialisieren mit int oder string etc.? Sonst müsste ich ja jedesmal vor einer Solchen schleife ein c = 0 oder c = '' benutzen!

2. Gibt es eine Möglichkeit, dass ich mit pygame.image ein bild ausgehend vom Zentrum zeichnen kann? Sonst muss ich die Abstände zur Mitte manuell abziehen...!
Vielen Dank schonmal,
Flacx
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Flacx hat geschrieben:Gibt es einen weg, variablen quasi manuell zu initialisieren mit int oder string etc.? Sonst müsste ich ja jedesmal vor einer Solchen schleife ein c = 0 oder c = '' benutzen!
Genau das ist doch die Initialisierung. Du definierst durch diese Zuweisung den Wert und den Typ der an den entsprechenden Bezeichner gebunden wird.
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Ja stimmt nur gibt es nicht einen Weg das zu verkürzen?
Statt

Code: Alles auswählen

c = 10
while c != 0:
das hier:

Code: Alles auswählen

while int c = 10 != 0
#oder direkt
while c != 0:
c = raw_input(...)
Es kommt mir einfach komisch vor, da es in Programmiersprachen ja für alles und jeden Abkürzungen gibt und ich glaube irgendwie nicht, dass man das dann immer
manuell initialisieren muss ^^
Kann ja auch sein, dass ich mich irre ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Ob es kürzer geht oder nicht, das hängt immer von Fall zu Fall ab. Wenn c erst in der Schleife berechnet wird, dann bietet sich eine while-True-Schleife an:

Code: Alles auswählen

while True:
    ...
    c = ...
    ...
    if c == 0:
        break
Das Leben ist wie ein Tennisball.
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Stimmt eig. Hab ich garnicht dran gedacht, Danke ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und wenn man weiß, wie oft eine Schleife zu durchlaufen ist, sollte man imho auch immer eine ``for``-Schleife nehmen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Ich weiß, nur in meinem Beispiel wollte ich 2 Listen gleichzeitig durchlaufen...
Dachte mir es ginge mit

Code: Alles auswählen

for i in sx:
aber dann spreche ich nur die eine Liste an.. Verschachteln ging hier nicht, da das Programm nicht pro sx alle sy durchlaufen soll...
Da ging es am einfachsten eine Zähl-While Schleife zu erstellen die dann für beide Listen zählt... sprich:

Code: Alles auswählen

while c < len(sx):
     ....sx[c]...sy[c]
     c += 1
P.S: Dazu sei zu bemerken, dass sx und sy gleich lang sind, weswegen da nur len(sx) steht und nicht auch len(sy)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dafür gibt es die zip-Funktion:

Code: Alles auswählen

for x, y in zip(sx, sy):
    ...
So als Faustregel: Wenn du mittels Schleife und Indizes auf Listen zugreifst, dann geht das in der Regel schöner.
Das Leben ist wie ein Tennisball.
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Okay, das wusste ich nicht. Jedoch werden auch hier 2 Variablen erstellt. Eine einzige ist leichter zu bedienen. Dennoch Danke, ich schreibs grad mal um!
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Okay man verfluche mich, wenn das ein offensichtlicher Fehler ist... Ich bekomme bei folgendem Code einen Index out of Range Error:

Code: Alles auswählen

for cx, cy in zip(sx, sy):
        DISPLAYSURF.blit(im, (sx[cx] - (113/2), sy[cy] - (168/2)))
P.S: Habs gefunden... Ich idiot, war ja sowas von offensichtlich!
Zuletzt geändert von Flacx am Dienstag 6. Mai 2014, 20:25, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du hast die zip-Funktion nicht richtig verstanden. In cx und cy sind bereits die zusammengehörigen Werde drin!

Code: Alles auswählen

DISPLAYSURF.blit(im, (cx - (113/2), cy - (168/2)))
Das hättest du durch Testen im interaktiven Interpreter aber auch leicht selber sehen können.

Nur Konstanten sollten Namen nur aus Großbuchstaben haben. DISPLAYSURF ist sicher keine Konstante.
Das Leben ist wie ein Tennisball.
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Jap habe ich eben auch gesehen. Sorry
Und wg. der Konstanten Sache.. ich bin mir nicht sicher, ich meine schon es ist eine:

Code: Alles auswählen

DISPLAYSURF = pygame.display.set_mode((1980, 1080), 0, 32)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der Aufruf von blit verändert DISPLAYSURF, darauf wird gezeichnet. Sonst wäre LISTE hier ja auch eine Konstante:

Code: Alles auswählen

LISTE = [23, 42]
LISTE.append(99)
Das Leben ist wie ein Tennisball.
Flacx
User
Beiträge: 8
Registriert: Dienstag 6. Mai 2014, 19:19

Problem gelöst und danke für eure Geduld und netten Antworten :)
Antworten