wo genau ist in diesen script der fehler

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.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

wo genau ist in diesen script der fehler

Beitragvon Costi » Sonntag 26. November 2006, 17:45

hmmm ich such seit ca 1 h nach diesen ferflixten bug, alles läuft prima (soll später ein tertris programm werden) ausser dass Parse.__init__ falshe werte für für den string "objekte" gibt

vieleicht will ja nhemand kurz reinschauen:

edit{
bitte beachte, dass die meisten variablen namen nichtssagend sind
}

nochmal edit:
beim thread muss noch irgendwie lock hin, show wird manchmal gleichzeitig ausgeführt

Code: Alles auswählen

import time
import threading
from string import count






objekte = """


rl

X00
X00
XX0

XXX
X00
000

XX0
0X0
0X0

00X
XXX
000


quadrat

XX
XX

XX
XX

XX
XX

XX
XX


ll

00X
00X
0XX

X00
XXX

XX
X0
X0

XXX
00X


gerade

XXXX

X
X
X
X

XXXX

X
X
X
X


dre

0X0
XXX

X0
XX
X0

XXX
0X0

0X
XX
0X


zl

XX0
0XX

0X
XX
X0

XX0
0XX

0X
XX
X0


zr

0XX
XX0

X0
XX
0X

0XX
XX0

x0
XX
0X
"""


class Field:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.spielfeld = eval(('[' + x * ('[' + (y-1) * ('" ",') + '" "' + ']' ) + ']').replace("][", "],["))#geht egentlich auch einfacher...

    def set(self, x, y, char):
        self.spielfeld[-1*y][x-1] = char
       
   
    def show(self):
        print (self.x + 2) * "#"
        st = ""
        for balken in self.spielfeld:
            kastens = ""
            for kasten in balken:
                kastens += kasten
            st += "#" + kastens + "#\n"
            kasten = ""
        st += (self.x + 2) * "#"
        print st

   
    def get(self, x, y):
        return self.spielfeld[-1*y][x-1]


      
      
   
class Parse:
   def __init__(self):
      self.figur = None
      
      retval = {}
      for i in objekte.split("\n\n\n"):
         retval3 = []
         zuerst = True
         for i2 in i.split("\n\n"):
            retval2 = "["
            if zuerst:
               zuerst = False
               key = i2
               retval[key] = []
            else:
               c = 0
               z = count(i2, "\n")+1
               for teil in i2.replace("\n", ""):  #in dieser for schleige muss der bug sein!!!
                  if teil == "X":
                     y = c/z
                     x = c%z
                     retval2 += "[" + str(x) + " + x, " + str(y) + " + y ],"
                  if teil == "X" or i == "0": #sicherheitshalber
                     c = c + 1
            if retval2 != "[":
               retval3.append(retval2 + "]")
         retval[key] = retval3
      self.teile = retval
      print eval(retval["rl"][1])
      
   def get(self, t, position, x, y):
      return eval(self.teile[t][position])
         
def show(fieldObj, figurObj, char):
   z = figurObj.get()
   print "z:", z
   new = z[1]
   old = z[0]
   if old:
      for i in old:
         fieldObj.set(i[0], i[1], " ")
   print "new:", new
   for i in new:
      fieldObj.set(i[0], i[1], char)
   fieldObj.show()
         
class Teil:
   def __init__(self, teil, x, y):
      self.x = x
      self.y = y
      self.figur = None
      self.position = 0
      self.teil = teil
      self.p = Parse()
      
   def down(self):
      self.y -=1
   
   def up(self):
      self.y += 1
   
   def right(self):
      self.x +=1

   def left(self):
      self.x -= 1
   
   def turn(self):
      if self.position == 3:
         self.position = 0
      else:
         self.position = self.position + 1
      
   def get(self):
      #self.figur = self._form()
      self.figurAlt = self.figur
      self.figur = self.p.get(self.teil, self.position, self.x, self.y)
      return [self.figurAlt, self.figur]




f = Field(40,40)
d = Teil("dre", 20, 20)
show(f,d, "X")




import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((64, 48))



def threadCode():
   while 1:
      time.sleep(0.3)
      d.down()
      show(f,d, "X")
      
t = threading.Thread(target = threadCode)
t.start()

while 1:
   for event in pygame.event.get():
      if (event.type == KEYDOWN):
         if event.key == K_UP:  #fuer tertis besonders hilfreich...
            d.up()
         elif event.key == K_RIGHT:
            d.right()
         elif event.key == K_LEFT:
            d.left()
         elif event.key == K_DOWN:
            d.turn()
         show(f,d, "X")   






Zuletzt geändert von Costi am Sonntag 26. November 2006, 18:15, insgesamt 1-mal geändert.
cp != mv
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Sonntag 26. November 2006, 18:02

Hoi Costi,

warum betreibst Du überhaupt den Aufwand aus "objekte" ein dictionary zu machen? Du könntest gleich von Anfang an ein dict mit den Attributen jedes Teils, z.B. in einer Liste, statt eines strings definieren - und müßtest nicht einen parser für Arme schreiben, der dann auch noch fehleranfällig bis zum geht nicht mehr ist.

Noch was: Kennst Du das Konstrukt

Code: Alles auswählen

if __name__== "__main__":
?
Das ist äußerst hilfreich ...

Imports nach Möglichkeit voranstellen - zumindest, wenn Du sie für die Ausführung Deines Codes sowieso brauchst. Und dann könntest Du auch noch klarer alle Definitionen und den eigentlich Ablauf des Spiels trennen.

