5

我有一个包含 10 个项目的向量(为简单起见,所有同一个类都称为“a”)。我想要做的是检查'A'不是a)隐藏墙壁或b)隐藏另一个'A'。我有一个碰撞功能可以做到这一点。

这个想法只是让这个循环类通过并将“A”移动到下一个位置,如果该药水引起了碰撞,那么它需要在屏幕上给自己一个新的随机位置。因为屏幕很小,所以很有可能将元素放在另一个屏幕上(或墙顶等)。代码的逻辑在我的脑海中运行良好 - 但调试代码时对象只是卡在循环中,并保持在相同的位置。'A' 应该在屏幕上移动,但它保持不动!

当我注释掉 Do while 循环并将“MoveObject()”函数向上移动时,代码完美地工作,“A”在屏幕上移动。只是当我尝试为其添加额外功能时,它才不起作用。

    void Board::Loop(void){


        //Display the postion of that Element. 
        for (unsigned int i = 0; i <= 10; ++i){


            do {

                if (checkCollisions(i)==true){
                moveObject(i); 
                }
                else{
                    objects[i]->ResetPostion();

                }

            }
            while (checkCollisions(i) == false);
            objects[i]->SetPosition(objects[i]->getXDir(),objects[i]->getYDir());
        }

}

下面的类是碰撞检测。这个我稍后会展开。

    bool Board::checkCollisions(int index){

    char boundry = map[objects[index]->getXDir()][objects[index]->getYDir()];

    //There has been no collisions - therefore don't change anything 
    if(boundry == SYMBOL_EMPTY){
        return false;
    }
    else{
        return true;

    }

}

任何帮助将非常感激。我会给你买一杯虚拟啤酒:-)

谢谢

编辑:

ResetPostion -> 这将给元素 A 在屏幕上的随机位置 moveObject -> 这将查看对象的方向并适当地调整 x 和 Y 线。

4

3 回答 3

2

我猜你需要:

do { ...
... } while (checkCollisions(i)); 

另外,如果你有 10 个元素,那么i = 0; i < 10; i++

顺便说一句。不要写if (something == true),简单地if (something)if (!something)

于 2013-04-15T18:51:14.420 回答
0
for (unsigned int i = 0; i <= 10; ++i){

是错误的,因为这是十一个项目的循环,使用

for (unsigned int i = 0; i < 10; ++i){

反而。

您没有定义“不起作用”是什么意思,所以这就是我现在可以提供的所有帮助。

于 2013-04-15T18:49:57.423 回答
0

这里似乎对基本的语言结构和逻辑流程有很多困惑。编写一些非常简单的测试应用程序来练习不同的语言功能可能会对您有很大帮助。(如果你有的话,一个单步调试器也是如此)

do/while()是一个相当高级的功能,有些人在整个职业生涯中从未使用过,请参阅:do...while vs while

我建议在while使用. 您的第一眼应该是当您刚刚完成一个or循环并意识到如果您稍微更改执行顺序,您可以节省大量重复的初始化代码。(就我个人而言,我什至不再使用它,我只是使用了一个迭代器,因为它让我可以在一个循环中预先和发布代码)if/elsefordowhilefordowhile(true)/break

我认为这简化了您要完成的工作:

void Board::Loop(void) {
    //Display the postion of that Element. 
    for (unsigned int i = 0; i < 10; ++i) {
        while(IsGoingToCollide(i))  //check is first, do while doesn't make sense
            objects[i]->ResetPosition();
        moveObject(i);   //same as ->SetPosition(XDir, YDir)?
                         //either explain difference or remove one or the other
    }
}

这个函数名对我来说似乎模棱两可:

bool Board::checkCollisions(int index) {

我建议将其更改为:

// returns true if moving to next position (based on inertia) will 
// cause overlap with any other object's or structure's current location
bool Board::IsGoingToCollide(int index) {

相反checkCollisions()也可能意味着:

// returns true if there is no overlap between this object's
// current location and any other object's or structure's current location
bool Board::DidntCollide(int index) {

最后说明:仔细检查->ResetPosition()将事物置于边界内。

于 2013-04-16T14:36:46.133 回答