Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的程序中有一个关于冲突的小错误_C++_Collision - Fatal编程技术网

C++ 我的程序中有一个关于冲突的小错误

C++ 我的程序中有一个关于冲突的小错误,c++,collision,C++,Collision,我花了一个小时试图解决我的问题 我将画出正在发生的事情 char trap = 'Q'; char character = 'L'; .... .Q.. ..L. .... 当L向上移动,Q向右移动时,它们碰撞,程序结束。但是: .... .QL. .... .... .... ..Q. .... .... void cave::move(int& x, int& y, char m, char unit) { if ( m == 'W

我花了一个小时试图解决我的问题
我将画出正在发生的事情

char trap = 'Q'; 
char character = 'L';

.... 
.Q..
..L.
....
当L向上移动,Q向右移动时,它们碰撞,程序结束。但是:

....
.QL.
....
....
....
..Q.
....
....
void cave::move(int& x, int& y, char m, char unit)
{
                if ( m == 'W' || m == 'w' ) // if moves up
                {
                    floor[x][y] = tile;
                    x -= 1;
                    for ( unsigned short int x = 0; x < 3; x++ )
                    {
                            if ( floor[x][y] == wall && floor[x][y] == trap[x] )
                            {
                                x += 1;
                                trapsMove();
                        }
                        }
                        floor[x][y] = unit;
                }

                else if ( m == 'A' || m == 'a' ) // if moves to left
                {
                            floor[x][y] = tile;
                            y -= 1;
                        for ( unsigned short int x = 0; x < 3; x++ )
                        {
                            if ( floor[x][y] == wall && floor[x][y] == trap [x] )        
                            {
                                   y += 1;
                                   trapsMove();
                                }
                        }
                            floor[x][y] = unit;
                }

                else if ( m == 'S' || m == 's' ) // if moves down
                {
                        floor[x][y] = tile;
                            x += 1;
                            for ( unsigned short int x = 0; x < 3; x++ )
                        {
                                if ( floor[x][y] == wall && floor[x][y] == trap[x] )
                                {
                                    x -= 1;
                                    trapsMove();
                                }
                            }
                            floor[x][y] = unit;
                }
               else if ( m == 'D' || m == 'd' )  // if moves to right
               {
                        floor[x][y] = tile;
                            y += 1;
                            for ( unsigned short int x = 0; x < 3; x++ )
                            {
                                if ( floor[x][y] == wall && floor[x][y] == trapx] )
                                {
                                    y -= 1;
                                    trapsMove();
                                }
                            }
                            floor[x][y] = unit;
               }
               else 
                        control(); 
               return;
 }
当L向左移动,Q向右移动时,它们不会以与上述示例相同的方式碰撞,而是发生了:

....
.QL.
....
....
....
..Q.
....
....
void cave::move(int& x, int& y, char m, char unit)
{
                if ( m == 'W' || m == 'w' ) // if moves up
                {
                    floor[x][y] = tile;
                    x -= 1;
                    for ( unsigned short int x = 0; x < 3; x++ )
                    {
                            if ( floor[x][y] == wall && floor[x][y] == trap[x] )
                            {
                                x += 1;
                                trapsMove();
                        }
                        }
                        floor[x][y] = unit;
                }

                else if ( m == 'A' || m == 'a' ) // if moves to left
                {
                            floor[x][y] = tile;
                            y -= 1;
                        for ( unsigned short int x = 0; x < 3; x++ )
                        {
                            if ( floor[x][y] == wall && floor[x][y] == trap [x] )        
                            {
                                   y += 1;
                                   trapsMove();
                                }
                        }
                            floor[x][y] = unit;
                }

                else if ( m == 'S' || m == 's' ) // if moves down
                {
                        floor[x][y] = tile;
                            x += 1;
                            for ( unsigned short int x = 0; x < 3; x++ )
                        {
                                if ( floor[x][y] == wall && floor[x][y] == trap[x] )
                                {
                                    x -= 1;
                                    trapsMove();
                                }
                            }
                            floor[x][y] = unit;
                }
               else if ( m == 'D' || m == 'd' )  // if moves to right
               {
                        floor[x][y] = tile;
                            y += 1;
                            for ( unsigned short int x = 0; x < 3; x++ )
                            {
                                if ( floor[x][y] == wall && floor[x][y] == trapx] )
                                {
                                    y -= 1;
                                    trapsMove();
                                }
                            }
                            floor[x][y] = unit;
               }
               else 
                        control(); 
               return;
 }


这是我的密码。对不起,我的英语不好:(

测试移动是否为“w”、“a”、“s”或“d”:

....
.QL.
....
....
....
..Q.
....
....
void cave::move(int& x, int& y, char m, char unit)
{
                if ( m == 'W' || m == 'w' ) // if moves up
                {
                    floor[x][y] = tile;
                    x -= 1;
                    for ( unsigned short int x = 0; x < 3; x++ )
                    {
                            if ( floor[x][y] == wall && floor[x][y] == trap[x] )
                            {
                                x += 1;
                                trapsMove();
                        }
                        }
                        floor[x][y] = unit;
                }

                else if ( m == 'A' || m == 'a' ) // if moves to left
                {
                            floor[x][y] = tile;
                            y -= 1;
                        for ( unsigned short int x = 0; x < 3; x++ )
                        {
                            if ( floor[x][y] == wall && floor[x][y] == trap [x] )        
                            {
                                   y += 1;
                                   trapsMove();
                                }
                        }
                            floor[x][y] = unit;
                }

                else if ( m == 'S' || m == 's' ) // if moves down
                {
                        floor[x][y] = tile;
                            x += 1;
                            for ( unsigned short int x = 0; x < 3; x++ )
                        {
                                if ( floor[x][y] == wall && floor[x][y] == trap[x] )
                                {
                                    x -= 1;
                                    trapsMove();
                                }
                            }
                            floor[x][y] = unit;
                }
               else if ( m == 'D' || m == 'd' )  // if moves to right
               {
                        floor[x][y] = tile;
                            y += 1;
                            for ( unsigned short int x = 0; x < 3; x++ )
                            {
                                if ( floor[x][y] == wall && floor[x][y] == trapx] )
                                {
                                    y -= 1;
                                    trapsMove();
                                }
                            }
                            floor[x][y] = unit;
               }
               else 
                        control(); 
               return;
 }
