为什么要创建一个新的对象 - Java Tetris教程

时间:2011-03-15 09:53:32

标签: java object tetris

我刚接触Java,我找到了创建Java Tetris游戏的好教程。

我没有导师或导师帮我这个 - 我一直在寻找一个年龄:( 所以目前我自学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 个答案:

答案 0 :(得分:5)

在本教程中,命名似乎有点误导。名为Shape的类表示单个项目。 Tetrominoes enum似乎在描述哪种项目(即它的“形状”!)。

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

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

此外,这段代码还有一些挑剔:

  • 我会调用TetrominoesTetromino,因为enum类型通常以单数形式命名(因为您经常引用单个元素:{ {1}}。
  • 我将每个Tetromino.SquareShape的具体坐标信息添加到Tetromino中,有效地将enum方法中的大部分逻辑放入其中。
  • setShape()类混合逻辑和表示,它应该分开(使测试更容易)。

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

答案 1 :(得分:3)

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

如果是方形,左旋时不会改变,你仍然可以返回原来的形状。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

作者似乎没有改变Shape中的rotateLeft(),因为它可能不被视为有效行动。在Board内部TAdapter类调用tryMove()并仅设置当前Shape(变量curShape),如果可以接受的话。如果在检查之前发生了变异,那么当无效时必须将其重新设置。该方法可能应该命名为rotatedLeftCopy(),以表明它没有改变状态。或者应该事先进行检查,然后rotateLeft()可以安全地更改Shape