verdammt, ich kapier es einfach nicht

Fragen zu Tkinter.
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

die Anzahl der zurückgelegten Felder werden für zwei Berechnungen
benötigt :

- die zurückgelegte Anzahl der Felder bei der Bewegung.
Hier hast du wiederum Recht, dass kann noch etwas tricky werden.
Das Problem wird aber aber später verschoben, da ich mich um den
Inhalt der Felder, Eigenschaften und auch ob besetzt später
noch kümmern werde

Auch mir ist beim Programmieren aufgefallen, dass dies vorerst
sogar überflüssig ist, da ich die Anzahl der zurückglegten Felder
auch bei der Bewegung des Panzers z#hlen kann.
Dies wird dann auch so bei der Programmierung der Klasse Panzer
noch integrriert werden.

Zwei Gründe sprechen aber dafür :
- später muss ja auch noch die Entfernung zum Ziel ermitelt werden.
Bei der Schussphase
- ich hatte das begonnen und bin auf haufenweise Probleme
gestossen. Und somit war es einfach eine gut Übung.

Anbei aber schon einmal meine Klasse Panzer.
Hier habe ich wieder ein Problem.

Es soll nach Beendigung der Bewegung gefragt werden, ob
der spieler den Zug auch durchführen möchte.
Für den JA Fall ist auch alles OK.
Bein nein, sollen die Attribute Position und Ausrichtung wieder
auf den Zustand vor Beginn der Bewegung gesetzt werden und
wieder von vorne die Bewegungphase begonnen werden.

Aber egal wie ich es anstelle. Er fängt nicht von vorne an.

Code: Alles auswählen

from funktionen import nachbardic

class Panzer (object) :

    def __init__ (self,name, gehen, laufen, position, ausrichtung) :

        self.name   = name
        self.gehen  = gehen
        self.laufen = laufen
        self.position = position
        self.ausrichtung = ausrichtung

        position = (1,1)
        ausrichtung = 1

        print name, gehen, laufen
        
    def eigene_bewegung (self) :

        """ Aktion 1 = Drehung nach links
            Aktion 2 = Drehung nach rechts
            Aktion 3 = Feld vor """

        abschlusswunsch = 0
        aktion = 0
        zwsp_aus = self.ausrichtung
        zwsp_pos = self.position

        while True :

            while aktion != 100 :

                aktion = input()

                if aktion == 1 :
                    self.ausrichtung -= 1
                    if self.ausrichtung < 0 : self.ausrichtung = 5
                
                elif aktion == 2 :
                    self.ausrichtung += 1
                    if self.ausrichtung > 5 : self.ausrichtung = 0
                
                elif aktion == 3 :
                    zwischenspeicher = self.position
                    self.position = nachbardic[self.position][self.ausrichtung]
                    x = self.position[0]
                    y = self.position[1]
                    if x == 0 or y == 0 :
                        print "ungueltig"
                        self.position = zwischenspeicher
                else :
                    if aktion == 100 :
                        break
                    else :
                        print "ungueltig"
                        continue
    
                print self.position, self.ausrichtung


            abschlusswunsch = input("zufrieden ? : ")
            if abschlusswunsch == 1 : return self.position, self.ausrichtung
            else :
                print "sie waren nicht zufrieden, bitte ziehen Sie erneut"
                self.positon = zwsp_pos
                self.ausrichtug = zwsp_aus
                break

          

                
                
            
        

        

imac
20 Zoll
2,4 ghz
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Auch wenn ich nicht so richtig verstehe, was du meinst:

Zeile 13/14 machen sicher nicht das, was du möchtest:
Du versiehst nämlich lediglich die lokalen Variablen position und ausrichtung mit neuen Werte - sobald die Methode __init__() verlassen sind, sind die futsch.
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

ja, das stimmt.
ich habe es geändert.

Was ich meine ist folgendes :

ich gebe nacheinander die verschiedenen Aktionen ein.
(später durch buttons) Wenn sich dann der Panzer fertig
bewegt hat, dann wird die 100 eingeben. Das heisst er
verläßt die "while aktion!= 100 : Schleife.

Dann kommt die Abfrage, ob der Zug so ausgeführt werden soll.
Ist die Antwort 1 = ja, dann wird die neuen Position +
Ausrichtung zurück gegeben.
Bei nein, soll die Schleife von vorne beginnen.
UND das geht nicht.

Kai
imac
20 Zoll
2,4 ghz
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Aaaahhhh!
Natürlich geht das nicht. Durch das break in der allerletzten Zeile gibst du ja an, dass die Schleife verlassen werden soll - dann kann sie auch nicht wiederholt werden ...
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

ja, aber was kommt da sonst hin. Wie geht es sonst ?
mit break geht es nicht, mit continue geht es nicht.
ohne etwas geht es noch viel weniger.

Was muss man denn schreiben, damit der wieder nach oben sprint ?

