我一直在使用sfml和c ++进行蛇游戏,但我无法让我的蛇的尾部跟随我的代码中定义为Snake [0]的蛇头。我已经实现了我认为应该工作的代码但不是以下代码
for (int i = 1; i < snakeSize; i++)
{
snakePartX[i] = snakePartX[i-1];
snakePartY[i] = snakePartY[i-1];
}
我理解它的方式(我可能非常错误,如果有人能指出这里实际发生的事情,我会很感激)是,那段代码应该将蛇体部分的值设置到哪里的位置上一个身体部位WAS定位,以便当程序循环时,它们被设置为在蛇行进时跟随蛇。
实际上发生的事情是,当蛇吃掉一只苹果时,蛇的尾巴会增加1个阻挡,但不会再长出来。
答案 0 :(得分:0)
在经典的蛇游戏中,蛇是由细分组成的。每个段包含段的坐标(以及其他属性)。
具体来说,蛇是段的容器。容器是您的选择,但我推荐一个队列。
使用队列,将新的头部分段添加到队列中并移除尾部分段。
这是一个帮助的代码片段:
class Snake_Segment
{
public:
int column;
int row;
};
typedef std::deque<Snake_Segment> Segment_Container;
int main(void)
{
Segment_Container snake_body;
Snake_Segment head;
head.row(25);
head.column(30);
snake_body.push_back(head);
Snake_Segment tail = head;
++tail.column;
snake_body.push_back(tail);
return EXIT_SUCCESS;
}
答案 1 :(得分:0)
为什么索引为零?它不是作为for循环的一部分完成的吗?
Snake[0].setPosition(snakePartX[0], snakePartY[0]);
for(int i = 0; i < snakeSize; i++)
{
Snake[i].setPosition(snakePartX[i], snakePartY[i]);
}
我很担心这一部分:
snakeSize += 1;
}
Apple.setPosition(applePos.x, applePos.y);
window.draw(Apple);
for(int i = 0; i < snakeSize; i++)
{
window.draw(Snake[i]);
}
确保不超过20,因为您的零件是一个简单的阵列,一旦您获得20个零件,您将遇到问题。更重要的是,你永远不会为新的snakeSize设置Snake [i]的值。因此,当你得到一个苹果时,你将使用未初始化的记忆画一个蛇部分。
另一个潜在的问题:
//Clock to set snake speed
ElapsedTime = clock.getElapsedTime();
if(ElapsedTime.asSeconds() >= snakeSpeed)
{
for(int i = 1; i < snakeSize; i++)
{
snakePartX[i] = snakePartX[i - 1];
snakePartY[i] = snakePartY[i - 1];
}
您允许键盘输入移动蛇头,但您只能在计时器到期时移动身体。因此,除非定时器熄灭,否则你的头部可以滑离身体,身体也不会移动。
答案 2 :(得分:0)
我将蛇类游戏的领域印刷为Field[x][y]
。因此,通过下面的代码编码跟随头部的蛇体。另外,其他功能中的optionMoveNumber==0
会检查Field[x][y]==food
是否为int m=1;
void Snake::Movement(int x, int y){
movey[0]=firstTaily; //first place
movex[0]=firstTailx; //first place
movex[m]=x;
movey[m]=y;
for(int n=m; n>=m-ntail; n--){
Field[movey[n]][movex[n]]=Field[movey[n-1]][movex[n-1]];
}
if(optionMoveNumber==0){
Field[movey[m-1]][movex[m-1]]=tail;
}
else{
Field[movey[m-ntail-1]][movex[m-ntail-1]]=space;
}
m++;
}
,这意味着蛇是否吃掉了不食用的食物。
package.json