/// <summary>Returns a list of legal moves from all pieces this turn.</summary>
        /// <param name="optionalJumping">Overrides the game's OptionalJumping parameter for the enumeration.</param>
        /// <returns>A list of legal moves.</returns>
        public CheckersMove[] EnumLegalMoves(bool optionalJumping)
        {
            if ((!isPlaying) && (winner == 0))
            {
                throw new InvalidOperationException("Operation requires game to be playing.");
            }
            Stack     incompleteMoves = new Stack();
            ArrayList moves           = new ArrayList();

            foreach (CheckersPiece piece in EnumMovablePieces(optionalJumping))
            {
                incompleteMoves.Push(BeginMove(piece));
            }
            while (incompleteMoves.Count > 0)
            {
                CheckersMove move = (CheckersMove)incompleteMoves.Pop();
                foreach (Point location in move.EnumMoves(optionalJumping))
                {
                    CheckersMove nextMove = move.Clone();
                    if (!nextMove.Move(location))
                    {
                        continue;
                    }
                    if (nextMove.CanMove)
                    {
                        incompleteMoves.Push(nextMove);
                    }
                    if (!nextMove.MustMove)
                    {
                        moves.Add(nextMove);
                    }
                }
            }
            return((CheckersMove[])moves.ToArray(typeof(CheckersMove)));
        }
示例#2
0
        // Métodos internos
        #region Internos

        /// <summary>Cria um movimento a partir do caminho passado</summary>
        /// <param name="game">Jogo para o qual será criado o movimento</param>
        /// <param name="piece">A peça que será movida</param>
        /// <param name="path">O caminho pelo qual a peça será movida</param>
        /// <returns>O movimento resultante</returns>
        internal static CheckersMove FromPath(CheckersGame game, CheckersPiece piece, Point[] path)
        {
            // Cria um novo movimento
            CheckersMove move = new CheckersMove(game, piece, true);

            // Para cada casa no caminho passado
            foreach (Point p in path)
            {
                // Se não conseguiu mover a peça
                if (move.Move(p) == false)
                {
                    // Retorna null
                    return(null);
                }
            }

            // Se moveu a peça por todas localizações, retorna o movimento
            return(move);
        }