예제 #1
0
        public NavPackage GetClosestEnemy2(List <Player> players)
        {
            List <Player>             _ret           = new List <Player>();
            IDictionary <string, int> enemyDistances = new Dictionary <string, int>();
            List <NavPackage>         navPackList    = new List <NavPackage>();

            this.nav.Map = (this.parent as Day15GameBoard).CurrentBoard;

            foreach (Player e in players.Where(w => w.side == this.enemy))
            {
                this.nav.Start  = new AStarNode(this.Location);
                this.nav.Finish = new AStarNode(e.Location);
                this.nav.InitNodes();
                //int _distance = this.nav.GetDistance();
                //if (_distance > 0)
                //    enemyDistances.Add(new KeyValuePair<string, int> (e.ID, _distance));
                List <Point> path = this.nav.GetDistance();
                if (path.Count > 0)
                {
                    NavPackage np = new NavPackage(path.Count(), path.DefaultIfEmpty(this.Location).FirstOrDefault(), e);
                    navPackList.Add(np);
                }
            }

            //string id = enemyDistances.OrderBy(kvp => kvp.Value).FirstOrDefault().Key;

            //return players.Where(w => w.ID == id).FirstOrDefault();
            if (navPackList.Count > 0)
            {
                return(PickFromList(navPackList));
            }
            else
            {
                return(null);
            }
        }
예제 #2
0
        void DoWork(ref BackgroundWorker bg)
        {
            //Thread.Sleep(500);
            Queue <Player> turns = new Queue <Player>(this.players.OrderBy(o => o.Location.Y).ThenBy(o => o.Location.X));
            Player         currPlayer;
            Player         currEnemy;

            if (turns.Count == 1)
            {
                complete = true;
            }

            while (turns.Count > 0 && !complete)
            {
                currPlayer = turns.Dequeue();

                if (players.Where(w => w.ID == currPlayer.ID).Count() < 1)
                {
                    continue;
                }

                if ((currEnemy = currPlayer.CanAttack(this.players)) != null)
                {
                    // Attack if opponent within range at beginning of turn.
                    currEnemy.HP -= currPlayer.AttackPower;
                    if (currEnemy.HP <= 0)
                    {
                        currentBoard[currEnemy.Location.X, currEnemy.Location.Y] = '.';
                        players.Remove(currEnemy);
                    }
                }

                else
                {
                    // Move if no opponent within range at beginning of turn.
                    NavPackage targetEnemy = currPlayer.GetClosestEnemy2(this.players);

                    if (targetEnemy != null)
                    {
                        //this.nav.Map = currentBoard;
                        //this.nav.Start = new AStarNode(currPlayer.Location);
                        //this.nav.Finish = new AStarNode(targetEnemy.Location);
                        //this.nav.InitNodes();
                        //Point p = this.nav.Step();
                        Point p = targetEnemy.NextMove;
                        if (IsFree(p))
                        {
                            this.CurrentBoard[currPlayer.Location.X, currPlayer.Location.Y] = '.';
                            currPlayer.Location = p;
                            this.CurrentBoard[currPlayer.Location.X, currPlayer.Location.Y] = currPlayer.Side;
                            SetupBoardVisual(ref bg);
                            //Thread.Sleep(this.Delay);
                        }



                        if ((currEnemy = currPlayer.CanAttack(this.players)) != null)
                        {
                            // Attack after move if an opponent is now available.
                            currEnemy.HP -= currPlayer.AttackPower;
                            if (currEnemy.HP <= 0)
                            {
                                currentBoard[currEnemy.Location.X, currEnemy.Location.Y] = '.';
                                players.Remove(currEnemy);
                            }
                        }
                    }
                }

                this.Delay = players.Count();
                SetupBoardVisual(ref bg);
                Thread.Sleep(this.Delay);
            }

            complete = CheckComplete();
            if (!complete)
            {
                this.Turn++;
            }
        }