如何从给定的网格生成俄罗斯方块

时间:2013-01-26 04:06:43

标签: ios objective-c algorithm tetris

起初我认为我的问题应该先问过,但我找不到我想要的东西。

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

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

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

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

5 个答案:

答案 0 :(得分:1)

我一直试图为我的游戏做同样的事情。虽然我是初学者,但我正在使用XNA和C#。

但我试图解决的方法是: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. 如果你只需要在触摸和不触摸的坐标中编码, 并且逻辑将会滚动。
  6. 我的设置有点不同。但这是我随机俄罗斯方块引擎的基础。

    我还发现制作它真的有助于制作白板并绘制网格图并用坐标标记。

答案 1 :(得分:0)

因为你的主板是8 * 8,我想你可以使用int64代表主板。 int64的每个位表示特定网格是否已填充。

答案 2 :(得分:0)

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

另外,我会跟踪“掉落”的部分:它的位置和它是什么样的部分。基于计时器,尝试使片断下降。如果已经设置了“掉落”件掉落的任何盒子,则停止掉落片并将片件盒添加到电路板的“设置”部分。创建一个新作品,然后重新开始。

它可能不是实现它的最佳方式,但它在我的头脑中是有意义的。从纯粹的OO角度来看,滴件的每个形状都可以是通用形状类的子类。覆盖检查形状是否可以掉落的函数,形状中各个框的偏移等等。

答案 3 :(得分:0)

我认为还没有人对你的问题#2进行了尝试,所以我将概述我会做什么。

设定:

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

    1. 从您的游泳池中获取一个适合您的起始坐标的随机内容。 (如果你想得到想象,你可能很聪明你选择哪一个,或者你可以完全随机。由于碎片不适合,标记它们,所以你不要永远随机检查。如果你得到你已经检查了所有部分,你有一个不起作用的解决方案,要么备份迭代,要么重新开始。)
    2. 确保您选择的俄罗斯方块片段没有留下“洞”或空格小于4格的空格。 (我不知道你解决这个问题的要求,所以我不能说你是否应该专注于速度或编码的简易性,但如果你愿意,你可以跳过这一步,并“蛮力”解决方案。)
    3. 通过将其写入您的棋子阵列并标记填充的坐标来“放置”该棋子。
    4. 检查“已完成”状态,其中所有空格都已填满。
    5. 在网格中选择一个新坐标并重复#1。 (我会在前一个坐标旁边选一个空的。)

答案 4 :(得分:0)

如果这是实际的,几个月前我在Objective-C上写了测试tetris app https://github.com/SonnyBlack/Test-Demo-Tetris。我认为我的算法不是很好,但它工作。 =)