Frage

Ich bin nur neu in Java und ich fand dieses gute Tutorial für die Erstellung eines Java -Tetris -Spiels.

Ich habe keinen Mentor oder einen Tutor, der mir dabei hilft - ich habe seit Ewigkeiten nach einem gesucht :( So lerne ich selbst Java und PHP selbst :)

Wie auch immer, hier ist die Website, die ich gefunden habe: http://zetcode.com/tutorials/javagamestutorial/tetris/

Eine Methode des Programms, ich bekomme nicht in die Shape.java Klasse:

public Shape rotateLeft() 
{
 if (pieceShape == Tetrominoes.SquareShape)
     return this;

 Shape result = new Shape();
 result.pieceShape = pieceShape;

 for (int i = 0; i < 4; ++i) {
     result.setX(i, y(i));
     result.setY(i, -x(i));
 }
 return result;
}

Warum müssen wir ein neues Objekt erstellen? Shape result = new Shape(); Wenn Sie das aktuelle Stück bereits von der erhalten können pieceShape Variable?

War es hilfreich?

Lösung

Es scheint, dass die Benennung in diesem Tutorial etwas irreführend ist. Die Klasse rief Shape repräsentiert einen einzelnen Gegenstand, der niederfällt. Das Tetrominoes enum scheint zu beschreiben welche Art von Gegenstand ist es (dh es ist "Form"!).

Der Code, den Sie gepostet haben Artikel und gibt seine Form an.

Das rotateRight() und rotateLeft() Methoden ändern die Form selbst nicht, um die zuzulassen tryMove() Methode, um zu überprüfen, ob der Umzug legal ist, und ignorieren, wenn dies nicht der Fall ist (z. B. wenn Sie einen Gegenstand in die Wand drehen). tryMove() behält einfach die alten Werte (einschließlich der alten Shape Instanz) Wenn der Umzug nicht erlaubt ist. Wenn rotateLeft()/rotateRight() modifizierte die Shape Dann müsste es diesen Vorgang rückgängig machen, der den Code komplizieren würde.

Außerdem gibt es ein paar Nitpicks mit diesem Code:

  • Ich würde das nennen Tetrominoes Klasse Tetromino, wie enum Typen werden normalerweise im Singular benannt (da Sie häufig auf a verweisen Single Element: Tetromino.SquareShape.
  • Ich würde die Informationen über die Betonkoordinate von jedem hinzufügen Tetromino in das enum, effektiv viel von der Logik aus der setShape() Methode hinein.
  • Das Board Die Klassen mischt die Logik und die Präsentation, sie sollte getrennt werden (erleichtert das Testen viel einfacher).

    Zum Beispiel die Board Die Klasse könnte die gesamte Logik ohne die Grafik implementieren (dh nichts verweisen java.awt oder javax.swing). Dann würdest du eine schreiben BoardPanel Das zieht den Zustand der Board und interagiert mit dem Benutzer und ruft das angemessene auf Board Methoden.

Andere Tipps

Die von Ihnen veröffentlichte Methode gibt eine Form zurück, die links gedreht wird. Wenn Sie keine neue Form erstellt haben, wäre die ursprüngliche Form, die ein Feld der Klasse ist und überall sonst verwendet wird, gedreht worden.

Bei der quadratischen Form, die sich bei der Linken nicht geändert hat, können Sie die ursprüngliche noch zurückgeben.

Ohne gründlich nach dem Tutorial zu schauen, würde ich das sagen: seitdem Shape scheint einen einzelnen Gegenstand darzustellen und rotateLeft() könnte eine Instanzmethode von sein Shape Es könnte auch in Ordnung sein, das Element vorhanden zu drehen, dh keine gedrehte Kopie zurückzugeben, sondern die Blockkoordinaten der aktuellen Form zu ändern. Das Erstellen eines neuen Elements zum Herunterfallen würde dann bedeuten, ein neues zu erstellen Shape mit Standardausrichtung.

Es scheint, dass der Autor das nicht mutiert Shape in rotateLeft() Weil es möglicherweise nicht als gültiger Schritt akzeptiert wird. Im Board das Innere TAdapter Klassenanrufe tryMove() und legt nur den Strom fest Shape (Variable curShape) Wenn es akzeptabel ist. Wenn es vor diesem Überprüfen mutiert wurde, müsste es bei ungültigem Wert zurücklegen. Die Methode sollte vielleicht benannt werden rotatedLeftCopy() um anzuzeigen, dass es den Zustand nicht ändert. Oder der Scheck sollte vorher und dann durchgeführt werden rotateLeft() wäre sicher, das zu ändern Shape an Ort und Stelle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top