繁体   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