蛇游戏 - 无法让蛇身跟随蛇头

时间:2015-04-22 16:09:07

标签: c++ sfml

我一直在使用sfml和c ++进行蛇游戏,但我无法让我的蛇的尾部跟随我的代码中定义为Snake [0]的蛇头。我已经实现了我认为应该工作的代码但不是以下代码

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

我理解它的方式(我可能非常错误,如果有人能指出这里实际发生的事情,我会很感激)是,那段代码应该将蛇体部分的值设置到哪里的位置上一个身体部位WAS定位,以便当程序循环时,它们被设置为在蛇行进时跟随蛇。

实际上发生的事情是,当蛇吃掉一只苹果时,蛇的尾巴会增加1个阻挡,但不会再长出来。

3 个答案:

答案 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