Beispiel #1
0
        public (float, float) Score(TreeState t)
        {
            var s = 0.0f;



            var Projections        = DangerousBullets;//.Select(b => b.ProjectNew(this.GameTime + t.OffsetMS).Position).ToList();
            var PhantomProjections = new List <Vector2>();
            var muchFleets         = this.SensorFleets.Others
                                     .Select(f => new { Fleet = f, Distance = Vector2.Distance(t.Fleet.Center, f.Center) })
                                     // .Where(p => MathF.Abs(p.Fleet.Center.X - t.Fleet.Center.X) <= ViewportCrop.X
                                     //      && MathF.Abs(p.Fleet.Center.Y - t.Fleet.Center.Y) <= ViewportCrop.Y)
                                     .Where(p => !this.HookComputer.Hook.TeamMode || p.Fleet.Color != this.Color);

            var leftShips = new List <Ship>();

            //ParallelRoboMath.ProjectClosestIntersectionDist(this.HookComputer,-t.Fleet.Center+t.OldFleet.Center+ship.Position,ship.Position,t.LocalOffsetMS)
            foreach (var ship in t.Fleet.Ships)
            {
                // if(leftShips.Count>0){
                //     break;
                // }
                var worst = float.MaxValue;
                var atx   = ParallelRoboMath.ProjectClosestIntersectionDist(this.HookComputer, t.LocalOffsetMS, this, -t.Fleet.Center + t.OldFleet.Center + ship.Position, ship.Position, Projections.ToArray());

                foreach (var v in atx)
                {
                    var diff = v; //(v.ProjectNew(this.GameTime + t.OffsetMS).Position-ship.Position).Length();//RoboMath.ProjectClosestIntersectionDist(this.HookComputer,v,-t.Fleet.Center+t.OldFleet.Center+ship.Position,ship.Position,t.LocalOffsetMS,this);
                                  // var diff=v-ship.Position;
                    worst = MathF.Min(diff, worst);
                }
                // foreach (var flet in muchFleets)
                // {
                //     //Projections.Append(RoboMath.ProjectClosest( this.HookComputer, flet.Fleet.Center, t.Fleet.Center, t.OffsetMS, flet.Fleet.Ships.Count()));

                //     foreach (var ship2 in flet.Fleet.Ships)
                //     {
                //         var diff = (ship.Position - ship2.Position).Length() - 300.0f;//RoboMath.ProjectClosest(this.HookComputer, ship2.Position, this.Position, t.OffsetMS, flet.Fleet.Ships.Count())).Length();
                //                                                                       // var diff=v-ship.Position;
                //         worst = MathF.Min(diff, worst);
                //         //Projections.Add(RoboMath.ProjectClosest(this.HookComputer, ship.Position, this.Position, t.OffsetMS, flet.Fleet.Ships.Count()));
                //     }
                // }
                var willAdd = true;
                if (worst < 1000.0f)
                {
                    if (worst < 90.0f)
                    {
                        willAdd = false;
                    }
                    s += -1.0f / MathF.Max(worst / 90.0f, 1.0f) / ((float)t.Fleet.Ships.Count);

                    if (worst < 0.0f)
                    {
                        s += -1.0f / MathF.Max(worst / 90.0f, 1.0f);
                    }
                }
                if (willAdd)
                {
                    leftShips.Add(ship);
                }
            }
            float accumulator = 0f;

            var fleet = t.Fleet;

            if (fleet != null)
            {
                var oobX = (MathF.Abs(t.Fleet.Center.X) - this.WorldSize);
                var oobY = (MathF.Abs(t.Fleet.Center.Y) - this.WorldSize);

                if (oobX > -2000.0f)
                {
                    accumulator -= 1.0f / (MathF.Max(-oobX, 1.0f));///(MathF.Max(-oobX,1.0f));
                }
                if (oobY > -2000.0f)
                {
                    accumulator -= 1.0f / (MathF.Max(-oobY, 1.0f));///(MathF.Max(-oobY,1.0f));
                }
                if (oobX > -1000.0f)
                {
                    accumulator -= oobX + 1000.0f;
                }
                if (oobY > -1000.0f)
                {
                    accumulator -= oobY + 1000.0f;
                }
            }
            //accumulator=MathF.Max(accumulator,-1.0f);
            s            += accumulator;//*this.SensorFleets.MyFleet.Ships.Count;
            t.Fleet.Ships = leftShips;
            //    if(accumulator<-0.5){
            //        t.Fleet.Ships=new List<Ship>();
            //    }
            return(s + ((float)t.Fleet.Ships.Count - (float)this.SensorFleets.MyFleet.Ships.Count) / ((float)this.SensorFleets.MyFleet.Ships.Count), s - accumulator);
        }
