C#船舶与小行星碰撞试验

本文关键字:碰撞 小行星 | 更新日期: 2023-09-27 18:28:20

我们正试图对飞船和小行星进行碰撞检测。如果成功,它应该在N转弯之前检测到碰撞。然而,它混淆了角度350和15,并且它并没有真正起作用。有时它在移动,但有时它根本不移动。另一方面,它也没有在正确的时间拍摄。

我只想问一下如何使碰撞检测工作???如何解决角度混淆问题?

            // Get velocities of asteroid

            Console.WriteLine("lol");
            // IF equation is between -2 and -3
            if (equation1a <= -2)
            {
                // Calculate no. turns till asteroid hits
                float turns_till_hit = dx / vx;
                // Calculate angle of asteroid
                float asteroid_angle_rad = (float)Math.Atan(Math.Abs(dy / dx));
                float asteroid_angle_deg = (float)(asteroid_angle_rad * 180 / Math.PI);
                float asteroid_angle = 0;
                // Calculate angle if asteroid is in certain positions
                if (asteroid.Y > ship.Y && asteroid.X > ship.X)
                {
                    asteroid_angle = asteroid_angle_deg; 
                }
                else if (asteroid.Y < ship.Y && asteroid.X > ship.X)
                {
                    asteroid_angle = (360 - asteroid_angle_deg);
                }
                else if (asteroid.Y < ship.Y && asteroid.X < ship.X)
                {
                    asteroid_angle = (180 + asteroid_angle_deg);
                }
                else if (asteroid.Y > ship.Y && asteroid.X < ship.X)
                {
                    asteroid_angle = (180 - asteroid_angle_deg);
                }
                // IF turns till asteroid hits are less than 35
                if (turns_till_hit < 50)
                {
                    float angle_between = 0;
                    // Calculate angle between if asteroid is in certain positions
                    if (asteroid.Y > ship.Y && asteroid.X > ship.X)
                    {
                        angle_between = ship_angle - asteroid_angle;
                    }
                    else if (asteroid.Y < ship.Y && asteroid.X > ship.X)
                    {
                        angle_between = (360 - Math.Abs(ship_angle - asteroid_angle));
                    }
                    else if (asteroid.Y < ship.Y && asteroid.X < ship.X)
                    {
                        angle_between = ship_angle - asteroid_angle;
                    }
                    else if (asteroid.Y > ship.Y && asteroid.X < ship.X)
                    {
                        angle_between = ship_angle - asteroid_angle;
                    }
                    // If angle less than 0, add 360
                    if (angle_between < 0)
                    {
                        //angle_between %= 360;
                        angle_between = Math.Abs(angle_between);
                    }
                    // Calculate no. of turns to face asteroid
                    float turns_to_face = angle_between / 25;
                    if (turns_to_face < turns_till_hit)
                    {
                        float ship_angle_left = ShipAngle(ship_angle, "leftKey", 1);
                        float ship_angle_right = ShipAngle(ship_angle, "rightKey", 1);
                        float angle_between_left = Math.Abs(ship_angle_left - asteroid_angle);
                        float angle_between_right = Math.Abs(ship_angle_right - asteroid_angle);
                        if (angle_between_left < angle_between_right)
                        {
                            leftKey = true;
                        }
                        else if (angle_between_right < angle_between_left)
                        {
                            rightKey = true;
                        }
                    }
                    if (angle_between > 0 && angle_between < 25)
                    {
                        spaceKey = true;
                    }
                }
            }

        }
    }  

C#船舶与小行星碰撞试验

如何使碰撞检测工作?

  1. 找到一个无法正常工作的可复制场景。

  2. 手工计算出该场景的正确计算。

  3. 在调试器中启动程序。观看程序执行这些计算。

  4. 当你的计算结果与你手工计算的正确计算结果不匹配时,这就是错误所在。

特别是,查找注释与代码不匹配的地方;这些很可能是错误的。例如,此位:

// If angle less than 0, add 360
if (angle_between < 0)
{
    angle_between = Math.Abs(angle_between); 
}

评论说了一件事,代码做了完全不同的事情。实际运行的是代码。

还有一句忠告:你所有的计算都要加倍。没有理由一直把替身扔到浮子上。你这样做会让你的程序变得更慢、更不准确。还可以考虑用弧度进行所有计算,而不是在弧度和度数之间来回转换。

我还注意到,在您的代码中,您有很多通过零进行除法的机会。这些很可能是虫子。