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)