将尾巴添加到贪吃蛇游戏 [c++ sfml]

Adding tail to snake game [c++ sfml]

我想移动蛇的尾巴来填补它每次头部移动时产生的空隙:
.ooox
.ooo x
. ooox
所以基本上最后一个元素移动到间隙中。我可以获得间隙的位置并在那里创建一个尾巴但是一旦我有超过 1 个尾巴 object 它就无法正常工作。我相信它会在与其他尾巴相同的位置创建新的尾巴 object,因此存在差距。尾 = rep

尾部

    //If tail exists
    if(imamoRep)
    {
            rep[repCount-1].setPosition(gap);

            temp[0] = rep[repCount-1]; //Remember last element
            for(int i=1;i<repCount;i++)
            {
                rep[i] = rep[i-1];
            }
            rep[0]=temp[0];   //assign last element to first
    }

绘图

for(int i=0; i<repCount; i++)
    {
        window.draw(rep[i]);
    }

我猜我对数组做错了什么,最后一个元素应该放在第一位,所有其他元素应该向左移动,所以有一个新的最后一个尾巴。我在开始时创建了 100 个尾部元素,所以我只需要正确绘制它们即可。如果我删除除了设置位置的第一行之外的尾部代码,那么我会得到这个结果:

尾巴被留在后面,因为只有最后一个元素的位置发生变化,否则如前所述所有尾巴都在同一位置。我真的很想得到帮助。

你几乎成功了。想想这个循环对你的职位做了什么:

for(int i = 1; i < repCount; ++i)
{
    rep[i] = rep[i - 1];
}

i=1 开始,它会分配 rep[1] rep[0] 的值。接下来对于 i=2 它将分配 rep[2] rep[1] 的值,该值在上一次迭代中被 rep[0] 覆盖。等等...

您需要做的是在写入 i 处的元素之前反转在 i+1 处写入元素的循环:

for(int i = repCount - 1; i > 0; --i)
{
    rep[i] = rep[i - 1];
}

请注意 std::copy_backward 通常实现此行为。 IE。您可以将上面的循环重写为:

if(repCount > 0)
{
    // Assuming rep is a std::vector using std::vector::begin
    std::copy_backward(rep.begin(), rep.begin() + repCount - 1, rep.begin() + repCount);
}