2016-03-08 66 views
0

我制作这个控制台游戏和我这样做的方式是从称为地图的三维数组中打印字符到控制台。哪些是使用怪物,人物和背景的字符分配的。问题是我已经能够分配给地图数组并且成功地打印了一个怪物类的字符。但由于某些原因,派生的字符类对象没有打印字符。 我相信这不是一个访问问题,因为没有编译错误,当程序运行时,这些字符被分配到的行(没有确切的索引,但是正确的行索引)上有空白空白。派生类没有正确打印

下面是分配给它的代码:

void game::assignScreen() { 
     for (int row = 0; row < 20; row++) { 
      for (int col = 0; col < 40; col++) { 
       if (col == 0 || col == 39) { 
        map[row][col] = (char) 124; 
       } else if (row == 0 || row == 19) { 
        map[row][col] = (char) 95; 
       } else { 
        map[row][col] = (char) 46; 
       } 
      } 
     } 
     switch (difficulty) { 
      case 1: 
       for (int i=0; i <2; i++){ 
        map[enemy[i]->getPos(true)][enemy[i]->getPos(false)] = enemy[i]->getSymbol(); 
       } 

      case 2: 
       if (difficulty == 2) { 
        for (int i = 0; i <4; i++) { 
         map[enemy[i]->getPos(true)][enemy[i]->getPos(false)] = enemy[i]->getSymbol(); 
        } 
       } 
       map[elfPlayer.getPos(true)][elfPlayer.getPos(false)] = elfPlayer.getSymbol(); 
       map[guardPlayer.getPos(true)][guardPlayer.getPos(false)] = guardPlayer.getSymbol(); 
       map[knightPlayer.getPos(true)][knightPlayer.getPos(false)] = knightPlayer.getSymbol(); 
       map[roguePlayer.getPos(true)][roguePlayer.getPos(false)] = roguePlayer.getSymbol(); 
       break; 
      case 3: 
       for (int i = 0; i <6; i++) { 
        map[enemy[i]->getPos(true)][enemy[i]->getPos(false)] = enemy[i]->getSymbol(); 
       } 
      case 4: 
       if (difficulty == 4) { 
        for (int i = 0; i <9; i++) { 
         map[enemy[i]->getPos(true)][enemy[i]->getPos(false)] = enemy[i]->getSymbol(); 
        } 
       } 
       map[elfPlayer.getPos(true)][elfPlayer.getPos(false)] = elfPlayer.getSymbol(); 
       map[guardPlayer.getPos(true)][guardPlayer.getPos(false)] = guardPlayer.getSymbol(); 
       map[knightPlayer.getPos(true)][knightPlayer.getPos(false)] = knightPlayer.getSymbol(); 
       map[roguePlayer.getPos(true)][roguePlayer.getPos(false)] = roguePlayer.getSymbol(); 
       map[roguePlayer.getPos(true)][roguePlayer.getPos(false)] = roguePlayer.getSymbol(); 
       break; 
     } 
    } 

而这种打印它

void game::printScreen(string msg) { 
      clearScreen(); 
      cout << msg; 
      for (int row = 0; row < 20; row++) { 
       for (int col = 0; col < 40; col++) { 
        if (map[row][col] == 'E' || map[row][col] == 'G' || map[row][col] == 'K' || 
         map[row][col] == 'R' || map[row][col] == 'W') { 
         if (getPlayer(map[row][col]).getStatus() == 1) { 
          changeColor(14, false); 
          cout << map[row][col]; 
          changeColor(15, false); 
         } else if (getPlayer(map[row][col]).getStatus() == 2 || getPlayer(map[row][col]).getStatus() == 3) { 
          changeColor(4, false); 
          cout << map[row][col]; 
          changeColor(15, false); 
         } 
        } else { 
         cout << map[row][col]; 
        } 
       } 
       cout << endl; 
      } 
     } 

getPlayer是一个函数,它当前保存的/选择的字符,并返回它属于

对象

位置

int character::getPos(bool getX) { 
    if (getX) { 
     return xPos; 
    } else { 
     return yPos; 
    } 
} 

回报烧焦

char character::getSymbol() { 
     return symbol; 
    } 

头文件

class character 
{ 
public: 
    character(); 
    ~character(); 
    string getName(); 
    char getSymbol(); 
    int getStatus(); 
    int getPos(bool); 
    void setPos(int, int); 
    void setStatus(bool, bool); 
protected: 
    string className; 
    char symbol; 
private: 
    int xPos; 
    int yPos; 
}; 

monster *enemy[21]; 
    elf elfPlayer; 
    guard guardPlayer; 
    knight knightPlayer; 
    rogue roguePlayer; 
    wizard wizardPlayer; 

printScreen(elfPlayer.getName()); 
     cout << elfPlayer.getSymbol(); 

我测试是否为对象的志愿服务岗位可打印游戏的头文件,它的工作对*敌人[ ],派生类看起来很好。我真的不知道为什么它不能正确打印。也许我就像一些洞察力一样犯了一个愚蠢的错误。 What happens when the map is printed, the bottom right empty area is meant to be full of chars

+0

你应该完全认为使用引用1将使你的代码更具可读性并且减少在你的地图上调用operator []'的次数...... –

+0

也请使用x和y的2个函数/ getter位置。 'getPos(bool getX)'看起来不正确......或者让函数返回一个点对象。 –

+0

您发布了很多代码,但其中大部分对解决问题没有用处。请发布[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

回答

0

我发现这只是我的一个非常愚蠢的错误。感谢Simon Kraemer发现问题。

我只是在printScreen方法内部添加了其他的东西来打印出字符。

顺便说一句,如果我有这样的get positon函数,它有什么关系,它使用更少的空间并且更快使用。此外这不是一个团体项目,所以混乱不是一个问题(如果我在一个组中,也许编号改变它)。