Kai
imac
20 Zoll
2,4 ghz
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Warum geht es nicht mit continue? Aber auch aktion wieder auf 0 setzen.
Die Diskussion mit input gab es jetzt bereits wiederholt. Also wohl besser raw_input und Vergleich mit '1'.
MfG
HWK
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo derkai

So wie ich den Logik-Modultest durchführen würde. Hier den Code-Snippet krass modifiziert: :lol:

Code: Alles auswählen

#   Scriptname : panzer_logic_01.py
#   Autor      : Kai the Commander
#   Erstellt   : 12.08.2008
#   Geaendert  : 12.08.2008

import sys
from funktionen import nachbardic

class Panzer (object) :

    def __init__ (self, name, gehen, laufen, position, ausrichtung) :

        self.name = name
        self.gehen = gehen
        self.laufen = laufen
        self.position = position
        self.ausrichtung = ausrichtung

    def eigene_bewegung(self, aktion) :

        if aktion == 1 :
            self.ausrichtung -= 1
            if self.ausrichtung < 0 : self.ausrichtung = 5

        elif aktion == 2 :
            self.ausrichtung += 1
            if self.ausrichtung > 5 : self.ausrichtung = 0

        elif aktion == 3 :
            zwischenspeicher = self.position
            self.position = nachbardic[self.position][self.ausrichtung]
            x = self.position[0]
            y = self.position[1]
            if x == 0 or y == 0 :
                print "ungueltig"
                self.position = zwischenspeicher

#--- MODUL-TEST --------------------------------------------------------------#
if __name__ == "__main__":

    #~~ Prolog
    print
    print "****** Modul-Test (panzer_logic.py) ******"
    print

    #---- Test-Funktionen ----#

    def test_ausgabe():
        """Ausgabe der Modul-Attribute"""
        print
        print "----------- Test-Ausgabe -------------------"
        print "Panzername  :", panzer.name
        print "Ausrichtung :", panzer.ausrichtung
        print "Position    :", panzer.position
        print "Gehen       :", panzer.gehen
        print "Laufen      :", panzer.laufen
        print "--------------------------------------------"
        print

    #---- Test ----#

    #~~ Ausgangswerte
    position = (1,1)
    ausrichtung = 1

    # Instanz Panzer
    panzer = Panzer(name="Rasputin", gehen="schnell", laufen='Vorwaerts Marsch',
        position=position, ausrichtung=ausrichtung)

    while True :
        aktion = input("Aktionen: 1,2,3 und 100 ? ")

        if aktion == 100:
            #~~ Abbruch oder Neubanfang
            abschlusswunsch = input("zufrieden ? : ")

            if abschlusswunsch:
                #~~ Ausgabe der Modul-Attribute
                test_ausgabe()
                print "Ende der Modultest's"
                print
                #~~ Beende Modultest
                sys.exit(0)
            else:
                print "Sie waren nicht zufrieden, bitte ziehen Sie erneut"
                #~~ Setze Panzer auf Anfangsposition
                panzer.positon = position
                panzer.ausrichtug = ausrichtung

        if 0 < aktion <= 3:
            # Modul-Test Bewegung
            panzer.eigene_bewegung(aktion)
            #~~ Ausgabe der Modul-Attribute
            test_ausgabe()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

derkai hat geschrieben:ja, aber was kommt da sonst hin. Wie geht es sonst ?
mit break geht es nicht, mit continue geht es nicht.
ohne etwas geht es noch viel weniger.
Was muss man denn schreiben, damit der wieder nach oben sprint ?
Nichts. Die letzte Zeile ist überflüssig bzw. sie verhindert gerade, dass "der wieder nach oben springt", weil die Schleife damit verlassen wird. An der Stelle endet ja der Schleifenrumpf - schreibst du da nichts hin, dreht die Schleife ihre nächste Runde ...

Naja, und wenn du da unbedingt was stehen haben willst, dann nimm halt ein "pass" ...
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

so, ich schon wieder ...
ich plane gerade meinen nächsten Schritte und dabei bermekre ich sooo langsam, was ihr alle dameit meint strukturierter vorgehen zu müssen.

In irgend einem meiner Bücker hatte ich über ein Software Tool gelesen, dass einem bei der Planung (nicht programmierung) helfen kann.

Kennt Ihr so etwas ? .. ich finde es einfach nicht wieder

Kai
imac
20 Zoll
2,4 ghz
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Papier und Bleistift?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo mkallas

Du hast noch eine wichtiges Werkzeug vergessen. Den Radiergummi! :lol:

Gruss wuf :wink:
Zuletzt geändert von wuf am Freitag 15. August 2008, 10:01, insgesamt 1-mal geändert.
Take it easy Mates!
BlackJack

Das ist aber Hardware, es wurde nach Software gefragt. ;-)

Aber ich stimme zu; Papier und Bleistift sind Werkzeuge, die man nicht unterschätzen sollte.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

