Seite 2 von 3

Verfasst: Dienstag 3. Mai 2005, 20:05
von rady
ne leute ich lösch das doch jetzt nicht alles und machs neu :cry:

vorallem ICH WEISS ES NICHT BESSER

ich habs so gemacht weil ich keine ahnung hab wie ich sonst die ganzen variablen weitergeben soll.
wenn ich global nicht benutze und ich in a eine variable definiere und a b auslößt welches wiederum c auslößt, welches die variable aus a braucht dann müsste ich die ja auch in b mitschleppen obwohl sie nicht gebraucht wird. und da mein programm ja aus 1000000 funtkionen besteht wäre das auch ein chaos und ich müsste immer weit im vorraus denken . waaah

Verfasst: Dienstag 3. Mai 2005, 20:17
von CM
Ach so wars doch nicht gemeint: :tröst:

Wie wäre es Du schaust Dir mal mal ein paar Beispiele im Forum an? Und ein paar der kleineren Beispiele in der Pygame-Domäne. Du wirst sehen: Du kannst einen Gutteil Deines Codes löschen und trotzdem wirst Du keine Funktionalität verlieren. Aber Du wirst Übersicht gewinnen.

Gruß,
Christian

Verfasst: Dienstag 3. Mai 2005, 20:18
von rady
hm dann werd ichs wohl am langen wochende mal machen müssen :cry:
trotzdem danke für die antworten !

naja hab ja noch 4-5 wochen bis ichs dem lehrer abgeben muss ^^
ich werde euch den neuen code zeigen wenn er fertig ist :)

Verfasst: Dienstag 3. Mai 2005, 20:28
von Leonidas
Hier hast du etwas Code, den du mehr oder weniger als Beispiel nehemn kannst, ist zwar nicht perfekt, aber ich werde mich demnächst daran machen alle globals auszumerzen (ist ja nicht schwer).

