题
我只是new Java和我发现了这种良好的教程创建一个Java俄罗斯方块的游戏。
我没有一位导师或辅导,以帮助我这个-我一直在寻找一个为年龄:( 因此目前im自我学习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
变量?
解决方案
看来命名是有点误导人在这个教程。这类称为 Shape
代表一个单一的项目,下降。的 Tetrominoes
enum
似乎是描述 哪种类型 的项目(即这是"形"!).
这样的代码发布创建一个新的 项目 并指定它的形状。
的 rotateRight()
和 rotateLeft()
方法不要修改本身的形状,以允许的 tryMove()
方法,来检查如果移动是合法的,而忽略,如果它不是(例如,如果你转动一个项目进入壁)。 tryMove()
只需保持旧的价值(包括老 Shape
实例)当的移动是不允许的。如果 rotateLeft()
/rotateRight()
修改的 Shape
然后它就必须撤消这项行动,这将复杂的代码。
此外,有几个nitpicks这个代号:
- 我会打电话的
Tetrominoes
类Tetromino
, 如enum
类型通常是指在单数(因为你经常引用 单 元件:Tetromino.SquareShape
. - 我想添加的信息有关的具体坐标的每
Tetromino
到那enum
, 有效地把太多的逻辑setShape()
法进入。 的
Board
类混合逻辑和显示,应当分离(使它更容易试验)。例如的
Board
类可以实现所有的逻辑,没有任何图形(即不准任何从java.awt
或javax.swing
).然后你会写BoardPanel
绘制的状态Board
和与用户相互作用,呼吁适当Board
方法。
其他提示
您发布的方法返回左旋转的形状。如果您没有创建新的形状,那么原始形状(即类的字段)将被旋转。
如果正方形在向左旋转时不会更改,则您仍然可以返回原始形状。
没有彻底看教程,我会这么说: Shape
似乎代表单个项目, rotateLeft()
可能是一种实例方法 Shape
可以旋转到位的项目也可以,即不返回旋转副本,而是更改当前形状的块坐标。创建一个新项目要掉落将意味着创建一个新的 Shape
默认方向。
看来作者没有变异 Shape
在 rotateLeft()
因为它可能不会被接受为有效的举动。在 Board
内在 TAdapter
课程通话 tryMove()
并且仅设置电流 Shape
(多变的 curShape
)如果可以接受。如果在检查之前已突变,则必须在无效时将其放回原处。该方法应该命名 rotatedLeftCopy()
表明它没有改变状态。否则应事先执行检查 rotateLeft()
可以安全更改 Shape
到位。