C++ 在 2D 数组中保存位置

C++ Saving Position in a 2D array

本文关键字:保存 位置 数组 2D C++      更新时间:2023-10-16

忙着做一个短游戏。我必须逐块移动 2d 数组中的一个人。问题是我知道如何移动它,但距离原始块只有一个街区。我想知道如何保存当前在数组中的位置。

void DisplayBoard(char** array,int row,int col,char direction){
int NewRow(0),NewCol(1);//I believe my problem is here. 

if(direction =='a')
{
    NewCol--;
}
if(direction =='s')
{
    NewRow++;
}
if(direction == 'd')
{
    NewCol++;
}
if(direction == 'w')
{
    NewRow--;
}
array[0][1] = EMPTY;
array[NewRow][NewCol] = MAN;
 for(int i = 0;i < row ; i++){
    for(int c = 0; c < col; c++){
      cout << array[i][c]<<" ";
    }
      cout <<endl<<endl;
 }
}

我认为我的问题出在我给新数组一个初始值的部分。我想保存我所在的块并将其向下移动,例如保存该位置并从那里向下移动。

我该怎么做,请帮忙。

谢谢。

一个简单的

解决方法是将NewColNewRow移出方法,从而使其状态不依赖于方法调用。

更好的解决方案是创建一个包含数组和当前位置的新结构,例如:

struct GameBoard {
   char **fields;
   int col;
   int row;
};

然后将游戏板作为输入:

void DisplayBoard(Gameboard& board,int row,int col,char direction){
    int prevCol = board.col, prevRow = board.row;
    if(direction =='a')
    {
        board.col--;
    }
    if(direction =='s')
    {
         board.row++;
    }
    if(direction == 'd')
    {
         board.col++;
    }
    if(direction == 'w')
    {
         board.row--;
    }
    array[prevRow][prevCol] = EMPTY;
    array[board.row][board.col] = MAN;
    for(int i = 0;i < row ; i++){
        for(int c = 0; c < col; c++){
           cout << array[i][c]<<" ";
        }
        cout <<endl<<endl;
    }
}

更新正如 beta 所提议的那样,人们可以作为成员函数来做这些事情。我也会使用 std::vector 而不是二维数组,因为有安全检查。因此,我的最终解决方案是:

 class GameBoard {
       private:
       std::vector< std::vector<char> > _fields;
       int _col;
       int _row;
       public:
       GameBoard(int ncol, int nrow, int startcol, int startrow)
          : _col(startcol),  _row(startrow), _fields(nrow)  {
              for(int i = 0; i < nrow; i++) {
                   for (int j = 0; j < ncol; j++) {
                       _fields[i].push_back(EMPTY);
                   }
              }
              _fields[_row][_col] = MAN;
       }
       void move_man(char direction) {
             int prevCol = _col, prevRow = _row;
             switch(direction) {
                  case 'a': _col--; break;
                  case 'd': _col++; break;
                  case 'w': _row--; break;
                  case 's': _row++; break;
             }
             _fields[prevRow][prevCol] = EMPTY;
             _fields[_row][_col] = MAN; 
       }
       void display_board() {
             for (int i = 0; i < _fields.size(); i++) {
                  for (int j = 0; j < _fields[i].size(); j++) {
                      std::cout << _fields[i][j] << " ";
                  }
                  std::cout << std::endl;
             }
       }
  };

一个简单的解决方案是使用静态变量作为您当前的区块位置。 静态变量存在并在程序的生存期内保持其值。 在当前的实现中,NewRowNewCol自动变量,这意味着它们在函数完成时被取消分配,在调用函数时重新分配。 这将导致值重置回 0 和 1。 静态定义当前行变量如下所示:

static int NewRow(0), NewCol(1);

这会将变量初始化为 0 和 1,但是,即使在函数结束后,对这些变量的任何更新或更改也将保留。