首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么创建新对象- Java俄罗斯方块教程

为什么创建新对象- Java俄罗斯方块教程
EN

Stack Overflow用户
提问于 2011-03-15 17:53:32
回答 4查看 5.4K关注 0票数 4

我刚接触Java,我发现了这个创建Java俄罗斯方块游戏的很好的教程。

我没有导师或导师来帮助我-我已经找了很久了:(所以现在我在自学Java和PHP :)

不管怎样,这是我找到的网站:http://zetcode.com/tutorials/javagamestutorial/tetris/

我在Shape.java类中没有得到程序中的一个方法:

代码语言:javascript
复制
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();呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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.awtjavax.swing的任何内容)。然后,您将编写一个BoardPanel来绘制Board的状态,并通过调用适当的Board方法与用户进行交互。

票数 5
EN

Stack Overflow用户

发布于 2011-03-15 17:58:29

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

在正方形形状的情况下,当向左旋转时不会改变,你仍然可以返回原来的形状。

票数 3
EN

Stack Overflow用户

发布于 2011-03-15 18:07:18

在没有深入阅读教程的情况下,我想说:由于Shape似乎表示单个项目,而rotateLeft()可能是Shape的一个实例方法,因此也可以就地旋转项目,即不返回旋转的副本,而是更改当前形状的块坐标。创建一个要掉落的新项目将意味着创建一个具有默认方向的新Shape

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5310019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档