ich plane gerade meinen nächsten Schritte und dabei bermekre ich sooo langsam, was ihr alle dameit meint strukturierter vorgehen zu müssen.
Endlich .... ! :wink:

Als Tool meintest Du vielleicht UML,
aber im Moment plaediere ich
auch fuer Papier, Bleistift und Hirn.

:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo BlackJack

Ich habe eine Frage zu deine damals präsentierten Code-Snippet. Es betrifft folgende Zeilen:

Code: Alles auswählen

    def __init__(self, width, height, tile=DESERT):
        self.tiles = [[tile] * width for dummy in xrange(height)]
Was ist deine Absicht bei der Initialisierung des Tile-Arrays die gleiche Objekt-Referenz zu nehmen und nicht für jedes Tile eine neue? Wenn ich das Attribut 'name' eines Tile-Objektes ändere wirkt sich diese Änderung auf alle Tile-Objekte aus.

Gruss wuf :wink:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Das hatte ich auch schon mal gefragt, aber bei der Laenge dieses Threads kann man ja schnell den Ueberblick verlieren...

:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo yipyip

Sorry habe ich schlicht übersehen. Du meinst die Tread-Struktur des Forums ist nicht ideal für vielseitige Beiträge. :lol:

Ich glaube jeder Seitenwechsel in diesemTread erhöht den Aufrufzähler automatisch.

@BlackJack habe den Tread mit deiner Bezugnahme zu meiner letzten Frage gefunden:
http://www.python-forum.de/topic-15264,135.html

Gruss wuf :wink:
Zuletzt geändert von wuf am Freitag 15. August 2008, 14:49, insgesamt 1-mal geändert.
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Stimmt, der Counter hier steigt eher potenziell statt linear.

:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Forumfreunde

Habe anhand des Code-Snippet von 'BlackJack' und Anregungen von 'yipyip' betreffs Nachbarfeld-Ermittlung ein 'map_logic' Modul mit Testmöglichkeiten für Konsole-Ausgabe zusammengestellt. Vielleicht habt ihr hierzu Verbesserungs- oder Optimierungs-Vorschläge.

[Code ausgelagert]

Gruss wuf :wink:
Take it easy Mates!
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

ich wollte jetzt zumindest einmal probieren, ob meine Ideen in einer
eigenständigen GUI Umgebung umsetzbar sind. Und was soll ich sagen -
ich hänge wieder einmal fest.

Code: Alles auswählen

from Tkinter import *
from funktionen import *

#Hauptfenster erzeugen
spiel = Tk()
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")

#Fenster fuer Canvas
fenster1 = Frame (spiel,width=650,height=700)
fenster1.place(x=350, y=46)

#Canvas im Frame Fenster1
spflaeche = Canvas (fenster1,width=1074,height=768)
spflaeche.place(x=0,y=0)

#Scrollbar erstellen
xleiste = Scrollbar (spflaeche,orient=HORIZONTAL,width=324)
xleiste.place(x=2,y=685)

#Spielflache erstellen
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

for x in hexdic.iterkeys() :
    spflaeche.create_polygon (hexdic[x][0],fill=hexdic[x][2],outline="black")


#Titel fuer Canvas
besch1 = Label (spiel,text ="Spielfaeche",fg="red",bg="grey")
besch1.place(x=350,y=20)


spiel.mainloop()
Ich bekomme es einfach nicht hin, dass die Scrollbar beweglich ist,

Dafür sollen zwei Command Anweisungen verantwortlich sein.

xscrollcommand=SCROLLBAR.set und
command=FENSTER.xview

Aber egal wo ich die Einbaue - es geht nicht.

Würdet Ihr mir mal helfen ? und sagen wo ich welchen Befehl ergänzen muss ???

Danke
Kai
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

so habe ich es beispielsweise probiert :

Code: Alles auswählen

from Tkinter import *
from funktionen import *

#Hauptfenster erzeugen
spiel = Tk()
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")

#Fenster fuer Canvas
fenster1 = Frame (spiel,width=650,height=700)
fenster1.place(x=350, y=46)

#Canvas im Frame Fenster1
spflaeche = Canvas (fenster1,width=1074,height=768)
spflaeche.place(x=0,y=0)

#Spielflache erstellen
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

for x in hexdic.iterkeys() :
    
    spflaeche.create_polygon (hexdic[x][0],fill=hexdic[x][2],outline="black")

#Scrollbar erstellen
xleiste = Scrollbar (fenster1,orient=HORIZONTAL,width=324)
xleiste.config(command=spflaeche.xview)
xleiste.place(x=2,y=685)

spflaeche.config(xscrollcommand=xleiste.set)


#Titel fuer Canvas
besch1 = Label (spiel,text ="Spielfaeche",fg="red",bg="grey")
besch1.place(x=350,y=20)


spiel.mainloop()


GEHT ABER NICHT !!!
Zuletzt geändert von derkai am Samstag 16. August 2008, 23:08, insgesamt 1-mal geändert.
imac
20 Zoll
2,4 ghz
Antworten