0

我正在编写一个 PHP 脚本来创建一个 arduino“俄罗斯方块时钟”。我想生成一系列块俄罗斯方块来显示一个数字。

我的数字数组(以“0”为例):(格式化显示)

1 1 1 1 1 1
1 1 1 1 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 1 1 1 1
1 1 1 1 1 1

在哪里 :

1 = must be filled
0 = empty
2 = informed (after check if block can be put)

现在我有俄罗斯方块数组,像这样:

0 0 0 0
0 0 0 0
0 0 0 0
1 1 1 1

或者

1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0

我想检查是否可以将我的俄罗斯方块块放入数字数组中。

例如。:放置第一个块后,我会得到以下数组:(它是一个“T”块)

1 1 1 1 1 1
1 1 1 1 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 2 1 1 1 1
2 2 2 1 1 1

起初我尝试将表格按行和列切割以查看它是否与我的块对应,并且我进行了很多更改但没有成功。

你可以看到我的两个测试脚本: http: //pastebin.com/znnmvT4ghttp://pastebin.com/D9h51Xw3

如果出现错误或无法解析数字,我将保留历史添加以使用回溯。

因此,我首先会检查我的 blocka 阵列是否可以添加到我的数字阵列中。

谢谢你的想法!

4

1 回答 1

1

将您的俄罗斯方块块放置在与数字数组大小完全相同的数组中,并仅用零围绕它来定义它在棋盘上的位置。(注意我用 2 而不是 1,这将在后面解释)

0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 2 2 2 0 0

然后将所有现有数组值添加到另一个数组中的相应值。

1 1 1 1 1 1
1 1 1 1 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 3 1 1 1 1
5 5 5 3 1 1

检查结果数组是否包含 5。如果包含,则俄罗斯方块块无法放置在该位置,因为那里已经有一个块。

还要检查是否没有 2。如果是这样,则不应填充的空间被填充。(这就是为什么你应该使用 2 而不是 1)。

1 1 1 1 1 1
1 1 1 1 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
3 3 2 2 1 1
1 3 1 1 1 1
3 3 3 1 1 1

如果这些都不正确,那么您有一个可行的解决方案。

1 1 1 1 1 1
3 3 3 3 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 3 1 1 1 1
3 3 3 1 1 1

这可能不是唯一的解决方案,因此您必须对俄罗斯方块块可以在数字数组中的所有可能位置执行此操作。要获得最佳位置并创建可行的解决方案,您可能需要使用 A* 之类的算法。

于 2013-02-20T14:26:36.383 回答