基于两个变量C ++返回一个类对象

时间:2015-12-30 21:30:46

标签: c++ class

我需要有关课程相关问题的帮助。我知道如何解决它,但我想知道是否有比我现在的想法更好的解决方案。

每个 Class Tile Object Class Player Object 都有 x y 位置。我想知道是否有办法加快处理。我目前的想法是if-else这样的陈述:

if(x==1) {
    if(y==1) {

       return tileone1;

    } else if(y==2) {  

       return tileone2;

    } else if(y==3) {  

       return tileone3;

    } else if(y==4) {  

       return tileone4;

    } else if(y==5) {  

       return tileone5;

    } //......

} else if(x==2) { 
      if(y==1) {

       return tiletwo1;

    } else if(y==2) {  

       return tiletwo2;

    } else if(y==3) {  

       return tiletwo3;

    } else if(y==4) {  

       return tiletwo4;

    } else if(y==5) {  

       return tiletwo5;

    } //......
} //......

问题是为每个瓷砖写这个都需要花费太长时间。

我需要一个函数,它将根据Object Player的x和y输入返回Tile对象。任何其他解决方案都会很棒。

Tile getTileBasedOnCoords(int x, int y){

}

2 个答案:

答案 0 :(得分:1)

有多种方法可以实现这一目标。最简单的似乎是(给出问题)是将所有Tile对象放入数组中,并返回具有相应索引的对象。

答案 1 :(得分:0)

使用带有提供x和y值的自定义键的地图。这样您就可以直接访问磁贴,而无需将每个磁贴与玩家位置进行比较(请参阅以下代码中的getSectorByCoordinate())。

struct CSectorCoordinate
{
  private:
    int mX;
    int mY;

  public:
    CSectorCoordinate();
    CSectorCoordinate(int aX, int aY);

    bool operator() (const CSectorCoordinate & a, const CSectorCoordinate & b) const;

    int getX();
    int getY();
};

...

bool CSectorCoordinate::operator() (const CSectorCoordinate & a, const CSectorCoordinate & b) const
{
  // note: the following conditions ensure a strict weak ordering (see documentation of std::map)
  if (a.mX < b.mX)
    return true;

  if (b.mX < a.mX)
    return false;

  return a.mY < b.mY;
}

...

typedef std::map<CSectorCoordinate, Configuration::CSectorEntity *, CSectorCoordinate> CSectorCoordinateMap;

CSectorCoordinateMap mSectorCoordinateMap;

...

bool CSectorEntityConfigurationBunch::getSectorByCoordinate(int aX, int aY, Configuration::CSectorEntity * & prSector)
{
  CSectorCoordinateMap::const_iterator i(mSectorCoordinateMap.find(CSectorCoordinate(aX, aY)));

  if (i != mSectorCoordinateMap.end())
    prSector = i->second;
  else
    prSector = 0;

  return prSector;
}