コード例 #1
0
 public CombatSimulationActor(CombatSimulation sim, char faction, int numInFaction, int remainingHealth, int attackPower, int initialX, int initialY)
 {
     this.Id              = faction.ToString() + numInFaction;
     this.Sim             = sim;
     this.Faction         = faction;
     this.RemainingHealth = remainingHealth;
     this.AttackPower     = attackPower;
     this.X = initialX;
     this.Y = initialY;
 }
コード例 #2
0
        public static bool RequestPathFromTile(CombatSimulation sim, CombatSimulationTile startTile, CombatSimulationTile targetTile, List <CombatSimulationTile> bestPath)
        {
            // Clear our initial state
            _costs.Clear();
            _frontier.Clear();
            _pathInProgress.Clear();
            _scratch.Clear();
            bestPath.Clear();

            _frontier.Add(startTile);
            _costs[startTile]          = 0;
            _pathInProgress[startTile] = null;

            do
            {
                _frontier.Sort(delegate(CombatSimulationTile tA, CombatSimulationTile tB)
                {
                    return((_costs[tA] + Distance(tA, targetTile)).CompareTo(_costs[tB] + Distance(tB, targetTile)));

                    //if (distCompare != 0)
                    //{
                    //  return distCompare;
                    //}

                    return(tA.TileIndex.CompareTo(tB.TileIndex));
                });

                CombatSimulationTile currentTile = _frontier[0];
                if (currentTile == targetTile)
                {
                    break;
                }
                _frontier.RemoveAt(0);

                sim.GetUnoccupiedTilesNearTile(currentTile, _scratch);
                foreach (var neighbor in _scratch)
                {
                    int navCost = 0;
                    _costs.TryGetValue(currentTile, out navCost);
                    navCost++;

                    int knownCost = 0;
                    if (!_costs.TryGetValue(neighbor, out knownCost))
                    {
                        knownCost = Int32.MaxValue;
                    }

                    if (navCost < knownCost)
                    {
                        _costs[neighbor]          = navCost;
                        _pathInProgress[neighbor] = currentTile;
                        _frontier.Add(neighbor);
                    }
                }
            } while (_frontier.Count > 0);

            if (_pathInProgress.ContainsKey(targetTile))
            {
                var next = targetTile;
                while (next != startTile)
                {
                    bestPath.Add(next);
                    next = _pathInProgress[next];
                }
                bestPath.Reverse();
                return(true);
            }


            return(false);
        }