1

ショートゲームを作るのに忙しい中。ブロックごとに 2 次元配列内の男性を移動する必要があります。問題は、それを移動する方法を知っていますが、元のブロックから 1 ブロックしか離れていないということです。配列内の現在の位置を保存する方法を知りたいです。

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

私の問題は、新しい配列に初期値を設定する部分にあると思います。私がいるブロックを保存して、eg.downに移動し、その位置を保存して、そこから下に移動したい。

どうすればいいですか、助けてください。

ありがとうございました。

4

2 に答える 2

1

簡単な解決策は、現在のブロック位置に静的変数を使用することです。静的変数が存在し、プログラムの存続期間中その値を維持します。現在の実装では、NewRowNewCol自動変数です。つまり、関数が完了すると割り当てが解除され、関数が呼び出されると再割り当てされます。これにより、値が 0 と 1 にリセットされます。現在の行変数を静的に定義する方法を以下に示します。

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

これにより、変数が 0 と 1 に初期化されますが、これらの変数に対する更新または変更は、関数の終了後も保持されます。

于 2012-05-02T19:23:25.443 に答える
1

簡単な修正方法は、 and をメソッドの外に移動してNewColNewRowその状態をメソッド呼び出しに依存させないようにすることです。

より良い解決策は、配列と現在の場所を含む新しい構造体のようなものを作成することです。

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

更新 ベータ版が提案したように、代わりにメンバー関数としてこれらのことを行うことができます。また、安全性チェックがあるため、2 次元配列の代わりに 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;
             }
       }
  };
于 2012-05-02T19:27:54.830 に答える