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); } }
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++; } }