簡體   English   中英

c++ 中的貪吃蛇游戲使用二維數組

[英]Snake game in c++ using a 2d array

我使用二維數組在 c++ 中編寫了一個貪吃蛇游戲。 我使用符號“o”作為頭部,使用符號“*”作為尾部。 如果我的尾巴大於一顆星 *,我如何更改二維數組中的尾巴 position。 因為有一顆星就可以了。

void Movement(char grid[gridsize][gridsize]){
    char move;
    int i, j ;
    bool check = true, tail = false;

    cout << "Make Your move  w/s/a/d " << endl;
    cin >> move ;
    
    for(i = 0; i < gridsize; i++)
    {
        for(j = 0; j < gridsize; j++)
        {
            if(grid[i][j] == 'o')
            {
                goto Theend;
            }
        }
    }
    Theend:
    int ii, jj;
    for(ii = 0; ii < gridsize; ii++)
    {
        for(jj = 0; jj < gridsize; jj++)
        {
            if(grid[ii][jj] == '*')
            {
                tail = true;
                goto Thefinalend;
            }
        }
    }
    Thefinalend:

    switch (move)
    {
    case 'w':
        grid[i-1][j] = 'o';
        break;
    case 'a':
        grid[i][j-1] = 'o';
        break;
    case 's':
        grid[i+1][j] = 'o';
        break;
    case 'd':
        grid[i][j+1] = 'o';
        break;
    default:
        cout << "Not correct input " << endl;
        break;
    }
    
    grid[i][j] = ' ';
    
    AppleEat(grid, i, j);
    if(tail == true)
        Swaptail(grid, i, j);
}
void AppleEat(char grid[gridsize][gridsize], int ibefore, int jbefore)
{
    int i, j;
    for(i = 0; i < gridsize; i++)
    {
        for(j = 0; j < gridsize; j++)
        {
            if(grid[i][j] == 'o')
            {
                goto Theend;
            }
        }
    }
    Theend:
    if(iA == i && jA == j){
        RandomPlaceApple(grid);
        grid[ibefore][jbefore] = '*';
    }
    
}
void Swaptail(char grid[gridsize][gridsize], int ibefore , int jbefore )
{
    for(int ii = 0; ii < gridsize; ii++){
        for(int jj = 0; jj < gridsize; jj++){
            if(grid[ii][jj] == '*')
            {
                swap(grid[ii][jj], grid[ibefore][jbefore]);
            }
        }
    }

}

我想讓蛇尾動起來。 我嘗試搜索尾部“*”最遠的 position 但這不是個好主意。

您將需要在單獨的數據結構(例如隊列或鏈表)中跟蹤尾部位置,我認為沒有更優化的方法。

例如,您可以創建一個結構(或 class,首選項)來表示尾部的每個部分,其中包含該部分的 x 和 y 坐標。 然后,在您的 Movement function 中,您可以使用隊列來跟蹤尾部段。 當蛇吃蘋果時,您會將一個新的尾部片段放入隊列中,而當蛇移動時,您會將最舊的尾部片段從隊列中取出並在二維數組中更新其 position。

就像是:

#include <queue>

struct TailSegment {
   int x;
   int y;
};

std::queue<TailSegment> tail;

...

if(tail == true)
        MoveTail(grid);

...

Theend:
    if(iA == i && jA == j){
        RandomPlaceApple(grid);
        tail.push({ibefore, jbefore});
    }

...

void MoveTail(char grid[gridsize][gridsize])
{
    TailSegment last = tail.front();
    grid[last.x][last.y] = '*';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM