簡単な修正方法は、 and をメソッドの外に移動して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;
}
}
更新
ベータ版が提案したように、代わりにメンバー関数としてこれらのことを行うことができます。また、安全性チェックがあるため、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;
}
}
};