public override bool Equals(Scenario x, Scenario y) { return (x.PlayerATotal == y.PlayerATotal) && (x.PlayerBTotal == y.PlayerBTotal) && (x.InvalidChoices.SetEquals(y.InvalidChoices)); }
static bool recursiveCanPlayerAWin(Scenario scenario) { if(scenario.PlayerAHasWinningChoice()) return true; for(int i = 0; i <= maxChoice; i++) { if(scenario.IsInvalidChoice(i)) continue; scenario.PlayerAChoose(i); if(scenario.PlayerBHasWinningChoice()) return false; for(int j = 0; j <= maxChoice; j++) { if(scenario.IsInvalidChoice(j)) continue; Scenario branch = scenario.Clone(); branch.PlayerBChoose(j); if(ScenarioCache.HasDetermined(branch)) scenario.PlayerAHasWinningStrategy |= ScenarioCache.GetOutcome(branch); else scenario.PlayerAHasWinningStrategy |= WinComputer.recursiveCanPlayerAWin(branch); } } ScenarioCache.Store(scenario); return scenario.PlayerAHasWinningStrategy; }
static bool HasDetermined(Scenario s) { return ScenarioCache.completed.ContainsKey(s); }
static bool Store(Scenario s) { if(!ScenarioCache.completed.ContainsKey(s)) ScenarioCache.completed.Add(s, s.PlayerAHasWinningStrategy); }
static bool GetOutcome(Scenario s) { return ScenarioCache.completed[s]; }