Verfasst: Mittwoch 4. Mai 2005, 17:03
von Leonidas
CM hat geschrieben:N.B.: Re-Factoring ist ja keine Schande, sondern zeugt davon, daß man sich über seinen Code Gedanken macht. Ein guter Bekannter von mir, "richtiger" Programmierer, schmeißt gelgentlich tausende Zeilen Code weg und schreibt sie neu. Mir ist es schwer gefallen davon zu lernen - aber der Mann hat recht, es bringt manchmal tatsächlich was.
Das ist auch das Grundkonzept von Extreme Programming, würde ich auch gerne machen.. wenn ich genug Unittests hätte um prüfen zu können ob die neue Version genauso funktioniert. :(

Verfasst: Mittwoch 4. Mai 2005, 17:11
von CM
Na, ich meinte ja nicht, daß man in jedem Fall gleich alles wegwerfen und neu schreiben soll - das kann machen wer zuviel Zeit hat! Sondern eher "ausmisten" von Code, sich aber am bestehenden Code anlehnen.

Was unittests angeht - das ist in Python nicht so sehr das Problem ... allerdings bei GUIs ist das so eine Sache für sich, das gebe ich gerne zu.

Gruß
Christian

Verfasst: Donnerstag 5. Mai 2005, 13:46
von rady
hm wie soll ich die tasten für die steuerung die im optionsmenü eingestellt werden, also die variablen, ins eigentliche spiel übergeben ? 2 funktionen sind nämlich nicht direkt mit einander verbunden !

Verfasst: Freitag 6. Mai 2005, 11:27
von rady
so ich habs tatsächlich geschafft : alle globals sind weg

ABER

der fehler ist immernoch da :evil: :x :evil:

Verfasst: Freitag 6. Mai 2005, 11:33
von CM
Sehr gut. Dann zeige uns doch mal Deinen Code. Vielleicht kann man jetzt ja den Fehler eingrenzen. Achte darauf nicht wieder nur genau die Zeilen zu posten, wo der Fehler auftritt, sondern alle Zeilen, die irgendwie relevant sein können - zur Not den ganzen Code. Und sei so gut und hänge das Traceback gleich mit unten dran.

Gruß,
Christian

Verfasst: Montag 9. Mai 2005, 14:51
von rady
ARRGGHH

UPDATE :

alle globals weg ... ABER .... "unsubscriptable object" ... fehler ohne sinn wie beim ersten post... also was is nur los ? an den globals kanns ja net mehr liegen ....

Verfasst: Dienstag 10. Mai 2005, 16:30
von rady

Code: Alles auswählen

def refresh(asteroiden_liste,x,y,ausrichtung,level,schaden,schuesse,strg,schuesse_liste):
    schuess=keyboard_action(ausrichtung,x,y, strg,schuesse,schuesse_liste)
    screen.fill(black)
    screen.blit(hintergrundbild,[100,0])
    screen.blit((raumschiffbilder[ausrichtung]),[x,y])
    for z in range(level+1):
        screen.blit(asteroiden_liste[z][0],[asteroiden_liste[z][1],asteroiden_liste[z][2]])
    if schuesse==1:
        schuesse_liste[1]=schuesse_liste[1]-10
        screen.blit(schuss,[schuesse_liste[0],schuesse_liste[1]])
        if schuesse_liste[1]<0:
            schuesse=0
    refreshinterface(level, schaden)
    pygame.display.flip()
    return schuesse


    
#unterkategorie von  refresh, aktualisiert das interface(level,schaden)
def refreshinterface(level,schaden):
    interfacetext=pygame.font.Font('font.ttf',20)
    leveltext=interfacetext.render('Level '+str(level),1, white)
    screen.blit(leveltext,[680,565])
    schadentext=interfacetext.render(str(schaden)+'% Schaden',1,white)
    screen.blit(schadentext,[40,565])





#ueberprueft ob mauszeiger beim klick ueber dem button war und leitet ggf. weiter
def click(erstelltx,erstellty,breite,hoehe,umleitung,strg_angepasst,strg,musik):
    mausx=pygame.mouse.get_pos()[0]
    mausy=pygame.mouse.get_pos()[1]
    if mausx>erstelltx and mausx<(erstelltx+breite) and mausy>erstellty and mausy<(erstellty+hoehe):
        if umleitung==1:
            if strg_angepasst==1:
                menu_starten(strg,musik)
            else:
                menutext=pygame.font.Font('font.ttf',20)
                fehler=menutext.render('Steuerung wurde noch nicht festgelegt.',1, red,black)
                screen.blit(fehler,[100,280])
                pygame.display.flip()
        if umleitung==2:
            menu_highscore(strg_angepasst,strg,musik)
        if umleitung==3:
            menu_optionen(strg_angepasst,strg,musik)
        if umleitung==4:
            menu_beenden()
        if umleitung==5:
            menu(strg_angepasst,strg,musik)



def vorwaertsrechner(ausrichtung,x,y):
    if ausrichtung==0:
        y=y+8
    if ausrichtung==1:
        y=y+6
        x=x-2
    if ausrichtung==2:
        y=y+4
        x=x-4
    if ausrichtung==3:
        y=y+2
        x=x-6
    if ausrichtung==4:
        x=x-8
    if ausrichtung==5:
        y=y-2
        x=x-6
    if ausrichtung==6:
        y=y-4
        x=x-4
    if ausrichtung==7:
        y=y-6
        x=x-2
    if ausrichtung==8:
        y=y-8
    if ausrichtung==9:
        y=y-6
        x=x+2
    if ausrichtung==10:
        y=y-4
        x=x+4
    if ausrichtung==11:
        y=y-2
        x=x+6
    if ausrichtung==12:
        x=x+8
    if ausrichtung==13:
        y=y+2
        x=x+6
    if ausrichtung==14:
        y=y+4
        x=x+4
    if ausrichtung==15:
        y=y+6
        x=x+2
    return x,y
def rueckwaertsrechner(ausrichtung,x,y):
    if ausrichtung==0:
        y=y-8
    if ausrichtung==1:
        y=y-6
        x=x+2
    if ausrichtung==2:
        y=y-4
        x=x+4
    if ausrichtung==3:
        y=y-2
        x=x+6
    if ausrichtung==4:
        x=x+8
    if ausrichtung==5:
        y=y+2
        x=x+6
    if ausrichtung==6:
        y=y+4
        x=x+4
    if ausrichtung==7:
        y=y+6
        x=x+2
    if ausrichtung==8:
        y=y+8
    if ausrichtung==9:
        y=y+6
        x=x-2
    if ausrichtung==10:
        y=y+4
        x=x-4
    if ausrichtung==11:
        y=y+2
        x=x-6
    if ausrichtung==12:
        x=x-8
    if ausrichtung==13:
        y=y-2
        x=x-6
    if ausrichtung==14:
        y=y-4
        x=x-4
    if ausrichtung==15:
        y=y-6
        x=x-2
    return x,y
    
#ueberprueft ob das raumschiff im bild ist. wenn nicht -> game over
def verschollen(x,y):
    if x<-64 or x>864 or y<-64 or y>664:
        gameover(True)


def keyboard_action(ausrichtung,x,y,strg,schuesse,schuesse_liste):
    for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key==strg[0]:
                    x,y=vorwaertsrechner(ausrichtung,x,y)
                if event.key==strg[1]:
                    x,y=rueckwaertsrechner(ausrichtung,x,y)
                if event.key==strg[2]:
                    pygame.key.set_repeat(2,2)
                    if ausrichtung==0:
                        ausrichtung=15
                    else:
                        ausrichtung=ausrichtung-1
                    pygame.key.set_repeat(1,1)
                if event.key==strg[3]:
                    pygame.key.set_repeat(2,2)
                    if ausrichtung==15:
                        ausrichtung=0
                    else:
                        ausrichtung=ausrichtung+1
                if event.key==strg[4]:
                    if schuesse==0:
                        schuesse=1
                        schuesse_liste=[x+30,y-10]                        
    return x,y,ausrichtung,schuesse,schuesse_liste
    
            
def collision(ausrichtung,asteroiden_liste,x,y,level,asteroids_out,schuesse,schuesse_liste):
    for k in range(level+1):
        if asteroiden_liste[k][2]>0:
            if asteroiden_liste[k][1]+asteroiden_liste[k][4]>x+24 and asteroiden_liste[k][1]<x+40:
                if asteroiden_liste[k][2]+asteroiden_liste[k][4]>y+24 and asteroiden_liste[k][2]<y+40:
                    gameover()
        if schuesse==1:
            if asteroiden_liste[k][2]>0:
                if schuesse_liste[0]+5>asteroiden_liste[k][1] and schuesse_liste[0]<asteroiden_liste[k][1]+asteroiden_liste[k][4]:
                    if schuesse_liste[1]+5>asteroiden_liste[k][2] and schuesse_liste[1]<asteroiden_liste[k][2]+asteroiden_liste[k][4]:
                        asteroiden_liste=asteroiden_liste[k][0],asteroiden_liste[k][1],asteroiden_liste[k][2]-2500,asteroiden_liste[k][3],asteroiden_liste[k][4]
                        asteroids_out=asteroids_out+1
    return asteroids_out,asteroiden_liste


    
def gameover(verschollen_status = False):
    if verschollen_status==1:
        hinweis_verschollen=gameovertext.render('Im Weltall verschollen..',1, red)
        screen.blit(hinweis_verschollen,[100,100])
    else:
        gameovertext=pygame.font.Font('font.ttf',30)
        hinweis=gameovertext.render('Game Over',1, red)
        screen.blit(hinweis,[100,100])
    pygame.display.flip()
    pygame.time.delay(1000)
    menu()

def level_ablauf(ausrichtung,x,y,level,schaden,schuesse,strg,schuesse_liste):
    asteroids_out=0
    level=level+1
    asteroiden_liste=[]
    for b in range(level+1):
        zahl1=randint(3,9)
        zahl=zahl1*10
        speed=randint(4,7)
        asteroid_spawn_x=randint(0,800-zahl)
        asteroid_spawn_y=0-zahl
        out=0
        asteroid_bild,asteroid_x,asteroid_y=pygame.image.load('bilder/asteroid'+str(zahl)+'.gif'),asteroid_spawn_x,asteroid_spawn_y                                     
        asteroid_daten=asteroid_bild,asteroid_x,asteroid_y,speed,zahl
        asteroiden_liste.append(asteroid_daten)
        screen.blit(asteroid_bild,[asteroid_spawn_x,asteroid_spawn_y])
    while 1:              
        for c in range(level+1):
            a=asteroiden_liste[c][3]
            b=asteroiden_liste[c][2]
            asteroiden_liste[c]=asteroiden_liste[c][0],asteroiden_liste[c][1],a+b,asteroiden_liste[c][3],asteroiden_liste[c][4]
            if asteroiden_liste[c][2]>600:
                asteroiden_liste[c]=asteroiden_liste[c][0],asteroiden_liste[c][1],asteroiden_liste[c][2]-2500,asteroiden_liste[c][3],asteroiden_liste[c][4]
                asteroids_out=asteroids_out+1
            if asteroids_out==level+1:
                level_ablauf(ausrichtung,x,y,level,schaden,schuesse,strg,schuesse_liste)
        x, y,ausrichtung,schuesse,schuesse_liste =keyboard_action(ausrichtung,x,y,strg,schuesse,schuesse_liste)
        asteroids_out,asteroiden_liste=collision(ausrichtung,asteroiden_liste,x,y,level,asteroids_out,schuesse,schuesse_liste)
        verschollen(x,y)
        schuesse=refresh(asteroiden_liste,x,y,ausrichtung,level,schaden,schuesse,strg,schuesse_liste)

            
#das hauptmenue
def menu(strg_angepasst=0,strg=[],musik=0):
    pygame.mouse.set_visible(1)
    screen.fill(black)
    screen.blit(menuhintergrund,[0,0])
    screen.blit(icon_starten,[550,150])
    screen.blit(icon_highscore,[550,200])
    screen.blit(icon_optionen,[550,250])
    screen.blit(icon_beenden,[550,300])
    pygame.display.flip()
    while 1:
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN:
                click(550,150,238,41,1,strg_angepasst,strg,musik)
                click(550,200,239,45,2,strg_angepasst,strg,musik)
                click(550,250,240,43,3,strg_angepasst,strg,musik)
                click(550,300,240,45,4,strg_angepasst,strg,musik)
    pygame.display.flip()


    
#startet das eigentliche spiel
def menu_starten(strg,musik):
    if musik!=0:
        track=pygame.mixer.Sound(musik)
        track.play()
    schiffx=368
    schiffy=536
    level=0
    schaden=0
    ausrichtung=8
    pygame.key.set_repeat(1,1)
    schuesse=0
    schuesse_liste=[]
    verschollen_status=0
    level_ablauf(ausrichtung,schiffx,schiffy,level,schaden,schuesse,strg,schuesse_liste)
        
                
menu ()


 
screen.blit(asteroiden_liste[z][0],[asteroiden_liste[z][1],asteroiden_liste[z][2]])
TypeError: unsubscriptable object

Verfasst: Dienstag 10. Mai 2005, 16:40
von joe
rady hat geschrieben:screen.blit(asteroiden_liste[z][0],[asteroiden_liste[z][1],asteroiden_liste[z][2]])
TypeError: unsubscriptable object
Debugge doch einfach mal.
Ersetze ...

Code: Alles auswählen

        screen.blit(asteroiden_liste[z][0],[asteroiden_liste[z][1],asteroiden_liste[z][2]])
... durch zb ...

Code: Alles auswählen

        try:
            screen.blit(asteroiden_liste[z][0],[asteroiden_liste[z][1],asteroiden_liste[z][2]])
        except TypeError:
            print "---------------------"
            print z
            print asteroiden_liste[z][0]
            print asteroiden_liste[z][1]
            print asteroiden_liste[z][2]
            print "---------------------"
... und erzähl uns, was da kommt.
joe

Verfasst: Dienstag 10. Mai 2005, 17:21
von rady
es kommt :
0
print asteroiden_liste[z][0]
TypeError: unsubscriptable object



:cry:

hab dann noch
print asteroiden_liste hinzugefügt :
0
(<Surface(40x43x8 SW)>, 369, -2204, 7, 40)
print asteroiden_liste[z][0]
TypeError: unsubscriptable object


dann dachte ich mir: eventuell kann er dieses surface ding net printen. also hab ich das print asteroiden_liste[z][0] weggelassen.
dann kam das hier

in collision
if asteroiden_liste[k][2]>0:
TypeError: unsubscriptable object

Verfasst: Dienstag 10. Mai 2005, 18:54
von joe
rady hat geschrieben: print asteroiden_liste hinzugefügt :
0
(<Surface(40x43x8 SW)>, 369, -2204, 7, 40)
print asteroiden_liste[z][0]
TypeError: unsubscriptable object
asteroiden_liste ist gleich (<Surface(40x43x8 SW)>, 369, -2204, 7, 40)
asteroiden_liste[0] ist damit gleich <Surface(40x43x8 SW)>
und asteroiden_liste[0][0] scheitert, da <Surface(40x43x8 SW)> nicht per index angesprochen werden kann, ist also z.b. keine liste oder kein dict.

Die folgende zeile kommt mir dabei komisch vor. Da wird aus einem 2-dimensionalen feld ein eindimensionales feld.

Code: Alles auswählen

asteroiden_liste=asteroiden_liste[k][0],asteroiden_liste[k][1],asteroiden_liste[k][2]-2500,asteroiden_liste[k][3],asteroiden_liste[k][4]
joe

Verfasst: Dienstag 10. Mai 2005, 19:32
von rady
JA !!!! DANKE !!

hab aus asteroiden_liste=....
asteroiden_liste[k]=...
gemacht