我刚接触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;
}既然已经可以从pieceShape变量中获取当前的部分,为什么还要创建一个新的对象Shape result = new Shape();呢?
发布于 2011-03-15 17:59:38
在本教程中,命名似乎有点误导。名为Shape的类表示掉下来的单个项目。Tetrominoes enum似乎在描述它是哪种形状的项目(即,它是“”!)。
因此,您发布的代码创建了一个新的项并指定了它的形状。
rotateRight()和rotateLeft()方法不会修改形状本身,以允许tryMove()方法检查移动是否合法,如果不合法则忽略它(例如,如果要将项目旋转到墙上)。当不允许移动时,tryMove()只是保留旧值(包括旧的Shape实例)。如果rotateLeft()/rotateRight()修改了Shape,那么它将不得不撤消该操作,这将使代码复杂化。
此外,这段代码还有一些吹毛求疵的地方:
Tetrominoes类称为Tetromino,因为enum类型通常以单数形式命名(因为您经常引用单个元素:Tetromino.SquareShape.Tetromino的具体坐标的信息添加到该enum中,有效地将setShape()方法中的大部分逻辑放入其中。Board类混合了逻辑和表示,它应该分开(使其更容易测试)。例如,Board类可以在没有任何图形的情况下实现所有逻辑(即不引用来自java.awt或javax.swing的任何内容)。然后,您将编写一个BoardPanel来绘制Board的状态,并通过调用适当的Board方法与用户进行交互。
发布于 2011-03-15 17:58:29
您发布的方法返回一个向左旋转的形状。如果没有创建新的形状,则原始形状将被旋转。原始形状是类的字段,在其他地方使用。
在正方形形状的情况下,当向左旋转时不会改变,你仍然可以返回原来的形状。
发布于 2011-03-15 18:07:18
在没有深入阅读教程的情况下,我想说:由于Shape似乎表示单个项目,而rotateLeft()可能是Shape的一个实例方法,因此也可以就地旋转项目,即不返回旋转的副本,而是更改当前形状的块坐标。创建一个要掉落的新项目将意味着创建一个具有默认方向的新Shape。
https://stackoverflow.com/questions/5310019
复制相似问题