C++ C++;边做边循环

C++ C++;边做边循环,c++,while-loop,do-while,C++,While Loop,Do While,我有一个包含10个项目的向量(为了简单起见,都属于同一个类,称之为“a”)。我想做的是检查“A”不是A)隐藏墙壁,也不是b)隐藏另一个“A”。我有一个碰撞函数可以实现这一点 这个想法很简单,就是让这个循环类通过并将“A”移动到下一个位置,如果该药剂引起碰撞,那么它需要在屏幕上给自己一个新的随机位置。由于屏幕很小,因此该元素很有可能被放置在另一个屏幕上(或墙壁顶部等)。代码的逻辑在我的脑海中运行良好——但调试代码时,对象只是卡在循环中,并停留在相同的位置。”A'应该在屏幕上移动,但它保持静止 当我

我有一个包含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());
        }

}
任何帮助都将不胜感激。我会给你买一杯虚拟啤酒:-)

谢谢

编辑:

ResetPosition->这将为元素在屏幕上提供一个随机位置 moveObject->这将查看对象的方向,并适当调整x和Y线

for(unsigned int i=0;i我想您需要:
do{。。。
for (unsigned int i = 0; i <= 10; ++i){
do { ...
... } while (checkCollisions(i));
…}while(检查碰撞(i));

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


顺便说一句,不要写
if(something==true)
,简单地写
if(something)
if(!something)
这里似乎有很多关于基本语言结构和逻辑流的混淆。编写一些使用不同语言功能的非常简单的测试应用程序可能会对您有很大帮助。(如果您有一个单步调试程序,也会有一个单步调试程序)

do/while()

<>我建议在<<代码> > <代码> > I/E/<代码>之前,使用<<代码> > 。第一次看<代码> do/COD>应该是在刚刚完成< <代码> < <代码> >或<>代码> Road,并且如果您只更改了顺序,可以实现保存一个重复初始化代码的山。执行一点。(就我个人而言,我甚至不再使用
do
,我只使用迭代器
while(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
    }
}
我建议将其更改为:

// 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()
是否将东西放在边界内。

+1用于虚拟啤酒。
->SetPosition()
moveObject()
做的事情不一样吗?也许可以从代码示例中删除一个或另一个以避免混淆?还有,为什么无限
()*****
?即使没有分号,为什么要在一个循环中移动
i
两次?10个元素在一个数组中。第一个索引从0开始,不是从1开始,不是吗?不管怎样,ResetPosition做什么?没什么?很好。接受你的观点。我会将两者合并为一个函数。当我运行代码时,对象会显示在屏幕上,一旦它通过碰撞检测,屏幕将保持空白。非常奇怪。我已经将其缩小为此代码,因为当我从主代码中删除它时,它可以工作,但不会发生冲突。添加了另一段!感谢快速回复!对我来说,听起来像是一个无限循环。你确定do while循环终止吗?是的,循环通过一个LH 10,我刚刚输入了一个断点,并跟踪了(I)@gcvt的值。你已经反转了while条件,
while(!checkCollisions(I))
将与原始代码相同。我故意这么做,因为他建议他的代码不起作用,我假设他想在发生冲突时循环…是的-发生冲突时,重置该元素的位置,然后再次测试。
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) {
// 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) {