1

起初我认为我的问题应该以前被问过,但我没有找到我想要的。

我正在开发的这个 iOS 应用程序的一个元素是将一个 8x8 网格分成俄罗斯方块(每块由 4 个块组成)。我有两个特别的问题是:

  1. 在 Objective-C 中表示俄罗斯方块的最佳方式是什么?

  2. 什么算法将网格呈现为随机的俄罗斯方块(以及稍后如何检查两个部分是否适合)。

01/28 @livingtech 版,我想我几乎实现了你所说的,除了“有一个洞”这一点。当俄罗斯方块块只有两个块(是的,两个正方形,水平或垂直连接)时,我的代码在简单阶段没有孔,但在 3 方块俄罗斯方块块中,我会得到孔。我刚刚测试过,跑了 1000 次,我会得到一个没有洞的。所以我肯定需要一些机制来检查下一个方块是否是单例。

4

5 回答 5

1

我一直在尝试为我的游戏做同样的事情。虽然我是一个初学者,但我正在使用XNAC#。

但我试图解决的方法是:4x6 grid array

--y123456
X1-000000
X2-000000
X3-000000
X4-000000

这里,

  • 0 表示没有阻塞
  • 1 定义一个块

算法

  1. 首先取数组中的第一个 0(左上角),然后随机选择 0 或 1。
  2. 根据 x1/x2-y1/y2 随机选择坐标,决定 1 或 0。
  3. 如果是 1,则根据该 1 的放置位置来决定协调。
  4. 如果它在 x2 y1 上是 1,则决定是否应该在下一个接触坐标上继续使用 1。
  5. 如果您只需要在哪些坐标接触和哪些不接触的坐标中进行编码,那么逻辑就会通过。

我的设置有点不同。但这是我的随机俄罗斯方块引擎的基础。

我还发现这样做确实有助于拥有一个白板并使用您的坐标绘制网格和标签。

于 2013-03-13T03:08:40.427 回答
0

因为你的板子是 8*8,我想你可以用一个 int64 来代表板子。int64 的每一位代表特定网格是否被填充。

于 2013-01-26T05:24:29.257 回答
0

如果这是真的,几个月前我在 Objective-C 上编写了测试俄罗斯方块应用程序https://github.com/SonnyBlack/Test-Demo-Tetris。我认为我的算法不是很好,但它有效。=)

于 2013-08-27T07:14:52.687 回答
0

实现俄罗斯方块是我的一个爱好。首先在 Windows/C 中实现它。然后在 Perl/Tk 中!我在 Obj-C/Cocoa (Mac) 中完成的最后一个实现。在所有情况下,游戏逻辑都是相同的。只有 UI 的东西会改变。我分别处理每个小盒子,并有一个二维数组,其中包含板上每个“设置”盒子的存在(和颜色)。我使用的标准板尺寸是 10 盒宽 x 20 盒高。

另外,我会跟踪“掉落”的部分:它的位置以及它是什么类型的部分。根据计时器,尝试使作品掉落。如果已经设置了“掉落”棋子将掉落的任何框,则停止丢弃该棋子并将棋子框添加到棋盘的“已设置”部分。创建一个新作品,然后重新开始。

这可能不是实现它的最佳方式,但在我看来它是有道理的。从纯 OO 的角度来看,掉落物的每个形状都可以是通用形状类的子类。覆盖检查形状是否可以下降、形状中各个框的偏移量等的函数。

于 2013-01-26T07:46:38.237 回答
0

我认为尚未有人对您的问题 #2 提出质疑,因此我将概述我将要做什么。

设置:

  1. 您需要将您的网格表示为某种数组。至少,您需要某种布尔值,以表示网格中的每个坐标是否被“占用”。
  2. 您需要跟踪网格上的部分。这可能是另一个数组,这一次包含对每个部分的四个坐标的引用。
  3. 您需要一个或多个变量来跟踪网格中的坐标,您将在其中开始填充片段(我可能会用一个角来填充这些)。
  4. 设置所有可能的俄罗斯方块碎片和旋转的“池”。(您需要跟踪在下面概述的每次迭代中您已经检查了哪些。)

迭代:

  1. 从您的池中随机抽取一块适合您的起始坐标。(如果你想变得花哨,你可以很聪明地选择哪些,或者你可以完全随机。因为不合适,标记它们检查,这样你就不会永远随机检查。如果你得到到了你已经检查了所有部分的程度,你有一个不起作用的解决方案,要么备份一个迭代,要么重新开始。)
  2. 确保您选择的俄罗斯方块没有留下“洞”或少于 4 个方格的空白空间。(我不知道你对解决这个问题的要求,所以我不能说你应该关注速度还是编码的易用性,但如果你愿意,你可以跳过这一步,“蛮力”解决方案.)
  3. 通过将其写入您的作品数组并标记已填充的坐标来“放置”作品。
  4. 检查“完成”状态,其中所有空间都已填满。
  5. 在网格中选择一个新坐标并重复 #1。(我会在前一个坐标旁边选择一个空的。)
于 2013-01-27T06:04:31.560 回答