Mit den paar Tipps wirst Du schon weiterkommen. (Vor allem der erste dürfte hilfreich sein.)

Gruß,
Christian
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Beitragvon Costi » Sonntag 26. November 2006, 18:08

Du könntest gleich von Anfang an ein dict mit den Attributen jedes Teils, z.B. in einer Liste, statt eines strings definieren


ich finde das mit den eval auch ziemlich hässlich, wusste aber nicht wie ich mir lambda eine def oder so das x und y erst später auswerten konnte


gruesse
costi
cp != mv
BlackJack

Beitragvon BlackJack » Sonntag 26. November 2006, 18:18

Bevor da nicht sämtliche Aufrufe von `eval()` verschwunden sind, ist das Programm in meinen Augen auch fehlerhaft wenn es funktioniert. Da steigt doch kein Mensch durch.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Beitragvon Costi » Sonntag 26. November 2006, 18:41

ich wollte ursprunglich ja auch für jede position won jeder figur einen schönen lambda obejkt haben, es wird aber mehrmals in einer for schlefe eine list mit noch nicht definierten variablen (x und y) zu einer anderen list hinzugefügt, die das objekt sein sollte. und das geht (zumindestens nach meiner logik(;) nur mit strings
cp != mv
BlackJack

Beitragvon BlackJack » Sonntag 26. November 2006, 18:46

Irgendwie verstehe ich Deinen letzten Beitrag genausowenig wie den Quelltext. Wegwerfen und neu schreiben wäre vielleicht eine Lösung. Aber bitte verständlicher.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Beitragvon Costi » Sonntag 26. November 2006, 18:53

hmmmm ok, was für programmier-konventionen gibt es eigentlich, damit alles verständlicher wird? (zb wereden evals anscheinend garnicht gerne gesehn)


man könnte darüber auch evtl einen wiki eintrag schreiben
cp != mv
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Sonntag 26. November 2006, 19:01

Costi hat geschrieben:ich finde das mit den eval auch ziemlich hässlich, wusste aber nicht wie ich mir lambda eine def oder so das x und y erst später auswerten konnte

Notfalls nimmst Du Konstrukte wie hier beschrieben. Aber ob Du tatsächlich so von hinten-durch-die-Brust-ins-Auge-kriechen mußt, wie Dein Code nahelegt, daß ist der eigentliche Punkt, den Du überdenken solltest. BlackJacks Unmut ist schon nachvollziehbar - nicht wegen der kleinen Zahl der evals, sondern weil Du sie überhaupt benutzt, obwohl es unnötig ist.

Programmierkonventionen: Versuche einfach und klar zu schreiben und zu nutzen, was Dir die Sprache bietet. Du kannst ja mal den Code anderer Leute zur Hilfe nehmen: Steigst Du sofort durch, kann der so schlecht nicht sein - mit der Zeit kommen sicherlich bessere Kriterien hinzu. Ich finde PyTetris hat z. B. einen schönen Quellcode, der Dir als Beispiel dienen kann.

Gruß,
Christian

PS Vielleicht magst Du Dir in den nächsten Posts auch etwas mehr Mühe in der Rechtschreibung geben? Deine Posts sind sonst nämlich auch an und für sich nicht so einfach zu verstehen.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Sonntag 26. November 2006, 19:18

Hmm meine Meinung zu Eval, auch auf die Gefahr hin das mich die Communityt dafür hassen wird xD

1. Wenn du an einem Punkt angelangt bist beim Programmieren an dem du merkst, das du Eval benutzen musst, dann sei dir bewusst das du die Problemlösung falsch angepackt hast. Daraus folgt -> Sourcecode ab in den Müll ;) Das gleiche gilt auch ausdrücklich für exec!
2. Punkt 3 scheint sich mit Punkt 1 zu widersprechen. Ignoriere den Widerspruch weil es Spezialfälle sind ;) (Das ist der Punkt an dem gleich die Buhhh rufe der Community kommen ^^)
3. Taj, wie würde ich eine neue Programmiersprache schreiben mit Python? :lol: Der Simpelste weg ist wohl (nach dem parserei vom geschriebene Parser etc. pp.) dann per exec die Python befehle in richtiger Abhängigkeit auszurufen ;) Und wenn es sich nicht gerade um eine kontextsensitive Sprache wie Perl handelt, wird so eine Implementierung nicht länger als 500 Zeilen Code betragen ;) Das und nur das (vielleicht gibt so ein par fälle) rechtfertigt es eval und exec zu benutzen!

lg
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Sonntag 26. November 2006, 19:32

@XtraNine: Hä?

Positivbeispiele für den Gebrauch von exec und eval:
- http://www.egenix.com/files/python/pyar.py
- http://lybniz2.sourceforge.net/index.html

Gibt vielleicht auch noch mehr und bessere Beispiele.

Gruß,
Christian
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Sonntag 26. November 2006, 19:50

CM hat geschrieben:@XtraNine: Hä?
[..]
? Was meinst du mit hä :?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Montag 27. November 2006, 06:48

Was meinst Du mit Punkt 3? (Intention? Aussage?) :wink:
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Montag 27. November 2006, 22:36

Steht doch da was ich meine. Ansonsten quote die unklare stelle, damit ich weiß was unklar ist.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Dienstag 28. November 2006, 09:25

Laß gut sein - ich stehe wohl auf dem Schlauch.
BlackJack

Beitragvon BlackJack » Dienstag 28. November 2006, 10:27

Vielleicht stehen wir auf dem selben Schlauch, ich finde Punkt 3 insgesamt etwas verwirrend. Hatte aber auch erst einen Kaffee. :-)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]