Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对实例的二维数组进行分组_C++_Optimization_2d Games - Fatal编程技术网

C++ 对实例的二维数组进行分组

C++ 对实例的二维数组进行分组,c++,optimization,2d-games,C++,Optimization,2d Games,我对此有一个有效的解决方案,尽管我确信必须有一个更好的实施方案。在螺母壳中,问题在于: 我正在开发一款连接>=3的珠宝式益智游戏。当“线路板”的状态发生变化时,我将所有部件分组,这样,如果它们水平或垂直“连接”,它们将共享一个ID。这就是我目前的做法: [伪] for all( array object* ) { if !in_a_group() check_neighbours( this ) } void check_neighbours( ID ) { if ( chec

我对此有一个有效的解决方案,尽管我确信必须有一个更好的实施方案。在螺母壳中,问题在于:

我正在开发一款连接>=3的珠宝式益智游戏。当“线路板”的状态发生变化时,我将所有部件分组,这样,如果它们水平或垂直“连接”,它们将共享一个ID。这就是我目前的做法:

[伪]

for all( array object* )
{
    if !in_a_group() check_neighbours( this )
}

void check_neighbours( ID )
{
    if ( check_is_same_type( left ) )
    { 
        if !in_a_group() this.ID = ID ; check_neighbours( ID )
        else if( in_a_group ) change_IDs(this.ID, ID ) 
    }
    same for right ...
    up ...
    down ...     
}
这是我做的一个非常肮脏的伪版本。 我递归地调用check_neights,向前传递第一个分支的ID(我使用这个指针作为ID,而不是生成ID)

如果我发现一个连接了不同ID的片段,我会用新ID覆盖所有具有该ID的片段(我在这里有一个断言,因为它实际上不应该发生。到目前为止,在很多测试中还没有发生)

我不会检查原始分支的邻居,除非这件作品没有ID

虽然我的pseudo可能缺少一些小逻辑,但它工作得很好。 我的问题是,它可能会使用许多分支(这可能是我正在使用的硬件的一个问题)。这个问题我已经研究很久了,所以我看不到其他解决办法。有没有感觉到你错过了一些非常明显的东西

另外,我是stackoverflow的新手,对编程相当陌生,任何关于礼仪的建议都非常感谢

您如何建议避免递归

据我所知,你的算法基本上是一个“洪水填充”和一个小的扭曲

无论如何,为了避免递归,您需要分配数组来存储未处理项的坐标,并使用队列或fifo。因为你们知道网格的尺寸(因为它是宝石风格的(?)游戏,你们应该能够在几乎任何地方预先分配它

任何洪水填充类型递归算法的伪代码

struct Coord{
    int x, y;
}

typedef std::queue<Coord> CoordQueue;

bool validCoord(Coord coord){
    return (coord.x >= 0) && (coord.y >= 0) 
        && (coord.x < boardSizeX) && (coord.y < boardSizeY);
}

bool mustProcessCoord(Coord coord);

void processAll(){
     CoordQueue coordQueue;
     Coord startPoint = Coord(0, 0);
     coordQueue.pushBack(startPoint);

     while (!coordQueue.empty()){
         const Coord &curCoord = coordQueue.front();
         //do something with current coordinates.
         processCoord(curCoord);

         const int numOffsets = 4;
         const int offsets[numOffsets][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
         for (int offsetIndex = 0; offsetIndex < numOffsets; offsetIndex++){
              Coord neighborCoord = Coord(curCoord.x + offsets[offsetIndex][0],
                    curCoord.y + offsets[offsetIndex][1]); 
              if (!isValidCoord(neighborCoord) || !mustProcessCoord(neighborCoord))
                  continue;
              coordQueue.push_back(neighborCoord);
         }

         coordQueue.pop_front();
     }
}
struct-Coord{
int x,y;
}
typedef std::queue CoordQueue;
布尔·瓦利德福德(Coord Coord){
返回值(coord.x>=0)和(coord.y>=0)
&&(coord.x
看到了吗?没有递归,只有一个循环。几乎任何递归函数都可以展开成这样的东西


如果您的底层平台受到限制,并且您没有std::queue,请使用array(作为array实现的环形缓冲区可以像fifo队列一样工作)相反。因为你知道电路板的大小,所以你可以预先计算阵列的大小。其余的应该很简单。

你的硬件有哪些限制?因为我个人不会尝试一起识别组,而是单独查看每一块,并在“点击”事件中做出决定。你有动机检查“组”吗每次换板时吃?对角线也算一行吗?你打算用什么语言写?目的是检查是否还有有效的组。硬件允许32个分支。不是对角线。对不起。哦,我在用C++开发你的板有多大?如果你只是检查是否存在,你能替换每个分支吗你要去哪里?我的意思是,一点一点地去,检查每个方向,看看是否有三排,如果有,那么你就知道有一个有效的群体。有没有动机跟踪分支机构在哪里?非常感谢,这实际上回答了我的其他几个问题。