完全打印2D数组忽略编辑值,打印初始化值

时间:2016-07-30 18:44:46

标签: c++ arrays

初学者到C ++并尝试一个dungeon crawler初学者任务,在测试我发现打印2D数组的其中一个类时,如果它被编辑和打印,它会重置并打印它初始化的原始值。

InitGrid用于初始化数组。

class MAP
{
public:
/*
Difficulty used in number of enemies and traps created.
1-5 Difficulty
| 1 - Too easy | 2 - Easy | 3 - Normal | 4 - Hard | 5 - Insane |
*/
int Difficulty = Hard; //### Temporary, user selection needs implemented ###

int SpawnPos;
int TPosX; //Treasure Postion, used to checkwinstate.
int TPosY; //Treasure Postion, used to checkwinstate.

char Grid[MAPHeight][MAPWidth];

//InitGrid Function
void InitGrid()
{
    for (int y = 0; y < 9; y++)    //Row loop
    {
        for (int x = 0; x < 14; x++) //Column loop
        {
            Grid[y][x] = { '.' };
        }
    }
}

//PrintMap Function
void PrintMap()
{
    for (int y = 0; y < 9; y++)    //This loops on the rows.
    {
        for (int PrintX = 0; PrintX < 14; PrintX++) //This loops on the columns
        {
            cout << Grid[y][PrintX] << "  ";
        }
        cout << endl;
    }
}

//GenerateEnemies Function
void GenerateEnemies()
{
    for (int i = 0; i < Difficulty; i++)
    {
        int TotEnemies = (Difficulty * 1.5);

        for (TotEnemies; TotEnemies == 0; TotEnemies--)
        {
            int x = rand() % (MAPWidth - 1);
            int y = rand() % (MAPHeight - 1);

            if (Grid[y][x] == '.')
            {
                Grid[y][x] = '#';
            }
            else
            {
                GenerateEnemies();
            }
        }
    }
}

//GenerateEnemies Function
void GenerateTraps()
{
    for (int i = 0; i < Difficulty; i++)
    {
        int TotTraps = (Difficulty * 1.5);

        for (TotTraps; TotTraps == 0; TotTraps--)
        {
            int x = rand() % (MAPWidth - 1);
            int y = rand() % (MAPHeight - 1);

            if (Grid[y][x] == '.')
            {
                Grid[y][x] = 'T';
            }
            else
            {
                GenerateTraps();
            }
        }
    }
}

//GenerateTreasure Function
void GenerateTreasure()
{
    int x = rand() % MAPWidth;
    int y = rand() % MAPHeight;
    /*
    Randomly selects spawn location
    uses tmp variables to overwrite
    that grid location.
    */
    if (Grid[y][x] == '.')
    {
        Grid[y][x] = 'X';
    }
    else
    {
        GenerateTreasure();
    }

    TPosX = x;
    TPosY = y;
}
};

//PLAYER CLASS
class PLAYER : public MAP
{
public:

int Health = (Difficulty * 1.5);
int PPosX;
int PPosY;

char Direction; //Use cin to get user input after map is updated, used in switch case to move player.

//GenerateSpawn Function
void GenerateSpawn()
{
    int x = rand() % (MAPWidth - 1);
    int y = rand() % (MAPHeight - 1);

    /*
    Randomly selects spawn location
    uses tmp variables to overwrite
    that grid location.
    */

    Grid[y][x] = 'P';

    PPosX = x;
    PPosY = y;
}

//AllowMove Function
void AllowMove(int y, int x)
{
    if (Grid[y][x] == '.')
    {
        Grid[y][x] = '@';
    }
    else if (Grid[y][x] == 'X')
    {
        //GameWin();
    }
    else if (Grid[y][x] == '#')
    {
        //DamagePlayer();
    }
    else {}

}

//MovePlayer Function
void MovePlayer()
{
    switch (Direction)
    {
    case 'w':
    {
        int x = PPosX;
        int y = (PPosY + 1);

        void AllowMove(int y, int x);
    }
    break;

    case 'a':
    {
        int x = (PPosX - 1);
        int y = PPosY;

        void AllowMove(int y, int x);
    }
    break;
    case 's':
    {
        int x = (PPosX);
        int y = PPosY;

        void AllowMove(int y, int x);
    }
    break;
    case 'd':
    {
        int x = (PPosX + 1);
        int y = PPosY;

        void AllowMove(int y, int x);
    }
    break;

    default:
        cout << "invalid character, try again." << endl;
        Sleep(5000);
        //Call function to retry
    }
}
};

//#########    End    #########

//Main Function
int main() {

srand(time(NULL)); //Used to seed rand() values.

SetConsoleTitle(TEXT("Dungeon Crawler"));

//Objects
MAP Map;
PLAYER Player;

Map.InitGrid();

Player.GenerateSpawn();

//Map.GenerateTreasure();

//Map.GenerateEnemies();

//Map.GenerateTraps();

Map.PrintMap();

cout << endl;

}

然而,当我运行这些时,我得到this.

我尝试使用断点在visual studio中进行调试,并且在某些时候它确实将网格值设置为'P',但由于缺少更好的术语,我无法找到“重置”的位置。

1 个答案:

答案 0 :(得分:0)

char Grid[MAPHeight][MAPWidth];需要作为全局变量移出类。目前,当PLAYER类继承MAPS类时,GenerateSpawn()编辑特定于链接到Grid的对象创建的PLAYER

当它是全局变量时,它是独立的,然后由GenerateSpawn()编辑并由void PrintMap()调用时,它们都使用相同的Grid

当它被打印到控制台时,它会正确打印出地图。

回答我自己的问题,万一其他人偶然发现了这个问题。