verdammt, ich kapier es einfach nicht

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo derkai

Betreffs Drehung des Panzers:
Gehe ich richtig in der Annahme, dass dies in 60 Grad-Schritten erfolgen wird?

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

Hallo wuf,

1) das bei den Eingaben 1,1 - 1,4
6 Felder ausgegeben werden und ein zick, zack
Kurs erstellt wird entspricht genau der späteren
Bewegung des Panzers um dort hin zu gelangen.
Offen gesagt, es kommt hier eigentlich auch nur
darauf an, dass die Anzahl der Felder stimmt.

ich denke, hier ist alles ok

2) 1,1 - 4,2 erzeugt bei mir folgenden Pfad :

Code: Alles auswählen

Python 2.5 (r25:51918, Sep 19 2006, 08:49:13) 
[GCC 4.0.1 (Apple Computer, Inc. build 5341)] on darwin
Type "copyright", "credits" or "license()" for more information.

    ****************************************************************
    Personal firewall software may warn about the connection IDLE
    makes to its subprocess using this computer's internal loopback
    interface.  This connection is not visible on any external
    interface and no data is sent to or received from the Internet.
    ****************************************************************
    
IDLE 1.2      
>>> ================================ RESTART ================================
>>> 
(3, [(2, 1), (3, 2), (4, 2)])
2
>>> 
ich glaube auch hier ist alles OK
Einen Fehler erhalte ich nicht - komisch, woran mag das denn liegen ?

ich habe den Code schon wieder etwas umgeschrieben. Die funktion
gibt zuerst die Anzahl der Felder, dann den Pfad aus. Beachte die 2 in
der nächsten Spalte einfach noch nicht

3) tja ich weiss es nicht mehr ?
Ist die Summer der Innenwinkel nicht 720 Grad und somit je
Winkel 120 Grad ?

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

ach so, noch die Erklärung :

Spielreihen ist die gesamt Anzahl der untereinander aufzubauenden
Reihen.

1
. 2
3
. 4

Da die Reihen 1, 3, 5 usw je ein Feld mehr haben als die Reihen
2, 4, 6 usw habe ich dies unterscheiden können wollen

Kai
imac
20 Zoll
2,4 ghz
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo derkai

Betreffs Drehstellung des Panzers auf dem Hexagonfeld:

Es ist doch so, dass ein Panzer ein Hexagon-Spielfeld nur in sechs Richtungen verlassen kann.Somit kann ein Panzer nur sechs Stellungen einnehmen. Wenn wir die einzelnen Kanten des Hexagon im Uhrzeigersinn anschauen ergeben sich folgende sechs Stellungen:

a) 0 Grad (Kante Richtung Norden)
b) 60 Grad (Kante Richtung Nord-Ost)
c) 120 Grad (Kante Richtung Süd-Ost)
d) 180 Grad (Kante Richtung Süden)
e) 240 Grad (Kante Richtung Süd-West)
f) 300 Grad (Kante Richtung Nord-West)

Die Frage stellt sich auch noch im Zusammenhang der GUI-Programmierung. Da es bei Tkinter keine Grafik-Methode gib die ein Bildobjekt drehen kann braucht es für jede Richtung ein eigenes Image also insgesamt sechs Images pro Panzer!

Frage a:
Wenn der Panzer das Hexagon-Feld verlässt muss seine Frontseite (Kanone) in die gewählte Richtung zeigen?

Frage b:
Kann der Panzer auch rückwärts fahren?

Vielleicht könnest du dein Projekt-Katalog sukzessive mit den neuesten Erkenntnissen erweitern.

Gruss wuf :wink:

Edit: Habe die Sauerei mit den Umlauten bereinigt!
Zuletzt geändert von wuf am Montag 11. August 2008, 21:32, insgesamt 2-mal geändert.
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

