分组相邻的瓷砖

时间:2016-07-01 18:56:39

标签: c# algorithm unity5

简介

这里有简化的问题: https://stackoverflow.com/questions/38174267/two-dimensional-array-neighbour-cell-search

大家好我正在使用Unity 5重新创建Puzzle Pirates Swordfight。它的副本,我不打算发布或使用它,我只是练习我的算法和编码技巧,但我已经遇到了瓶颈。我正在使用C#进行编码,并对以下主题提出任何建议。谢谢< 3

这是我的项目演示

https://www.youtube.com/watch?v=GRvGIDaY-aE

这是原来的

https://www.youtube.com/watch?v=fuy1Zqkjhn8

问题

在"网格[6,13]"有4种不同颜色的盒子。我需要一种算法,将它们分组最小2宽2高2x2。因此总是将它们分组为NxM。我的算法目前可以​​将它们分组为2x2,但这是非常有限的。

情况

我使用面板和图像创建了Puzzle Pirates Swordfight棋盘游戏屏幕的精确副本。

  • 随机色块生成和nextpiece spawn
  • 该片的自由落体并放在底部。
  • 控件如;边界之间的旋转和移动,避免已经放置的碎片。因此,通过控制侧面的棋子可以使棋盘充满游戏结束,但我希望这些已经放置的棋子组合起来形成更大的棋子,称为Gems。

以下是我的算法。它检查位置是否已满。它可以装满CurrentPiece,RedPiece,RedGem或RedBreaker。红绿黄蓝之间的颜色可以改变。它基本上做的是对角检查,而不是正交检查;以下各个颜色是否相同。然后如果它们是相同的颜色则删除它们并在它们的位置创建一个更大的颜色。

  • Puzzle Pirates Swordfight
  • Super Puzzle Fighter Turbo 2
  • Lumines的

代码

for (int y = 0; y < height-1; y++) {
        for (int x = 0; x < width-1; x++) {
            if (grid [x, y] != null) {
                if (grid [x, y].parent.name != "CurrentPiece" && grid [x,y].name.Contains("Piece")) {
                    string colorofpiece = grid [x, y].name.Substring (0, grid [x, y].name.IndexOf ("Piece"));
                    if ((grid [x + 1, y] != null && grid [x + 1, y].parent.name != "CurrentPiece" && grid [x + 1, y].name.Contains (colorofpiece + "Piece")) &&
                        (grid [x, y + 1] != null && grid [x, y + 1].parent.name != "CurrentPiece" && grid [x, y + 1].name.Contains (colorofpiece + "Piece")) &&
                        (grid [x + 1, y + 1] != null && grid [x + 1, y + 1].parent.name != "CurrentPiece" && grid [x + 1, y + 1].name.Contains (colorofpiece + "Piece"))) {

                        int colornumber = getColor (colorofpiece);

                        GameObject gem = Instantiate (GemPrefab, transform.localPosition, Quaternion.identity) as GameObject;
                        gem.name = colorofpiece + "Gem";
                        gem.transform.SetParent (grid [x, y].parent);
                        gem.transform.localScale = new Vector3 (1.0f, 1.0f, 1.0f);
                        gem.transform.localPosition = grid [x, y].localPosition;
                        gem.GetComponent<Image> ().sprite = sprites [colornumber];
                        gem.transform.FindChild ("Breaker").GetComponent<Image> ().sprite = sprites [colornumber + 1];
                        gem.transform.FindChild ("Breaker").transform.FindChild ("Border").GetComponent<Image> ().sprite = sprites [colornumber + 2];

                        for (int j = y; j < y + 2; j++) {
                            for (int i = x; i < x + 2; i++) {
                                Destroy (grid [i, j].gameObject);
                                grid [i, j] = gem.GetComponent<Transform> ();
                            }
                        }
                    } 
                }
            } 
        }
    } 

0 个答案:

没有答案