/// <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))); }
// 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); }