在蛇游戏中添加尾巴[c ++ sfml]

时间:2019-01-20 17:21:55

标签: c++ sfml

我想通过填充每次头部移动时产生的间隙来移动蛇的尾巴:
o oox
.ooo x
。 oo o x
因此,基本上最后一个元素移入了空白。我可以获取差距的位置并在此处创建一条尾巴,但是一旦我有多个尾巴对象,它就无法正常工作。我相信它会在与其他尾巴相同的位置上创建新的尾巴对象,因此会产生间隙。尾巴= 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个尾部元素,因此只需要正确绘制它们即可。如果除去设置位置的第一行以外的尾码,则会得到以下结果:enter image description here

尾部留在后面,因为只有最后一个元素的位置改变了,否则所有尾部都在同一位置之前就说了。我真的会寻求帮助。

1 个答案:

答案 0 :(得分:1)

您几乎拥有了它。考虑一下这个循环对您的职位有何影响:

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+1处写入元素,然后再将循环写入i

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

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

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);
}