Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用偏移和剪裁将一个阵列复制到另一个阵列?_C++_Arrays - Fatal编程技术网

C++ 如何使用偏移和剪裁将一个阵列复制到另一个阵列?

C++ 如何使用偏移和剪裁将一个阵列复制到另一个阵列?,c++,arrays,C++,Arrays,我有以下阵列用于玩家的当前视线在这种情况下,“A”表示演员或玩家 // Sight with depth of 3 char sight[] = { 0, 0, 0, 0, 0, 0, 0, // 0-6 0, 0, 0, 0, 0, 0, 0, // 7-13 0, 0, 0, 0, 0, 0, 0, // 14-20 0, 0, 0, 'A', 0, 0, 0, // 21-27 0, 0, 0, 0, 0, 0, 0, /

我有以下阵列用于玩家的当前视线在这种情况下,“A”表示演员或玩家

// Sight with depth of 3
char sight[] = { 
    0, 0,  0,  0,  0, 0, 0, // 0-6
    0, 0,  0,  0,  0, 0, 0, // 7-13
    0, 0,  0,  0,  0, 0, 0, // 14-20
    0, 0,  0, 'A', 0, 0, 0, // 21-27
    0, 0,  0,  0,  0, 0, 0, // 28-34
    0, 0,  0,  0,  0, 0, 0, // 35-41
    0, 0,  0,  0,  0, 0, 0  // 42-48
};
我正在加载此自定义地图文件。W=墙,D=门地板

WWWWWWWWWWWWWWWW
W.W.D.........WW
W.W.WWWWW.WWW.WW
W...WWWWW...W.D.
WWWWWWWWWWWWWWWW
好的,我想用偏移量把这个数组复制到当前视线中。如果玩家处于位置(1,1),则x偏移量为1,y偏移量为1。同样,如果玩家处于位置(5,4),x偏移量为5,y偏移量为4。在这种情况下,他处于位置(1,1)


无论玩家在哪里,他的视线阵列都将他置于中心。那么,如何使用偏移和剪裁将地图阵列复制到他的视线阵列中?

为什么需要复制阵列?您不需要数据的副本来获取信息,只需要一个能够返回给定玩家位置的偏移量的函数,例如:

class Player {
  ...
  int getX() const { return x; }
  int getY() const { return y; }
}

class Map {
  ...
  char getWithOffset(const Player& player, int dx, int dy) const {
    return map[player.getX()+dx][player.getY()+dy];
  }
}
然后你可以打个电话

map.getWithOffset(player, -1, -1)
并根据播放器获得所需的增量位置

如果您真的需要一个单独的数组,可以通过此函数轻松构建一个数组,例如:

char sight[SIGHT_DEPTH][SIGTH_DEPTH];

int baseX = player.getX() - SIGHT_DEPTH / 2; // start from -3,-3
int baseY = player.getY() - SIGHT_DEPTH / 2;

for (int i = 0; i < SIGHT_DEPTH; ++i)
  for (int j = 0; j < SIGHT_DEPTH; ++j)
    sight[i][j] = map.getAt(baseX + i, baseY + j);
char-sight[sight_-DEPTH][SIGTH_-DEPTH];
int baseX=player.getX()-SIGHT\u DEPTH/2;//从-3开始,-3
int baseY=player.getY()-视线深度/2;
对于(int i=0;i
显示您现在使用的代码,并解释它在哪里失败。我有一个类似的函数,名为peek()。你可以从玩家那里查看什么是北,什么是南,等等。然而,这只是返回一个单元格。我最后要做的是:c=map.peek(m_x,m_y,EDir_N);视线[N]=c;然后我必须做20多次。似乎有一种更简单的方法可以做到这一点,比如使用delta/offset复制数组。因为您通过指定方向来使用peek,但没有什么可以阻止您使用数字偏移量(例如,将
EDir\N
定义为
{0,-1}
,这样它会上升1个单元格)我可以看出,使用delta作为参数更容易。谢谢。我可以循环使用这个(之前没有看到您的更新):int x_center=3;int y_中心=3;for(inty=0;y<7;y++){for(intx=0;x<7;x++){sight[y*7+x]=map.peek(m_x,m_y,x-x_center,y-y_center);}工作得非常好!谢谢