void cave::move(int&x,int&y,字符m,字符单位)
{
if(m='W'| | m=='W')//if向上移动
{
地板[x][y]=瓷砖;
x-=1;
for(无符号短整数x=0;x<3;x++)
{
如果(地板[x][y]==墙壁和地板[x][y]==陷阱[x])
{
x+=1;
trapsMove();
}
}
楼层[x][y]=单位;
}
else if(m='A'| | m='A')//if向左移动
{
地板[x][y]=瓷砖;
y-=1;
for(无符号短整数x=0;x<3;x++)
{
如果(地板[x][y]==墙壁和地板[x][y]==陷阱[x])
{
y+=1;
trapsMove();
}
}
楼层[x][y]=单位;
}
else if(m=='S'| | m=='S')//if下移
{
地板[x][y]=瓷砖;
x+=1;
for(无符号短整数x=0;x<3;x++)
{
如果(地板[x][y]==墙壁和地板[x][y]==陷阱[x])
{
x-=1;
trapsMove();
}
}
楼层[x][y]=单位;
}
else if(m='D'| | m='D')//if向右移动
{
地板[x][y]=瓷砖;
y+=1;
for(无符号短整数x=0;x<3;x++)
{
如果(楼层[x][y]==墙和楼层[x][y]==trapx])
{
y-=1;
trapsMove();
}
}
楼层[x][y]=单位;
}
其他的
控制();
返回;
}
ai移动功能

void cave::trapsMove() 
{
                    int r[3]; // each index will hold the movement of traps 
                    for ( unsigned short int x = 0; x < 3; x++ )
                    {
                            r[x] = rand() % 4 + 1;
                            if ( r[x] == 1 ) // moves up
                                move(traps_positionX[x],traps_positionY[x],'w',trap[x]);
                            else if ( r[x] == 2 ) // moves to left
                                move(traps_positionX[x],traps_positionY[x],'a',trap[x]);
                            else if ( r[x] == 3 ) // moves down
                                move(traps_positionX[x],traps_positionY[x],'s',trap[x]);
                            else if ( r[x] == 4 ) // moves to right
                                move(traps_positionX[x],traps_positionY[x],'d',trap[x]);
                    }
                    return;
}
void cave::trapsMove()
{
int r[3];//每个索引将保存陷阱的移动
for(无符号短整数x=0;x<3;x++)
{
r[x]=rand()%4+1;
如果(r[x]==1)//向上移动
移动(陷阱位置x[x],陷阱位置Y[x],'w',陷阱[x]);
如果(r[x]==2)//向左移动,则为else
移动(陷阱位置x[x],陷阱位置Y[x],'a',陷阱[x]);
如果(r[x]==3)//向下移动,则为else
移动(陷阱位置x[x],陷阱位置Y[x],'s',陷阱[x]);
如果(r[x]==4)//向右移动,则为else
移动(陷阱位置x[x],陷阱位置Y[x],'d',陷阱[x]);
}
返回;
}
检查是否发生碰撞

boolcave::collision()
{
for(无符号短整数x=0;x<3;x++)
{
if(地板[字符位置x][字符位置Y]==陷阱[x])
返回true;
}
返回false;
}

从您的代码中可以看出,陷阱和玩家切换了位置。 但是,陷阱(Q)的位置开关会用地砖覆盖玩家(L)

基本上是这样的:

(1) .QL

(2) .L..//L和Q居住在同一块瓷砖中

(3) ..Q.//Q用“.”平铺覆盖L


您的代码存在卷积问题,因为您试图在一个函数中执行过多的操作,或者在多个不同的位置执行过多的操作。这会导致您缺少上述示例中所需的冲突检查

更好的策略是尝试组织您的程序流程。例如,您目前有:

(1) 提示指示

(2) 移动玩家牌

(2a)如果玩家击中了陷阱或墙壁的瓷砖(代码输入错误,必须是| |而不是&&),移动陷阱


很好地描述了这个问题,但是有很多代码供人们阅读。可能大部分都是不相关的。你能试着做一个测试吗。@BoBTFish抱歉,我以为他们会运行代码。忙-忙-忙!少量代码会得到更多帮助!@KarolyHorvath感谢你这样的反应。哦,这对我来说很有意义。因为在游戏循环中。用户移动将首先执行,然后是陷阱。因此,如果我首先执行trapmove,L将覆盖QQ。你所说的“陷阱可以连续执行两个移动”是什么意思?如果他们的移动受到限制,例如撞墙或撞到共陷阱,他们只能做两个移动。你是对的,我在一个功能中做的太多了,因此当玩家撞墙时,陷阱会再次移动,而不是再次提示用户d