加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我的程序中有关碰撞的小错误

发布时间:2020-12-16 07:10:57 所属栏目:百科 来源:网络整理
导读:我想弄清楚我的问题一个小时. 我要画出正在发生的事情. char trap = 'Q'; char character = 'L';.... .Q....L..... 当L向上移动并且Q向右移动时它们发生碰撞并且程序结束.但: .....QL......... 当L向左移动而Q向右移动时,它们不会像上面的例子那样发生碰撞,
我想弄清楚我的问题一个小时.
我要画出正在发生的事情.

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

.... 
.Q..
..L.
....

当L向上移动并且Q向右移动时它们发生碰撞并且程序结束.但:

....
.QL.
....
....

当L向左移动而Q向右移动时,它们不会像上面的例子那样发生碰撞,而是发生的事情是:

....
..Q.
....
....

这是我的代码.对不起,我的英语不好 :(

测试移动是’w’,’a’,’s’还是’d’:

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;
 }

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],'a',trap[x]);
                            else if ( r[x] == 3 ) // moves down
                                move(traps_positionX[x],'s',trap[x]);
                            else if ( r[x] == 4 ) // moves to right
                                move(traps_positionX[x],'d',trap[x]);
                    }
                    return;
}

?检查是否发生碰撞

bool cave::collision()
{
                    for ( unsigned short int x = 0; x < 3; x++ )
                    {
                            if ( floor[character_positionX][character_positionY] == trap[x] )
                                return true;
                    }
                    return false;
}

解决方法

好吧,从您的代码中可以看出Trap和Player切换了它们的位置.
然而,陷阱(Q)的位置切换用地砖覆盖了玩家(L).

基本上这发生了:

(1).QL.

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

(3)..Q. // Q用’.’覆盖L瓦

你的代码会受到卷积的影响,因为你试图在一个函数中做太多,或者在几个不同的地方做.这导致您在上面的示例中缺少必要的碰撞检查.

一个更好的策略是尝试构建您的程序流程.例如,您目前有:

(1)提示方向

(2)移动玩家牌

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

< - (2a)是陷阱可以连续两次移动的另一个陷阱. (3)移动陷阱 (4)检查碰撞 (5)从(1)重复 我想你想要的是: (1)提示方向 (2)移动玩家牌 (2a)检查碰撞 (3)移动陷阱 (3a)检查碰撞 (6)从(1)重复 至于重构尝试回收你的代码.例如,在move()函数中,char’w'(…)仅影响’x’或’y’变量.因此你也可以把它写成

move(...) {
    if((m=='w')||(m=='W')) { y = y+1 }
    else if((m=='a')||(m=='A')) { x = x-1 } // same for SD

    if(floor[x][y] != wall) {
        // set new position to object,if it can't move,just don't set it
    }
}

这样,您无需复制和粘贴for循环,只需进行最少的更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读