2017-08-14 91 views
-2

我做了一个贪吃蛇游戏,它很好用,但是,当蛇到达屏幕边缘时,我将它循环回来。 问题是,当他环回时,它似乎跳过一块?蛇游戏 - 为什么蛇跳过一个瓷砖?

我不知道该怎么说,所以这是一个视频。 https://youtu.be/fxuEYsrIZMU

而不是只出现在边缘上,它跳过1到2块瓷砖。 这里是代码片段:

void update(std::vector<sf::RectangleShape>& food) { 
     std::cout << body.size(); 
     for(int i = body.size() - 1; i > 0; i--) { 
      checkBounds(body.at(i)); // Check Snake is in screen. 
      /* ... */ 
     } 
     checkBounds(body.at(0)); 
     /* ... */ 
    } 
void checkBounds(sf::RectangleShape& point) { 
     if(point.getPosition().x < 0) point.move(WIDTH, 0); 
     if(point.getPosition().y < 0) point.move(0, HEIGHT); 
     if(point.getPosition().x > WIDTH) point.move(-WIDTH, 0); 
     if(point.getPosition().y > HEIGHT) point.move(0, -HEIGHT); 
    } 

宽度,高度是屏幕W和H 的身体是一个std::vector<sf::RectangleShape> 下面是完整的代码: https://pastebin.com/sr4Tbrin

回答

2

假设你有一个网格的板大小10

当你决定换行,蛇的头部将在11

但他将被移动到11-10 = 1,而不是0。

您需要:

if(point.getPosition().x > WIDTH) point.move(-(WIDTH+1), 0); 
    if(point.getPosition().y > HEIGHT) point.move(0, -(HEIGHT+1)); 
+2

的问题是在事实上,这些线路,但解决的办法是不正确:正确的值 - 分别为(身高+ 1) - (WIDTH + 1)。你提供的值将导致蛇跳过一个更多,即它将结束在第二个领域。 – KjMag

+0

我可以知道为什么投票吗? @KjMag谢谢。 –

+0

没问题。至于downvote,我认为如果你将这个问题作为对你的主要问题的评论,而不是问题的答案,它会更加明显。 – KjMag