我刚接触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
变量中获取当前作品?
答案 0 :(得分:5)
在本教程中,命名似乎有点误导。名为Shape
的类表示单个项目。 Tetrominoes
enum
似乎在描述哪种项目(即它的“形状”!)。
因此,您发布的代码会创建一个新的项并指定其形状。
rotateRight()
和rotateLeft()
方法不会修改形状本身以允许tryMove()
方法检查移动是否合法,如果不合适则忽略它(例如如果你把一个项目旋转到墙上)。当不允许移动时,tryMove()
只保留旧值(包括旧Shape
实例)。如果rotateLeft()
/ rotateRight()
修改了Shape
,则必须撤消该操作,这会使代码复杂化。
此外,这段代码还有一些挑剔:
Tetrominoes
类Tetromino
,因为enum
类型通常以单数形式命名(因为您经常引用单个元素:{ {1}}。Tetromino.SquareShape
的具体坐标信息添加到Tetromino
中,有效地将enum
方法中的大部分逻辑放入其中。 setShape()
类混合逻辑和表示,它应该分开(使测试更容易)。
例如,Board
类可以在没有任何图形的情况下实现所有逻辑(即不引用Board
或java.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
。