Example #1
0
        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]);
            }
        }