java - 为什么要创建一个新对象 - Java 俄罗斯方 block 教程

标签 java object tetris

我是 Java 的新手,我发现了这个关于创建 Java 俄罗斯方 block 游戏的好教程。

我没有导师或家庭教师来帮助我 - 我一直在寻找一个人 :( 所以目前我正在自学 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,则它必须撤消该操作,这会使代码复杂化。

此外,这段代码还有一些问题:

  • 我将 Tetrominoes 类称为 Tetromino,因为 enum 类型通常以单数形式命名(因为您经常引用单个元素:Tetromino.SquareShape

  • 我会将关于每个 Tetromino 的具体坐标的信息添加到那个 enum 中,有效地将来自 setShape( ) 方法。

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

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

关于java - 为什么要创建一个新对象 - Java 俄罗斯方 block 教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5310019/

相关文章:

java - 如何删除一个空的对象数组?

c# - 如何将 foreach 与二维对象数组一起使用?

java - 如何在 JAXB2 maven 插件版本 2.4 中定义模式目录?

JAVA_HOME 未正确定义 -- mvn

java - Spring Boot JPA 保存多对多关系

java - 保证消息异步传送

arrays - 创建要添加到数组的pscustomobject的正确方法

algorithm - 俄罗斯方 block 的 n 个 block 的不同有效 block

python - 如何用 Python 创建自动化俄罗斯方 block 机器人?