矢量更改值意外

时间:2014-04-02 19:40:09

标签: c++ visual-studio vector stl

我正在做一个小游戏(只是控制台),而我的向量并不像我认为的那样。矢量的一个价值只是改变了,我不知道为什么。下面显示的代码是这个bug来自的部分,我已经删除了其中的代码,这两个向量出现了,并且bug仍然出现,我不知道为什么! 这部分代码负责让敌人向随机方向扩散。

/**in this part the first value of the 2 vectors are created 
(only once, I've tested it)**/
if(moves == 0){
    int randomNum1 = (rand() % HEIGHT)+1;
    int randomNum2 = (rand() % WIDTH)+1;
    _EnemysY.push_back(randomNum1);
    _EnemysX.push_back(randomNum2);
}
/**_Enemy vectors have normal values. For instance: _EnemysX[0]
is 23 and _EnemysY[0] is 12**/
/**In this part, the Enemy spreads in a random direction**/
if (moves > 3){
    //save Enemys at the border here (those who can move)
    std::vector<int> topX;
    std::vector<int> topY;
    std::vector<int> botX;
    std::vector<int> botY;
    std::vector<int> rigX;
    std::vector<int> rigY;
    std::vector<int> lefX;
    std::vector<int> lefY;
/**here, I wanna save all Fields of the Enemy where it can spread to:**/
    for (Uint it = 0; it < _EnemysY.size(); it++){          
/**_EnemysY is still normal, but _EnemysX is like: 86BF163E0**/     
        if (_map[_EnemysY[it]-1][_EnemysX[it]] == _Grenade || _map[_EnemysY[it]-1][_EnemysX[it]] == _Field){
            topY.push_back(_EnemysY[it]);
            topX.push_back(_EnemysX[it]);
        }
        if (_map[_EnemysY[it]+1][_EnemysX[it]] == _Grenade || _map[_EnemysY[it]+1][_EnemysX[it]] == _Field){
            botY.push_back(_EnemysY[it]);
            botX.push_back(_EnemysX[it]);
        }
        if (_map[_EnemysY[it]][_EnemysX[it]-1] == _Grenade || _map[_EnemysY[it]][_EnemysX[it]-1] == _Field){
            lefX.push_back(_EnemysX[it]);
            lefY.push_back(_EnemysY[it]);
        }
        if (_map[_EnemysY[it]][_EnemysX[it]+1] == _Grenade || _map[_EnemysY[it]][_EnemysX[it]+1] == _Field){
            rigX.push_back(_EnemysX[it]);
            rigY.push_back(_EnemysY[it]);
        }
    }

/**and here is a random direction created and the programm 
chooses which Field it will spread to: **/
    for (;;){
        int ranDir = (rand() % 4)+1;
        if (ranDir == 1 && !topY.empty()){
            int temp = (rand() % topY.size())+1;
            _EnemysY.push_back(topY[temp]);
            _EnemysX.push_back(topX[temp]);
            return true;
        }
        if (ranDir == 2 && !botY.empty()){
            int temp = (rand() % botY.size())+1;
            _EnemysY.push_back(botY[temp]);
            _EnemysX.push_back(botX[temp]);
            return true;
        }
        if (ranDir == 3 && !lefY.empty()){
            int temp = (rand() % lefY.size())+1;
            _EnemysY.push_back(lefY[temp]);
            _EnemysX.push_back(lefX[temp]);
            return true;
        }
        if (ranDir == 4 && !rigY.empty()){
            int temp = (rand() % rigY.size())+1;
            _EnemysY.push_back(rigY[temp]);
            _EnemysX.push_back(rigX[temp]);
            return true;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

首先,为什么没有struct描述“敌人”,包括其位置(通过两个字段XY)?它会稍微改进代码,并且避免使用两个无关的向量,如果分开的话。

关于主题:

int temp = (rand() % rigY.size())+1;
_EnemysY.push_back(rigY[temp]);

rand() % rigY.size()会在区间[0,rigY.size())中给出一个数字。然后,您向两边添加1,以便temp位于区间[1,rigY.size()]中。

rigY[rigY.size()]不是矢量中的有效元素......

答案 1 :(得分:0)

首先:谢谢Andrei和PaulMcKenzie的时间,你的答案没有解决问题,但它们仍然有用。 :)

现在回答问题:

好的!我是一个完整的douchebag!因为我没有在上面的代码中打印,我的std :: cout是我的变量,我不小心写道:“std :: cout&lt;&lt; ...&lt;&lt; std:cout&lt;&lt; ... std :: endl“由于某种原因,第二个”std :: cout“导致了一个错误,它打印出一个非常高的数字。所以我的代码一般(没有cout s)工作正常,但我仍然改变了你所说的一些东西。