public IEnumerable <Move> GetAvailableMoves(Owner owner = Owner.None, bool reverse = false) { bool cached = false; if (owner == Owner.None) { cached = _moves.ContainsKey(Owner.Player1) && _moves.ContainsKey(Owner.Player2); } else { cached = _moves.ContainsKey(owner); } if (!cached) { IEnumerable <Point> sourceSet; if (owner == Owner.Player1) { List <Move> results = new List <Move>(); foreach (Point p in PieceGrid.Amazon1Points) { if (reverse) { results.AddRange(PieceGrid.GetReverseMovesFromPoint(p, owner)); } else { results.AddRange(PieceGrid.GetMovesFromPoint(p)); } } _moves[owner] = results; } else if (owner == Owner.Player2) { List <Move> results = new List <Move>(); foreach (Point p in PieceGrid.Amazon2Points) { if (reverse) { results.AddRange(PieceGrid.GetReverseMovesFromPoint(p, owner)); } else { results.AddRange(PieceGrid.GetMovesFromPoint(p)); } } _moves[owner] = results; } else { List <Move> results1 = new List <Move>(); List <Move> results2 = new List <Move>(); sourceSet = PieceGrid.Amazon1Points.Union(PieceGrid.Amazon2Points); foreach (Point p in PieceGrid.Amazon1Points) { if (reverse) { results1.AddRange(PieceGrid.GetReverseMovesFromPoint(p, Owner.Player1)); } else { results1.AddRange(PieceGrid.GetMovesFromPoint(p)); } } _moves[Owner.Player1] = results1; foreach (Point p in PieceGrid.Amazon2Points) { if (reverse) { results2.AddRange(PieceGrid.GetReverseMovesFromPoint(p, Owner.Player2)); } else { results2.AddRange(PieceGrid.GetMovesFromPoint(p)); } } _moves[Owner.Player2] = results2; } } if (owner == Owner.None) { return(_moves[Owner.Player1].Union(_moves[Owner.Player2])); } else { return(_moves[owner]); } }