我想通过填充每次头部移动时产生的间隙来移动蛇的尾巴:
。 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个尾部元素,因此只需要正确绘制它们即可。如果除去设置位置的第一行以外的尾码,则会得到以下结果:
尾部留在后面,因为只有最后一个元素的位置改变了,否则所有尾部都在同一位置之前就说了。我真的会寻求帮助。
答案 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);
}