C++ C++;在二维数组中保存位置

C++ C++;在二维数组中保存位置,c++,multidimensional-array,C++,Multidimensional Array,忙着做一个小游戏。我必须逐块移动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'

忙着做一个小游戏。我必须逐块移动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;
 }
}
void显示板(字符**数组、整数行、整数列、字符方向){
int NewRow(0),NewCol(1);//我相信我的问题在这里。
如果(方向=='a')
{
纽科尔--;
}
如果(方向=='s')
{
NewRow++;
}
如果(方向='d')
{
NewCol++;
}
如果(方向='w')
{
纽罗--;
}
数组[0][1]=空;
数组[NewRow][NewCol]=MAN;
对于(int i=0;icout一个简单的解决方案是为当前块位置使用静态变量。静态变量存在并在程序的生命周期内保持其值。在当前实现中,NewRow和NewCol是自动变量,这意味着当函数完成并重新分配时,它们将被取消分配调用函数时已分配。这将导致值重置回0和1。静态定义当前行变量如下所示:

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

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

一个简单的修复方法是将
NewCol
NewRow
移出方法,从而使其状态不依赖于方法调用

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

struct GameBoard {
   char **fields;
   int col;
   int row;
};
然后将GameBoard作为输入:

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;
    }
}
void显示板(游戏板和棋盘、整数行、整数列、字符方向){
int prevCol=board.col,prevRow=board.row;
如果(方向=='a')
{
董事会主席;
}
如果(方向=='s')
{
board.row++;
}
如果(方向='d')
{
board.col++;
}
如果(方向='w')
{
board.row--;
}
数组[prevRow][prevCol]=空;
数组[board.row][board.col]=MAN;
对于(int i=0;i这不比。你想在一个变量(或一对变量)中保存人的位置吗?每次移动后保存人的位置你的意思是要保存整个历史,而不仅仅是当前位置吗?(另外,我们似乎有语言问题——你的母语是什么?也许这里有人可以翻译。)聪明,但这意味着人的位置主要存储在这个函数中,其他任何东西都无法访问它。它也存储在数组中,某种程度上,但这可以被其他函数更改,而这个函数不会更聪明。完全同意,解决方案不是健壮的设计,但是,目的是解决他的问题尽可能少的代码重构。下一步是使此函数成为
GameBoard
的成员,然后将显示例程拆分为一个单独的函数。我只需要在每次移动后保存人的位置。@Beta只需更新它以反映更改(我认为不应该做太多)
 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;
             }
       }
  };