/// <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))); }
/// <summary>Creates a Checkers move object from a given path.</summary> /// <param name="game">The Checkers game to create the movement to.</param> /// <param name="piece">The Checkers piece which will be moving.</param> /// <param name="path">The path to move along.</param> /// <returns>The new Checkers move object.</returns> internal static CheckersMove FromPath(CheckersGame game, CheckersPiece piece, Point[] path) { CheckersMove move = new CheckersMove(game, piece, true); foreach (Point p in path) { if (move.Move(p) == false) { return(null); } } return(move); }