コード例 #1
0
    private void ChooseMovement()
    {
        var dec = UnityEngine.Random.Range(-1, 4);

        switch (dec)
        {
        case 0:
            decision = MovementDecision.NOTHING;
            break;

        case 1:
            decision           = MovementDecision.RANDOM_DIRECTION;
            calculateRandomDir = true;
            break;

        case 2:
            decision = MovementDecision.STRAFE_LEFT;
            break;

        case 3:
            decision = MovementDecision.STRAFE_RIGHT;
            break;
        }
    }
コード例 #2
0
        protected override EnvShooter.Action GetAction()
        {
            Vector2 move_target = new Vector2(this.Pos.X, 20);
            Vector2 aim_target  = new Vector2(0, 0);


            if (env.Bullets.Length == 0)
            {
                move_target.Y = this.Pos.Y;
            }


            EnvShooter.Bot[] bots = this.enemies.ToList().FindAll(x => x.Alive).ToArray();
            aim_target = bots[rand.Next(bots.Length)].Pos;

            bool do_charge = false;//this.Id == 0;


            Bullet[] collectible_bullets = this.env.Bullets.ToList().FindAll(x => x.Collectible).ToArray();
            Bullet[] active_bullets      = this.env.Bullets.ToList().FindAll(x => !x.Collectible).ToArray();
            Vector2[,] bullet_poses = BulletSim3.Get_Bullet_Poses(active_bullets, this.map, frames_till_hit_max);

            /*  MOVEMENT START  */
            MovementDecision md = new MovementDecision(bullet_poses);

            // Add the most desired position first and least desired one last

            // 1. Get out of danger Zone
            if (InMortalDanger(this.Pos, enemies[0].Pos))
            {
                Vector2 rel_vec = -(enemies[0].Pos - this.Pos);
                if (!IsPosInWall(this.Pos + rel_vec))
                {
                    md.desired_poses.Add(TargetToNextFramePos(this.Pos + rel_vec));
                }
            }

            // 2. Get to collectable
            List <Tuple <float, Vector2> > collectible_dists = collectible_bullets.Select(x => new Tuple <float, Vector2>(Vector2.Distance(x.Pos, this.Pos), x.Pos)).ToList();

            collectible_dists.OrderBy(x => x.Item1);
            for (int i = 0; i < collectible_dists.Count; i++)
            {
                if (!InMortalDanger(collectible_dists[i].Item2, enemies[0].Pos))
                {
                    md.desired_poses.Add(TargetToNextFramePos(collectible_dists[i].Item2));
                }
            }


            //if (!InMortalDanger(new Vector2(9, 9), enemies[0].Pos) &&
            //    !InNoChargeSafeZone(new Vector2(9, 9), enemies[0].Pos))
            //    md.desired_poses.Add(TargetToNextFramePos(new Vector2(9, 9)));

            // 3. Get to edge of no charge safe zone
            if (InSafety(this.Pos, enemies[0].Pos))
            {
                Vector2 rel_vec = (enemies[0].Pos - this.Pos);

                if (!IsPosInWall(this.Pos + rel_vec))
                {
                    md.desired_poses.Add(TargetToNextFramePos(this.Pos + rel_vec));
                }
            }
            else if (InNoChargeSafeZone(this.Pos, enemies[0].Pos))
            {
                Vector2 rel_vec = -(enemies[0].Pos - this.Pos);

                if (!IsPosInWall(this.Pos + rel_vec))
                {
                    md.desired_poses.Add(TargetToNextFramePos(this.Pos + rel_vec));
                }
            }



            // Add backup targets
            Vector2[] move_vecs = new Vector2[]
            {
                new Vector2(1, -1), new Vector2(1, 0), new Vector2(1, 1),
                new Vector2(0, 1), new Vector2(-1, 1),
                new Vector2(-1, 0), new Vector2(-1, -1), new Vector2(0, -1)
            };
            for (int i = 0; i < move_vecs.Length; i++)
            {
                md.desired_poses.Add(TargetToNextFramePos(this.Pos + move_vecs[i]));
            }
            md.desired_poses.Add(Vector2.Zero);

            move_target = md.GetOptimalPos(this.Pos);

            /*  MOVEMENT END  */

            color = md.IsMovementTargetSafe == true ? Color.DeepPink : Color.Purple;

            /*  CHARGE START  */
            if (InMortalDanger(move_target, enemies[0].Pos) || md.IsMovementTargetSafe == false)
            {
                do_charge = false;
            }
            else
            {
                // Fully charged
                if (this.Charge >= 0.95)
                {
                    // Only shoot in no charge safety zone
                    if (InNoChargeSafeZone(this.Pos, enemies[0].Pos))
                    {
                        do_charge = false;
                    }
                    else
                    {
                        do_charge = true;
                    }
                }
                else
                {
                    do_charge = true;
                }
            }


            /*  CHARGE END  */

            //if (this.Id == 0)
            //    do_charge = false;

            EnvShooter.Action action = GoToXY(move_target);
            action.aim    = AimToPos(aim_target);
            action.charge = do_charge;
            return(action);
        }