C++ 在 2D 数组中保存位置
C++ Saving Position in a 2D 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')
{
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;
}
}
我认为我的问题出在我给新数组一个初始值的部分。我想保存我所在的块并将其向下移动,例如保存该位置并从那里向下移动。
我该怎么做,请帮忙。
谢谢。
一个简单的
解决方法是将NewCol
和NewRow
移出方法,从而使其状态不依赖于方法调用。
更好的解决方案是创建一个包含数组和当前位置的新结构,例如:
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;
}
}
};
一个简单的解决方案是使用静态变量作为您当前的区块位置。 静态变量存在并在程序的生存期内保持其值。 在当前的实现中,NewRow 和 NewCol 是自动变量,这意味着它们在函数完成时被取消分配,在调用函数时重新分配。 这将导致值重置回 0 和 1。 静态定义当前行变量如下所示:
static int NewRow(0), NewCol(1);
这会将变量初始化为 0 和 1,但是,即使在函数结束后,对这些变量的任何更新或更改也将保留。
相关文章:
- 如何在向量中保存位置以供以后插入?
- 如何选择文件保存到的位置?
- 在屏幕上的确切位置保存和恢复Qt小部件
- 独立 exe:磁盘上保存配置文件和日志的位置
- 在指针中保存确定的位置
- 使用 fstream 将文件数据从当前位置保存到文件末尾
- QT4 QListView保存图标位置下一次由手动移动
- 将文件保存在不同的linux位置
- 将它们(函数)保存在内存中的同一位置
- 保存可移植可执行文件的位置
- c++,指向同一位置的两个指针如何保存不同的值
- C++ 在 2D 数组中保存位置
- C++ 如何将内存中的文件流保存到另一个位置
- MFC:如何在旧版 MFC 版本 6 中保存工具栏的位置
- 将数据保存在缓存中的技术,位置
- 如何保存min_element结果的位置
- 如何在InstallShield中使用用户定义的保存位置
- 保存itkImage为DICOM时,不写入图像位置/方向
- 保存和恢复内存位置列表的清洁机制
- Mac应用程序的文件保存位置