Pacman MapEditor

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.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ich hab dies mal ein Kompliziertes Problem:
Ich will einen Map-Editor für mein Pacman Spiel Programmieren. Im Grunde genommen soll der aus einem Tk-Fenster bestehen und 147 Entryfelder haben (7*21) dann soll man auf einen Button drücken und dann soll das skript daraus einen String generieren den ich in die Map Datei einsetzten kann. Das Problem die vielen Entrys wie kann man die geschickt nach einander die anordnen und abfragen?

(Das Spiel ist für Taschenrechner und in die Entrys soll man dann z. B. #, K, D, ... einsetzen.)
Sieht dann in etwa so aus:
Bild
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Wo liegt denn deine Schwierigkeit dabei bzw. wie sähe denn dein Lösungsansatz aus?
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Gut also die ganzen 147 felder per Hand anzuordnen ist sehr aufwendig und auch irgend wie ungeschickt. Als Lösung-Ansatz hätte ich den Exec Befehl aber der ist auch nicht gerade besser.
Das zweite Problem kann man nur verstehen wenn man weiß sie die Maps aufgebaut sind:

erst hab ich immer eine Liste genommen in der die Koordinaten in einer Zahl gespeichert werden.
(1.03, 2.05). Das dauert aber bei der Überprüfung ob bei einer Bewegung eine Wand ist order nicht ziemlich lange und es lankt leicht. Jetzt will ich es so machen das die Liste 147 lang ist und eine Wand z. B. 1 ist eine Punkt 0, eine Schlüssel 2 usw..

Das problem ist es wie kann ich geschickt nach eineander die Entrys abfragen und dann in den String umwandeln. Es geht dabei eher um das Abfragen als um das in den String umzuwanden.

Einen Direkten Lösungs ansatz hab ich nicht nur halt den in halt der Entrys mit einem Directory umzuwandeln.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du wirst es bei über 500 Beiträgen sicher nicht gerne hören, aber wenn du es nicht einmals schaffst ein zweidimensionales Spielfeld dynamisch zu erzeugen, dann wird es vielleicht endlich mal Zeit das Tutorial durchzuarbeiten.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich bin mal lieb und zeige Dir einen Thread, in dem es um ein ähnliches Problem ging - so weit ich Dein Problem richtig verstanden habe.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

@EyDu

Die meisten der 500 Beitraegen bestehen ja eher aus beleidigte-Leberwurst-spielen, und das zu sein kostet eine Meeenge Zeit - da kann man nicht noch programmieren lernen nebenbei... ;)
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Hyperion hat geschrieben:Ich bin mal lieb und zeige Dir einen Thread, in dem es um ein ähnliches Problem ging - so weit ich Dein Problem richtig verstanden habe.
Ja du hast es in etwa verstanden, leider ist der einzige Teil der Hilf reich ist der:
Stelle Dir vor, Du schreibst eine Sortierfunktion, die folgendes Problem lösen kann: [4, 2, 6, 1]. Wäre doch doof, wenn die das Problem [10, 3, 43, 2, 5] nicht auch sortieren könnte, oder?
Aber danke für den Link.
Wenn ich den Beitrag davor richtig verstanden habe helft ihr mir erst weiter wenn ich was selber mal einen Ansatz Programmiert hab. Na gut, ich will's versuchen. Aber schon wird das nicht ...
Kann es sein das eine Klasse zu verwenden schon ein richtiger Ansatz für den Ansatz ist?
Zuletzt geändert von Py-Prog am Dienstag 23. August 2011, 20:11, insgesamt 1-mal geändert.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

deets hat geschrieben:@EyDu

Die meisten der 500 Beitraegen bestehen ja eher aus beleidigte-Leberwurst-spielen, und das zu sein kostet eine Meeenge Zeit - da kann man nicht noch programmieren lernen nebenbei... ;)
Rechte Gehirn-hälfte beleidigte-Leberwurst-spielen, Linke programmieren lernen, wo ist das Problem :?:
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Py-Prog hat geschrieben: Ja du hast es in etwa verstanden, leider ist der einzige Teil der Hilf reich ist der:
Stelle Dir vor, Du schreibst eine Sortierfunktion, die folgendes Problem lösen kann: [4, 2, 6, 1]. Wäre doch doof, wenn die das Problem [10, 3, 43, 2, 5] nicht auch sortieren könnte, oder?
Aber danke für den Link.
Also wenn ich Dich richtig verstanden habe, dann passt der Thread wie "Arsch auf Eimer" - man verzeihe mir diese drastische Sprache ;-)

Da Du das anders siehst, hast Du also entweder die Erklärungen und Hinweise dort immer noch nicht verstanden, oder aber Dein Problem ist doch ein anderes.

Um das zu klären, solltest Du einfach mal etwas ausführlicher beschreiben, was Du vor hast und woran Du scheiterst bzw. keine Ahnung hast, wie Du das modellieren kannst. Anstelle eines Screenshots (der schon ok ist), kannst Du ja auch einfach mal in Code-Tags kleine Beispiele geben, wie Dein Spielfeld codiert sein soll und wo Du welche Probleme siehst.

