蛇游戏-无法让蛇的身体跟随蛇的头部

问题描述 投票:0回答:3

我一直在使用sfml和c ++进行蛇类游戏,但是我很难让蛇的尾巴跟随蛇头,这在下面的代码中定义为Snake [0]。我已经实现了我认为应该可以运行的代码,但是下面的代码无效]

    for (int i = 1; i < snakeSize; i++)
    {
        snakePartX[i] = snakePartX[i-1];
        snakePartY[i] = snakePartY[i-1];
    }

我理解它的方式(而且我可能是非常错误的,如果有人可以指出这里实际发生的事情,我将不胜感激,那就是,那段代码应该将蛇形身体部位的值设置为WAS位于前面的身体部位,以便在程序循环时将它们设置为跟随蛇行进。]

实际上发生的是,当蛇吃了一个苹果时,蛇的尾巴会增加1格,但不会长得更大。

c++ sfml
3个回答
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;
}

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

您允许使用键盘输入来移动蛇头,但是只有在计时器到期时才移动身体。因此,您的头部可以滑离身体,除非定时器关闭,否则身体不会移动。


0
投票

我将蛇形游戏的字段打印为Field [x] [y]。因此,通过下面的代码编码跟随头部的蛇体。另外,其他函数中的“ optionMoveNumber == 0”检查是否Field [x] [y] ==食物,这意味着蛇是否吃掉了食物。

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++;

}
© www.soinside.com 2019 - 2024. All rights reserved.