Java Tetris - 关于片段轮换的思考

时间:2013-04-03 14:29:45

标签: java swing

我正在构建俄罗斯方块并尝试考虑如何旋转碎片。

他们在一个街区上旋转吗?或者他们应该变形......也就是交换位置?

enter image description here

我正在考虑这样做的方式是硬编码......就像(伪代码):

if (rotateRight()) {

    if (Piece == "T") {
        if (Piece.getCurrRotation() == down (aka.. 180 degrees))
          move each Tile in Piece from the down rotation to the left rotation... each coordinate would be pre-specified for a given condition... aka lot's of hardcoding
     }
    if (Piece == "L") { etc...

     }
}
if (rotateLeft()) {
     perform same checks for the Left...
}

但这似乎只是为了弄清楚

而需要大量的代码

首先)当前作品所处的旋转(每件可能有4次旋转)

其次)从那里......根据该片段将其设置为新的硬编码坐标

我必须为每件作品做到这一点......这似乎是错误的思考方式。

还有其他想法吗?

6 个答案:

答案 0 :(得分:1)

如果您将片段存储为矩阵,则可以使用通用函数旋转矩阵。假设您要将[[1,1,1],[0,0,0],[0,0,0]]向左旋转90度 - > [[1,0,0],[1,0,0],[1,0,0]]。这有帮助吗?

答案 1 :(得分:1)

您有2个选项(取决于存储形状的方式):

  • 执行旋转运行时(将形状点保持在矩阵中,并围绕中心旋转)并重新定位形状块。
  • 为形状存储4(或旋转不变形状,2或甚至1)相,并且仅增加/减少形状所处的相位。

在第一个版本中,您必须计算运行时间,找到形状的中心等。

在第二个版本中,您必须进行预先计算,并对形状进行硬编码。

我认为第二种方法更好,因为你有固定数量的片段和固定的阶段数。但这取决于你。

答案 2 :(得分:1)

每个PieceType对象可能有1-4个Orientation对象。然后,每个方向将定义实际块的位置(相对于某个枢轴)。例如

PieceType "L":

    Orientation 1:
    #
    #
    ##

    Orientation 2:
    ###
    #

    Orientation 3:
    ##
     #
     #

    Orientation 4:
      #
    ###

PieceType "I":

    Orientation 1:
    #
    #
    #
    #

    Orientation 2:
    ####

每个PieceType还可以保存关于每个可能的“方向改变”(即旋转)所需空间的信息。这是所有静态信息,因此在游戏过程中确实没有必要移动块。只需更改Piece的方向,让Orientation对象告诉您块位置。

答案 3 :(得分:1)

这个示例代码看起来像是一场噩梦。

另一种方法,那就是超级简单,就是将电路板视为固定数量的单元,然后将每个“旋转”视为计算每个部件位置应移动多少的一种方式,然后只是重新安装这些碎片,然后让它们自己绘制,所以从碎片的角度来看,它们只是被告知:'好吧,你现在在A5。'

如果你看一下你的第一个例子,新的位置只是它们目前偏离中心和所需旋转方向的函数。

关于这种方法的最好的事情是,你不是在做大量可怕的案例陈述,并使上帝目标代码完全不可持续。

答案 4 :(得分:0)

恕我直言,最简单的方法不是旋转或变换块,而是要记住每个状态下的块形状(正常,rotate_90_degrees,rotate_180_degrees,rotate_270_degrees)

答案 5 :(得分:0)

我建议您将一个片段定义为相对于单个旋转点的点。然后你可以(使用一个小矩阵代数)应用一个简单的旋转3次,以获得相对于中心点的其他布局。

旋转然后从显示的游戏中取消设置当前点,切换到下一个旋转,然后将新点重新应用到显示的游戏。