4

我刚接触 Java,我发现了这个创建 Java 俄罗斯方块游戏的好教程。

我没有导师或导师来帮助我 - 我一直在寻找一个 :( 所以目前我正在自学 Java 和 PHP :)

无论如何继承我发现的网站:http: //zetcode.com/tutorials/javagamestutorial/tetris/

我在Shape.java课堂上没有得到的程序的一种方法:

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;
}

如果已经可以从变量Shape result = new Shape();中获取当前部分,为什么我们需要创建一个新对象?pieceShape

4

4 回答 4

5

本教程中的命名似乎有点误导。被调用的类Shape代表一个掉落的单个项目。Tetrominoes enum似乎在描述它是哪种物品(即它是“形状”!)。

因此,您发布的代码会创建一个新项目并指定其形状。

和方法不会修改形状本身以允许该方法检查移动是否合法rotateRight(),如果不合法则忽略它(例如,如果您将一个项目旋转到墙上)。当不允许移动时,只保留旧值(包括旧实例)。如果/修改了,那么它将不得不撤消该操作,这会使代码复杂化。rotateLeft()tryMove()tryMove()ShaperotateLeft()rotateRight()Shape

此外,此代码有一些挑剔:

  • 我会调用Tetrominoesclass Tetromino,因为enum类型通常以单数命名(因为您经常引用单个元素:Tetromino.SquareShape.

  • 我会将有关每个具体坐标的信息添加Tetromino到其中enum,有效地将方法中的大部分逻辑setShape()放入其中。

  • 该类Board混合了逻辑和表示,它应该分开(使其更容易测试)。

    例如,Board该类可以在没有任何图形的情况下实现所有逻辑(即不从java.awtor引用任何内容javax.swing)。然后你会写一个BoardPanel绘制状态Board并与用户交互,调用适当的Board方法。

于 2011-03-15T09:59:37.767 回答
3

您发布的方法返回一个向左旋转的形状。如果您没有创建一个新的形状,那么作为该类的一个字段并在其他任何地方使用的原始形状将被旋转。

方形的情况下,向左旋转时不会改变,您仍然可以返回原始形状。

于 2011-03-15T09:58:28.793 回答
0

如果不仔细阅读教程,我会这样说:因为它Shape似乎代表一个单独的项目,并且rotateLeft()可能是一个实例方法,Shape所以也可以将项目旋转​​到位,即不返回旋转的副本而是更改块'当前形状的坐标。创建一个要倒下的新项目将意味着创建一个Shape具有默认方向的新项目。

于 2011-03-15T10:07:18.437 回答
0

似乎作者没有改变ShapeinrotateLeft()因为它可能不被接受为有效的移动。在Board内部TAdapter类调用中,仅在可接受的情况tryMove()下设置当前Shape(变量)。curShape如果它在该检查之前发生突变,则必须在无效时将其设置回来。该方法可能应该被命名rotatedLeftCopy()以表明它没有改变状态。或者应事先进行检查,然后rotateLeft()安全地更换Shape到位。

于 2011-03-15T10:12:42.880 回答