public override ICARule Choose(Random random, IHazGame game, List <Point> nPoints)
        {
            ICARule rule;
            Dictionary <ICARule, int> localRules = nPoints.Select(p => game.RulePoints.TryGetValue(p, out ICARule r) ? r : RuleFactory.DefaultRule)
                                                   .GroupBy(r => r)
                                                   .ToDictionary(g => g.Key, g => g.Count());

            localRules.Remove(RuleFactory.DefaultRule);
            if (!localRules.Any())
            {
                return(game.AllRules[random.Next(0, game.AllRules.Count - 1)]);
            }
            else if (localRules.Count == 1)
            {
                return(localRules.First().Key);
            }

            List <ICARule> choices = localRules.Where(c => c.Value == localRules.Max(k => k.Value)).Select(r => r.Key).ToList();

            if (choices.Count == 1)
            {
                rule = choices.First();
            }
            else
            {
                rule = choices[random.Next(0, choices.Count - 1)];
            }
            return(rule);
        }
Esempio n. 2
0
        public override ICARule Choose(Random random, IHazGame game, List <Point> nPoints)
        {
            ICARule rule;
            Dictionary <ICARule, int> localRules = nPoints.Select(p => game.RulePoints.TryGetValue(p, out ICARule r) ? r : RuleFactory.DefaultRule)
                                                   .GroupBy(r => r)
                                                   .ToDictionary(g => g.Key, g => g.Count());

            localRules.Remove(RuleFactory.DefaultRule);
            if (!localRules.Any())
            {
                return(game.AllRules[0]);
            }
            else if (localRules.Count == 1)
            {
                return(localRules.First().Key);
            }


            int            ruleInfluenceMinRank = localRules.Min(k => _ruleInfluenceValues[RulesRankDictionary[k.Key], k.Value - 1]);
            List <ICARule> choices = localRules.Where(k => _ruleInfluenceValues[RulesRankDictionary[k.Key], k.Value - 1] == ruleInfluenceMinRank)
                                     .Select(r => r.Key)
                                     .ToList();

            if (choices.Count == 1)
            {
                rule = choices[0];
            }
            else
            {
                rule = choices[random.Next(0, choices.Count - 1)];
            }
            return(rule);
        }
Esempio n. 3
0
 public abstract ICARule Choose(Random random, IHazGame game, List <Point> nPoints);
Esempio n. 4
0
        public override ICARule Choose(Random random, IHazGame game, List <Point> nPoints)
        {
            Dictionary <ICARule, int> localRules = nPoints.Select(p => game.RulePoints.TryGetValue(p, out ICARule r) ? r : RuleFactory.DefaultRule)
                                                   .GroupBy(r => r)
                                                   .ToDictionary(g => g.Key, g => g.Count());

            localRules.Remove(RuleFactory.DefaultRule);
            if (!localRules.Any())
            {
                return(game.AllRules[0]);
            }
            else if (localRules.Count == 1)
            {
                return(localRules.First().Key);
            }

            // Neutral
            int            ruleInfluenceMinRank = localRules.Min(k => _ruleInfluenceValues[RulesRankDictionary[k.Key], k.Value - 1]);
            List <ICARule> choices = localRules.Where(k => _ruleInfluenceValues[RulesRankDictionary[k.Key], k.Value - 1] == ruleInfluenceMinRank)
                                     .Select(r => r.Key)
                                     .ToList();

            if (choices.Count == 1)
            {
                return(choices[0]);
            }
            else
            {
                ICARule        air   = RuleElements.FirstOrDefault(kvp => kvp.Value.Air && kvp.Value.ElementCount == 1).Key;
                ICARule        earth = RuleElements.FirstOrDefault(kvp => kvp.Value.Earth && kvp.Value.ElementCount == 1).Key;
                ICARule        fire  = RuleElements.FirstOrDefault(kvp => kvp.Value.Fire && kvp.Value.ElementCount == 1).Key;
                ICARule        water = RuleElements.FirstOrDefault(kvp => kvp.Value.Water && kvp.Value.ElementCount == 1).Key;
                ElementalCombo ec    = new ElementalCombo(localRules.SelectMany(kvp => RuleElements[kvp.Key].Elements).ToArray());
                switch (ec.ElementCount)
                {
                case 1:
                    throw new Exception("Not possible");

                case 2:
                    if (ec.Air && ec.Fire)
                    {
                        return(RuleFactory.GetStrengthenRule(air, fire));
                    }
                    if (ec.Earth && ec.Water)
                    {
                        return(RuleFactory.GetStrengthenRule(earth, water));
                    }
                    if (ec.Air && ec.Earth)
                    {
                        return(RuleFactory.GetWeakenRule(air, earth));
                    }
                    if (ec.Fire && ec.Water)
                    {
                        return(RuleFactory.GetWeakenRule(fire, water));
                    }
                    // others are Neutral
                    break;

                case 3:
                    if (ec.Air && ec.Fire && ec.Water)
                    {
                        return(air);
                    }
                    if (ec.Earth && ec.Fire && ec.Water)
                    {
                        return(earth);
                    }
                    if (ec.Air && ec.Earth && ec.Water)
                    {
                        return(water);
                    }
                    if (ec.Air && ec.Earth && ec.Fire)
                    {
                        return(fire);
                    }
                    break;

                case 4:
                    // pick something
                    break;

                default:
                    throw new Exception("too many elements.");
                }
            }

            return(choices[random.Next(0, choices.Count - 1)]);
        }