wuf hat geschrieben:Da es bei Tkinter keine Grafik-Methode gib die ein Bildobjekt drehen kann braucht es für jede Richtung ein eigenes Image also insgesamt sechs Images pro Panzer!
Naja, wie ich schon weiter oben geschrieben habe, hängt das auch davon ab, ob fertige Panzer-Images als Grafikdateien verwendet werden sollen (für den Fall trifft deine Aussage zu) oder eben innerhalb des Canvas selbst gezeichnet werden (dann trifft sie nicht zu - dann lässt sich das alles berechnen).
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

also :

- ein Panzer kann nicht rückwärts fahren.
- ein Panzer kann zwar später zur Waffenphase seinen Turm
dehen, aber im Moment der Bewegung zeigt die Kanone immer
in Richtung Front des Panzers
- ein Panzer verläßt das eigene Feld somit immer nur in das
Nachbarfeld in Richtung Front.
- da ich den Panzer nicht selber zeichnen werde, sondern von einem
Freund verschiedene Fotos von Modellpanzers machen werde,
werde ich dann wohl sechs verschiedene gif Dateien brauchen.

Würde denn jemand noch mal Stellung dazu beziehen, ob die
Einführung einer Klasse Panzer jetzt Sinn machen würde ?

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

derkai hat geschrieben:Würde denn jemand noch mal Stellung dazu beziehen, ob die
Einführung einer Klasse Panzer jetzt Sinn machen würde ?
Ja, "macht Sinn". Ein Panzer ist ja ein Objekt mit verschiedenen Eigenschaften (Position, Ausrichtung, evtl. Geschwindigkeit etc.) und Fähigkeiten (sich drehen, fahren, schießen etc). Da bietet es sich geradezu an, mit Panzer-Objekten zu arbeiten.
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

ok, dann will ich mal starten ....

Wenn jemand Ideen hat, immer ran

Kai
imac
20 Zoll
2,4 ghz
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo derkai und numerix

Danke für eure Antworten und Ideen.

Ich habe mein Projekt in diverse Module aufgeteilt:

a) battle_game.py
Enhält nur die Funktion 'main'

b) platform_gui.py
Enhält die Klasse für das Hauptfenster mit:
- Scrollbarer Canvas für die Spielfläche
- Zusätzliche Navigations-Schaltfächen für die Spielfläche
- Konfigurierbare Test-Schaltfächen

c) map_logic.py
Enthält die Klasse 'MapLogic'
Methoden für die Spielfeldlogik
Hexagon-Berechnung, Nachbarfelder-Ermittlung, Wegsuche usw.

d) map_gui.py
Enthält die Klasse 'MapGui'
Mit dieser Klasse werden die Spielfelder (Hexagons) und alles was
damit zusammenhängt grafisch auf der Plattform-GUI dargestellt

e) tank_logic.py
Mit der Klasse 'TankLogic'
Spiellogik für die Panzer. Bewegung, Verwaltung usw.

f) tank_gui.py
Enthält die Klasse 'TankGui'
Für die Darstellung aller Panzerbezogenen grafischen Objekte auf
der Plattform-GUI

g) battle_game_config.py
Enhält alle Konstanten für das Spiel. Spielparameter, Image-Daten usw.

h) logic_test.py
Enthält die Klasse 'LogicTest'
Enhält die grösseren Methoden für den Test der Logik-Module. Ausgaben auf
die Konsole usw.

Jedes Modul lässt sich einzeln starten um verschiedenen Modul-Tests
durchzuführen.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo derkay

Für was brauchst du die automatische Pfadsuche zu einem Zielfeld? Wird der Panzer nicht durch den Spieler über die erlaubten Felder fortbewegt? Wenn du die automatische Pfadsuche benötigst hast die denn Fall bei besetzten Nachbarfelder schon einmal näher angeschaut. Hauptsächlich wie werden diese besetzten Felder umgangen da es eventuelle mehrere Möglichkeite gibt z.B. längere oder kürzere Pfade oder im Extremfall sogar keine da alle Felder zum Ziel besetzt sind. Ich persönlich würde dieser Problematik vor dem erstellen der Panzer-Klasse den Vorrang geben ausser du hast schon eine Lösung. Ist nur ein Vorschlag.

Gruss wuf :wink:
Take it easy Mates!
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?
Antworten