C++遍历结构的向量

bvjxkvbb  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(158)

循环通过结构的向量时出现问题。
我目前正在用C++开发一款主机蛇游戏。
我将网格信息存储在一个结构体的向量中。

struct item
{
    int xCoord;
    int yCoord;
    int colour;
};
vector<item> gridInfo;

然后循环遍历网格的坐标,看看是否应该打印一些内容。

for(int y = 0; y < 10; y++)
    {
        for(int x = 0; x < 10; x++)
        {
            for(auto it = px.begin(); it != px.end(); ++it)
            {
                if((*it).xCoord == x && (*it).yCoord == y)
                {
                    SetConsoleTextAttribute(console_color, (*it).colour);
                }
                else
                {
                    SetConsoleTextAttribute(console_color, 255);
                }
            }
            cout << ("  ");
        }
        cout << "\n";
    }

我已经设法让蛇(头部)的主要块与运动工作。
然而,一旦我把“食物”添加到向量中,它就只开始给食物着色。

if(px.back().colour != 207)
    {
        px.push_back({rand() % 10, rand() % 10, 207});
    }

对于那些想知道为什么我用px而不是grindInfo的人,因为显示运行在一个从main调用的函数中。

int main()
{
    int localDirection = -1;
    vector<item> gridInfo;

    srand(time(0));

    gridInfo.push_back({4, 4, 191});

    while(true)
    {
        localDirection = kbInput(localDirection);
        gridInfo = gameLogic(gridInfo, localDirection);
        Sleep(1000);
    }
}

先谢谢你的帮助。

sulc1iza

sulc1iza1#

推送食物信息后,向量的第一个元素是头部信息,第二个元素是食物信息。
在循环if((*it).xCoord == x && (*it).yCoord == y)中,其中(x, y)是头部的坐标,假设食物的坐标不同于头部的坐标,则颜色首先被设置为(*it).colour,然后被设置为255
应检查是否找到匹配坐标,并仅在未找到匹配时将颜色设置为255

for(int y = 0; y < 10; y++)
    {
        for(int x = 0; x < 10; x++)
        {
            bool found = false;
            for(auto it = px.begin(); it != px.end(); ++it)
            {
                if((*it).xCoord == x && (*it).yCoord == y)
                {
                    SetConsoleTextAttribute(console_color, (*it).colour);
                    found = true;
                    // uncomment if you want to give priority to the first match
                    //break;
                }
            }
            if(!found)
            {
                SetConsoleTextAttribute(console_color, 255);
            }
            cout << ("  ");
        }
        cout << "\n";
    }

另一种方法是先将颜色设置为255,然后执行循环。

for(int y = 0; y < 10; y++)
    {
        for(int x = 0; x < 10; x++)
        {
            SetConsoleTextAttribute(console_color, 255);
            for(auto it = px.begin(); it != px.end(); ++it)
            {
                if((*it).xCoord == x && (*it).yCoord == y)
                {
                    SetConsoleTextAttribute(console_color, (*it).colour);
                    found = true;
                    // uncomment if you want to give priority to the first match
                    //break;
                }
            }
            cout << ("  ");
        }
        cout << "\n";
    }

相关问题