2015-04-22 52 views
0

我一直在使用sfml和C++進行蛇遊戲,但我無法讓蛇的尾巴跟隨蛇頭定義爲蛇[ 0]在我的代碼下面。我已經實現的代碼,我認爲應該工作,但不被以下貪吃蛇遊戲 - 無法讓蛇體跟隨蛇頭

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

我理解它(我大概是令人難以置信的錯誤,如果有人能指出什麼是真正發生在這裏將不勝感激)方式那麼這段代碼應該將蛇身部分的值設置到前一個身體部位WAS所在的位置,以便當程序循環時,它們被設置爲在蛇行進時跟隨它。

實際上發生的事情是,當蛇吃一個蘋果時,蛇的尾巴會增加1塊,但不會再增長。

+0

附註:您應該使用列表而不是矢量。那麼你不必複製每次移動的所有位置。 – Caduchon

+1

@Caduchon:嘗試時機(如果它對蛇遊戲很重要)。列表可能導致緩存未命中,向量是連續的。 –

+0

@Caduchon:出隊將是一個更好的結構,因爲它允許在一端(頭部)插入和在另一端(尾部)移除。 –

回答

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份。更重要的是,你從來沒有爲Snake [i]設置新的snakeSize值。所以,當你得到一個蘋果,你會用未初始化的內存來繪製一個蛇的一部分。

另一個潛在的問題:

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

你讓鍵盤輸入沿着移動蛇的頭,但你只當計時器到期時移動身體。所以你的頭可以從身體滑開,除非計時器熄滅,否則身體不會移動。