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

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:

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: 545
Registriert: Donnerstag 17. August 2006, 14:21

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

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: 545
Registriert: Donnerstag 17. August 2006, 14:21

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

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: 545
Registriert: Donnerstag 17. August 2006, 14:21

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:

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

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:

@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

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

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

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:

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

Vielleicht stehen wir auf dem selben Schlauch, ich finde Punkt 3 insgesamt etwas verwirrend. Hatte aber auch erst einen Kaffee. :-)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ok, kein Problem. Ich schreibe mal gleich eine script (Rohfassung) von dem was ich meine. Kann aber ein wenig dauern. Muss noch was nebenbei tun und bin nicht der schnellste proger ;)

bis nachher

lg xtra
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hier aml ein Simples Beispiel auf die schnelle zusammengehackt. Hab keine zeit konkreter was zu machen. Das ganze muss auch richtig durchdacht werden. Aber es sollte aber reichen um zu zeigen was ich meine

Code: Alles auswählen

class MyScriptInterpreter(object):
    def __init__(self, source_code):
        self._source_code = source_code
        self._object_code = [] # den namen nicht so ernst nehmen ;)
        
    def compile(self):
        lines = self._source_code.splitlines()
        tmp = ""
        
        for line in lines:
            tmp = ""
            tmp2 = ""
            for token in line.split(" "):
                if len(token) == 0: 
                    continue   
                if token == "drucke":                   
                    tmp += "print "
                elif token[0] == '\"':
                     tmp += "%s " % token
                elif token[-1] == '\"':
                     tmp += "%s " % token
                                   
                            
            if len(tmp) != 0:
                self._object_code.append(tmp)
    
    def run(self):
        for cmd in self._object_code:
            exec(cmd)
    
script = """
drucke "Hallo Welt!"
"""
msp = MyScriptInterpreter(script)
msp.compile()
msp.run()
output

Code: Alles auswählen

Hallo Welt!
lg
Antworten