使用2d数组的c++中的蛇游戏

5m1hhzi4  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(199)

我用二维数组写了一个蛇游戏。我用符号"o"表示头部,用符号"*"表示尾部。如果尾部大于一颗星,我如何改变尾部在二维数组中的位置。因为只有一颗星就可以了。

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

}

我想让蛇的尾巴移动。我试图寻找尾巴"*"的最远位置,但这不是个好主意。

t2a7ltrp

t2a7ltrp1#

你需要在一个单独的数据结构中跟踪尾部的位置,比如一个队列或者一个链表,我不认为有一个更好的方法。
例如,您可以创建一个结构(或类、首选项)来表示尾巴的每一段,其中包含该段的x和y坐标。然后,在Movement函数中,您可以使用队列来跟踪尾巴段。当蛇吃苹果时,您可以将新的尾巴段入队到队列中,当蛇移动时,您将使最老的尾段从队列中出队并更新其在2D阵列中的位置。
比如:

#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] = '*';
}

相关问题