Beispiel #2
0
        private void Behave()
        {
            Random r = new Random();

            //this.JumpMS=(int)(r.NextDouble()*100.0)+100;
            this.Steps = 8;
            // System.Console.WriteLine(this.Steps);
            if (this.SensorFleets.MyFleet != null)
            {
                var teamMode = this.HookComputer.Hook.TeamMode;
                this.DangerousBullets = this.SensorBullets.VisibleBullets
                                        .Where(b => b.Group.Owner != this.FleetID)
                                        .Where(b => !teamMode || b.Group.Color != this.Color)
                                        .ToList();
                var baseS = new TreeState(0, this.SensorFleets.MyFleet, this);
                (var ddd, var qq) = this.Score(baseS);
                baseS.Score       = ddd;
                if (qq < -0.5f)
                {
                    //Boost();
                }
                if (qq <= -1.0f)
                {
                    //Boost();
                    System.Console.WriteLine("OOOF: " + qq.ToString());
                }
                var searchPaths = new List <TreeState> {
                    baseS
                };
                var newSearchPaths = new List <TreeState>();

                for (var i = 0; i < this.Depth; i++)
                {
                    newSearchPaths = new List <TreeState>();
                    for (int j = 0; j < Math.Min(searchPaths.Count, MaxSearch); j++)
                    {
                        if (searchPaths[j].Fleet.Ships.Count > 0 && searchPaths[j].Children.Count < 1)
                        {
                            for (int k = 0; k < this.Steps; k++)
                            {
                                // if(searchPaths[j].Fleet.Ships.Count>0 && searchPaths[j].Children.Count<1){
                                var p = searchPaths[j].ProjectClone(JumpMS * (1 + i), ((float)k) * 360.0f / ((float)this.Steps), k >= this.Steps);
                                (var md, var xd) = this.Score(p);
                                p.Score          = md;
                                //if(p.Score>-1.0f){
                                newSearchPaths.Add(p);
                                //}
                            }
                        }
                        else
                        {
                            searchPaths.RemoveAt(j);
                            j--;
                        }
                    }
                    if (i == 0)
                    {
                        firstRow = newSearchPaths.ToList();
                    }

                    searchPaths = ((newSearchPaths.ToList()).OrderByDescending(p => p.Score + r.NextDouble() * 0.0f)).ToList();//.Take(i==0?Steps+1:MaxSearch).ToList();
                }
                var contexts = ContextBehaviors.Select(b => b.Behave(Steps)).ToList();
                (var finalRing, var angle, var boost) = ContextRingBlending.Blend(contexts, false);
                BlendedRing            = finalRing;
                (var bestp, var bestc) = baseS.bestChildScorePath();

                if (bestp.Last().Fleet.Ships.Count * 2 <= this.SensorFleets.MyFleet.Ships.Count && CanBoost)
                {
                    //Boost();
                    //System.Console.WriteLine("BOOST");
                }
                //Boost();
                //System.Console.WriteLine("SC: "+bestc+", Ships: "+bestp.Last().Fleet.Ships.Count);
                // System.Console.WriteLine(bestp.Select(x=>x.Angle).ToArray()[1]);

                Vector2 angleM = new Vector2(MathF.Cos(GameTime * 10.0f), MathF.Sin(GameTime * 10.0f));
                float   cangle = MathF.Atan2(angleM.Y, angleM.X);
                if (bestp.Count > 1)
                {
                    var bestD = bestp[1].Angle;                                       //bestp[1].Fleet.Center-this.SensorFleets.MyFleet.Center;
                    angleM = new Vector2(MathF.Cos(bestD), MathF.Sin(bestD)) * 20.0f; //+new Vector2(MathF.Cos(angle),MathF.Sin(angle))*1.0f;//-10.0f*this.SensorFleets.MyFleet.Center/this.SensorFleets.MyFleet.Center.Length();///((float)WorldSize);
                }


                // var Projections = DangerousBullets.Select(b => b.Position).ToList().Select(b=>(b-this.SensorFleets.MyFleet.Center).Length()).Concat(new List<float>{10000});

                if (bestp.Count > 1)
                {
                    SteerAngle(MathF.Atan2(angleM.Y, angleM.X));
                    PathV = bestp;
                    //System.Console.WriteLine(PathV.Count);
                }
            }
            else
            {
                //System.Console.WriteLine("NJJHDfbhjdsfgyhtdsgfhtyfgdsuygt");
            }
        }