Ich habe diesen Code
http://pastebin.com/CMfCwVYT
von diesem Tutorial http://zetcode.com/tutorials/pyqt4/german/ abgeschrieben aber es funktioniert nicht es kommt nur ein leeres Fenster und es steht Game over in der Statusbar. Wo liegt der Fehler? Ich weiss auch nicht wie ich das debuggen soll.
Danke
Gruss fail
Tetris
@fail: Ich weiss nicht ob das so ein besonders gutes Vorgehen ist, weil das nicht dem Ablauf entspricht in dem man Programme entwickelt. Die Situation das man erst eine riesige Menge an Quelltextzeilen runterhackt, und dann am Ende hofft, dass es läuft beziehungsweise sich *dann* erst auf die Suche nach Fehlern macht, ist praxisfern. Programme werden Stück für Stück entwickelt. Das ist ein Prozess in dem sich die Schritte planen was als nächstes hinzugefügt werden soll, Implementierung dieses Teils, und *testen* ob das auch wirklich bis dahin so funktioniert wie man es gerne hätte, immer wiederholen, bis das Programm fertig ist. Und wenn etwas nicht funktioniert, dann macht man nicht mit anderen, weiteren Teilen weiter, bis man das Problem gelöst hat.
Für den konkreten Fall jetzt könntest Du als erstes mal das Original mit Deinem Quelltext vergleichen. Mit einerm geeigneten Werkzeug. Minimal das klassische ``diff`` auf der Kommandozeile, es gibt aber auch diverse grafische „Differ” die das ansprechender und farbig darstellen (Kdiff3, Kompare, Meld, Windiff, …). Dann sollten Dir zum Beispiel Unterschiede bei der Namensvergabe auffallen und das Du an einer Stelle einen Rückgabewert vergessen hast.
Für den konkreten Fall jetzt könntest Du als erstes mal das Original mit Deinem Quelltext vergleichen. Mit einerm geeigneten Werkzeug. Minimal das klassische ``diff`` auf der Kommandozeile, es gibt aber auch diverse grafische „Differ” die das ansprechender und farbig darstellen (Kdiff3, Kompare, Meld, Windiff, …). Dann sollten Dir zum Beispiel Unterschiede bei der Namensvergabe auffallen und das Du an einer Stelle einen Rückgabewert vergessen hast.
Zum Tetris an sich: Der Programmierer kommt mit großer Wahrscheinlichkeit aus der Java-Ecke und hat sich in Python noch nicht richtig eingelebt. Die Namensgebung erinnert stark an Java.
Das 2D-Spielfeld ist eine Liste, weshalb auch Methoden zum Umrechnen von Koordinaten in Index nötig sind. Daher laufen auch alle Schleifen über einen Index, statt direkt auf den passenden Listen zu iterieren.
Selbes Bild bei Shape: Statt einfach über die Liste »coords« zu iterieren, muss jeweils ein Index von 0 bis 3 laufen, der für »shape.x(i)« bzw. »shape.y(i)« gebraucht wird.
In »pieceDropped« wird aus
einfach
Noch lustiger sind Methoden wie »Shape.minY« oder die Rotate-Methoden.
Ein Python-Programmierer wäre für die Klasse »Shape« bei soetwas gelandet:
Das 2D-Spielfeld ist eine Liste, weshalb auch Methoden zum Umrechnen von Koordinaten in Index nötig sind. Daher laufen auch alle Schleifen über einen Index, statt direkt auf den passenden Listen zu iterieren.
Selbes Bild bei Shape: Statt einfach über die Liste »coords« zu iterieren, muss jeweils ein Index von 0 bis 3 laufen, der für »shape.x(i)« bzw. »shape.y(i)« gebraucht wird.
In »pieceDropped« wird aus
Code: Alles auswählen
for i in range(4):
x = self.curX + self.curPiece.x(i)
y = self.curY - self.curPiece.y(i)
self.setShapeAt(x, y, self.curPiece.shape())
Code: Alles auswählen
for x,y in self.curPiece.coords:
self.board[self.curY-y][self.curX+x] = self.curPiece.shape
Ein Python-Programmierer wäre für die Klasse »Shape« bei soetwas gelandet:
Code: Alles auswählen
class Shape(object):
SHAPES_COORDS = (
(),
((0, -1), (0, 0), (-1, 0), (-1, 1)),
((0, -1), (0, 0), (1, 0), (1, 1)),
((0, -1), (0, 0), (0, 1), (0, 2)),
((-1, 0), (0, 0), (1, 0), (0, 1)),
((0, 0), (1, 0), (0, 1), (1, 1)),
((-1, -1), (0, -1), (0, 0), (0, 1)),
((1, -1), (0, -1), (0, 0), (0, 1))
)
def __init__(self, shape, coords):
self.shape = shape
self.coords = tuple(coords)
@classmethod
def create_random_shape(cls):
shape = random.randint(1, 7)
return cls(shape, cls.SHAPES_COORDS[shape])
def min_y(self):
return min(y for _,y in self.coords)
def rotated_left(self):
return Shape(self.shape, (y,-x) for x,y in self.coords)
def rotated_right(self):
return Shape(self.shape, (-y,x) for x,y in self.coords)
@Sirius3: Mein erster Eindruck war, dass hier Namensgebung und API-Gewohnheiten von Qt übernommen/in Python weitergeführt wurden. Zum Beispiel Getter/Setter `name` und `setName` statt der in Java üblichen `getName` und `setName`.