/// <summary> /// Znajdź najlepszą strategię spośród podanych komórek względem centralnej. /// W przypadku remisu punktów wybierana jest centralna (o ile ma najwięcej punktów), następnie priorytety maleją zgodnie z ruchem wskazówek zegara. /// </summary> /// <param name="c">Komórka centralna</param> /// <param name="cellList">Sąsiedzi</param> /// <returns>Najlepsza strategia</returns> public static IStrategy GetBest(Cell c, IEnumerable<Cell> cellList) { var enumerable = cellList as Cell[] ?? cellList.ToArray(); var max = enumerable.Max(y => y.Points); if (c.Points == max) return c.Strategy; if (c.GetNeighbours().All(x => x.Strategy == c.Strategy)) return c.Strategy; var best = enumerable.Where(x => x.Points == enumerable.Max(y => y.Points)).Select(x => x.Strategy).Distinct(); return best.First(); }
/// <summary> /// Konstruktor /// </summary> /// <param name="c1">Komórka c1</param> /// <param name="c2">Przeciwnik komórki c1</param> public Skirmish(Cell c1, Cell c2) { _cells = new Tuple<Cell, Cell>(c1, c2); _story = new List<Tuple<bool, bool>>(); }
/// <summary> /// Implementacja podejmowania decyzji przez strategię /// </summary> /// <param name="parent">Komórka decydująca</param> /// <param name="opponent">Komórka, przeciw której podejmowana jest decyzja</param> /// <returns>True jeśli zdrada, false w przeciwnym przypadku</returns> public bool Decide(Cell parent, Cell opponent) { var decs = (from neighbour in parent.GetNeighbours() let skirmish = SPD.Singleton.GetSkirmish(parent, neighbour) let last = skirmish != null ? skirmish.Last : null let decision = last != null && (last.Item1.Item1 == parent ? last.Item2.Item2 : last.Item1.Item2) select decision); var res = decs.Count(x => x == true) >= Treshold; return res; }
/// <summary> /// Implementacja podejmowania decyzji przez komórkę /// </summary> /// <param name="opponent">Komórka będąca przeciwnikiem</param> /// <returns>True jeśli zdradza, false w przeciwnym wypadku</returns> public bool Decide(Cell opponent) { return Strategy.Decide(this, opponent); }
private void Decompose(Cell cell, Tuple<Tuple<Cell, bool>, Tuple<Cell, bool>> last, out bool myDecision, out bool opponentsDecision) { if (last.Item1.Item1 == cell) { myDecision = last.Item1.Item2; opponentsDecision = last.Item2.Item2; } else if (last.Item2.Item1 == cell) { myDecision = last.Item2.Item2; opponentsDecision = last.Item1.Item2; } else throw new ArgumentException(); }