Tetris

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
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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
BlackJack

@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.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Wenn du unter Windows unterwegs bist, notepad++ ist mit dem richtigen Plugin recht brauchbar. Zu deinem Problem, es scheinen div. Zeilen(fast 400!) zu fehlen.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Danke, waren ein paar dumme Fehler. Die korrigierte Version ist an der selben URL
Sirius3
User
Beiträge: 17739
Registriert: Sonntag 21. Oktober 2012, 17:20

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

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())
einfach

Code: Alles auswählen

for x,y in self.curPiece.coords:
    self.board[self.curY-y][self.curX+x] = self.curPiece.shape
Noch lustiger sind Methoden wie »Shape.minY« oder die Rotate-Methoden.
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)
BlackJack

@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`.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Ja ich fands auch komisch das es getter und setter gibt und die codewiederholung bei minX minY maxX maxY
Antworten