Ich will mich hier den anderen nicht anschließen, aber hoffe doch mal inständig, dass Du Dir da jetzt einfach mal Mühe gibst. Denn dann bekommst Du auch einfacher Hilfe und zudem zielgerichtetere als "Arbeite das Tutorial durch" - was man bei so einer allgemeinen Frage einfach nur sagen kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ich denke ich könnte das auch allein schaffen, aber es ist dann nicht geschickt.
Das Feld Generieren hätte ich schon, wenn auch unschön, gelöst. Der rest ist auch nicht die Welt.

Code: Alles auswählen

import tkinter

class Map_Editor(object):
    def __init__(self, x, y):
        self.editorwindow = tkinter.Tk()
        self.editorwindow.title('Pacman MapEditor')
        self.entry_vars = []
        
        for y_coord in range(y):
            for x_coord in range(x):
                varname = ''.join(('y', str(y_coord), 'x', str(x_coord)))
                exec(''.join((varname, ' = ', 'tkinter.Entry(self.editorwindow, width=1)')))
                exec(''.join((varname, '.grid(row=', str(y_coord), ',column=', str(x_coord), ')')))
                exec(''.join(('self.entry_vars.append(', varname, ')')))

editor = Map_Editor(21, 7)
tkinter.mainloop()
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Vegiss bitte das es ``exec`` gibt und erlerne die Grundlagen zu Dictionaries oder vielleicht auch Listen.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

BlackJack hat geschrieben:@Py-Prog: Vegiss bitte das es ``exec`` gibt und erlerne die Grundlagen zu Dictionaries oder vielleicht auch Listen.
Ist das ein zusammen hängen der Tipp oder nicht. Bzw. was ist außer exec nicht schön?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also diese Antwort geht auf meine "Gegenfragen" schlicht nicht ein. So viel zum Thema "Mühe" geben ...

Da ich mich mit Tk nicht auskenne, kann ich nur erahnen, was Du da tust und wozu. Ich nehme an, Du willst ein "Bedienelement" für Deinen Editor schaffen, also eine neue UI-Komponente. Du versuchst das wohl mit dem stumpfen aneinanderreihen von Standard-Buttond / Eingabefeldern o.ä. und das auf eine ziemlich gruselige Art und Weise.

Nun kenne ich mich mit Tk nicht aus, aber Du kannst doch auch sicherlich einfach eine Liste von Elementen direkt im Code instanzieren? Wozu also das exec?

Ich würde ja erwägen, eine neue Komponente selber zu basteln. K.A. inwiefern man da mit Tk weiterkommen kann. Man bräuchte ja nur eine Art "Canvas" auf dem ich beliebige Pixel beeinflussen kann. Darauf kann ich eine Art Karo-Muster aufmalen. In die Kästen kommen dann noch die Symbole, die die Spielelemente symbolisieren. Dann muss man noch Mausklicks abfangen und aus der relativen Position auf dem Bildschirm auf die Kooridnate auf dem logischen Spielfeld schließen. Mehr braucht es dafür nicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Das Problem sind die Variablen die kann ich nicht ohne Exec generieren lassen.
(Und du hast richtig geraten)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
deets

@Py-Prog

Offensichtlich sind deine Gehirnhaelften doch beide ausgelastet mit Dingen, die nix mit Python zutun haben. Zum wiederholten male: benutze Listen oder dicts fuer sowas. Ist das wirklich so schwer?
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Wo hab ich da ein dicts verwendet?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Hyperion: So schlecht ist die Grundidee mit den Standardelementen in einem Grid-Layout IMHO gar nicht. Ich würde nicht gerade `Entry`\s nehmen, denn da wäre *ein* normales Texteingabefeld wo man einfach das Level als Text eingibt, sicher komfortabler. Das gruselige ist halt, dass per ``exec`` für jedes Feld ein Name erstellt wird. Dazu sind die ganzen Namen dann auch noch auf Modulebene.

@Py-Prog: Du hast kein `dict` verwenden. Das ist es ja gerade. Du brauchst nur *einen* Namen an den die entsprechende Datenstruktur gebunden wird, in der die Elemente gespeichert werden. Dazu braucht man kein ``exec``.
deets

Hast du eben nicht. Statt variablen mit Namen "y10x20" anzulegen machst du ein dict

Code: Alles auswählen

entries = {}
for x in xrange(10):
     for y in xrange(10):
          entries[(x, y)] = tkinter.Entry...

nix exec.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@Hyperion: So schlecht ist die Grundidee mit den Standardelementen in einem Grid-Layout IMHO gar nicht. Ich würde nicht gerade `Entry`\s nehmen, denn da wäre *ein* normales Texteingabefeld wo man einfach das Level als Text eingibt, sicher komfortabler. Das gruselige ist halt, dass per ``exec`` für jedes Feld ein Name erstellt wird. Dazu sind die ganzen Namen dann auch noch auf Modulebene.
Da habe ich mich wohl zu rigoros ausgedrückt. Ich finde es auch nicht schlimm; ein eigenes Element zu bauen empfinde ich als eleganter. Aber für den OP ist der Ansatz sicherlich einfacher zu beherrschen; auch wenn es da schon an den Basics hapert.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

@BlackJack Danke jetzt hats geschnakelt! Heute hab ich keine Zeit mehr ich mach dann morgen weiter, gute Nacht.

Ich hab deshalb kein Texteingabe feld hergenommen weil man dann Zählen müsste und die einzelnen Buchstaben sind nicht gleich groß.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Antworten