soft-summer-2021 / summer2021

程序设计实践 (2021夏季学期)
31 stars 6 forks source link

easyx明明对障碍物边界做了判断处理,但有时(次数较不判断减少)仍会出生在边界物上 #37

Closed oldGreenIsMe closed 2 years ago

oldGreenIsMe commented 2 years ago

这是判断函数

int judgeAround(int x, int y, int tankAngle)
{
    int i, j;

    //判断前方
    for (i = 0; i <= tankwidth; i++)
        if (battleGround[(int) (x + i * cos(tankAngle))][(int) (y - i * sin(tankAngle))] == 1)
            return 0;

    //判断左侧方
    for(i=0;i<=tankhigh;i++)
        if(battleGround[(int) (x+i*sin(tankAngle))][(int) (y+i*cos(tankAngle))]==1)
            return 0;

    //判断后方
    for (i = 0; i <= tankwidth; i++)
        if (battleGround[(int)(x + tankhigh * sin(tankAngle) + i * cos(tankAngle))][(int)(y + tankhigh * cos(tankAngle) - i * sin(tankAngle))]==1)
            return 0;

    //判断右侧方
    for (i = 0; i <= tankhigh; i++)
        if (battleGround[(int)(x + tankwidth * cos(tankAngle) + i * sin(tankAngle))][(int)(y - tankwidth * sin(tankAngle) + i * cos(tankAngle))] == 1)
            return 0;

    return 1;
}

这是生成坦克位置函数

do {
    greenTankAngle = rand() % 720 - 360;
    tank1_x = rand() % 635;
    tank1_y = rand() % 475;
} while (!judgeAround(tank1_x,tank1_y,greenTankAngle*PI*1.0/360));

这是效果图,只看绿色就好,红色并没经过判断障碍物处理

image

huyikun commented 2 years ago

可以输出一下生成在边界上时的各个参数,然后对judgeAround函数debug一下 以及遍历坦克边界像素点来判断是否障碍不太优雅,可以考虑试试能否按坦克外接圆作为判定范围

oldGreenIsMe commented 2 years ago

可以输出一下生成在边界上时的各个参数,然后对judgeAround函数debug一下 以及遍历坦克边界像素点来判断是否障碍不太优雅,可以考虑试试能否按坦克外接圆作为判定范围

for (i = 0; i <= tankwidth; i++) for (j = 0; j <= tankhigh; j++) if (battleGround[i + x][j + y] == 1) return 0; 都已经严格到把整张图片都当作判定标准了,还是不行

dyn1721 commented 2 years ago

你这个x,y是对应坦克图片哪个点呢?由于不太确定你的各种变量设定的含义 我猜一下可能出现这种情况的原因: 坦克图片是一个二维矩形,我看你只进行了4个方向一维线段上点的碰撞判断,比如矩形对角线上的点是不是就没有考虑? 因为我看你给出的图片坦克也是斜着的对角线部分和墙壁重合了

其实我感觉没必要判断这么麻烦
你可以以坦克图片中心点代表坦克坐标,我看你墙壁也是battleGround二维数组记录,直接和battleGround中每个点用距离公式算一个距离 如果距离超过设定的碰撞距离(至少比坦克矩形对角线一半大 可以设置大些 坦克直接出生墙边也不太好)就重新随机出生

实在不行 直接内设几个固定出生点得了 不要因为这个小细节耽误太多开发时间