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