protected internal override IEnumerable<IMove> GetStrategyAvailableMoves(IBoard board, ITurn turn, IGameRuleStrategyContext context)
        {
            if (this.NeedToMovePiece(board, turn.Player))
                yield break;

            var playerName = turn.Player;
            var dice = this.GetAvailableDice(turn.Dice).OrderByDescending(x => x.Value).ToList();
            var firstPiece = false;
            for (var i = (board.Lanes.Count * 3) / 4; i < board.Lanes.Count; i++)
            {
                var lane = board.Lanes[i];
                if (lane.Count == 0 || lane[0].Player != playerName)
                    continue;

                foreach (var die in dice)
                {
                    if (i + die.Value == board.Lanes.Count ||
                        (i + die.Value > board.Lanes.Count && !firstPiece))
                    {
                        yield return new DefaultMove(board.Lanes[i], i, die);
                        firstPiece = true;
                    }
                }

                firstPiece = true;
            }
        }
        protected override bool CanStrategyMovePiece(IPlayer player, IBoard board, IMove move, IGameRuleStrategyContext context)
        {
            if (board.Bar.Any(x => x.Player == player.Name))
            {
                context.IsDone = true;
                return this.IsMoveValid(board, move.Die.Value, player.Name);
            }

            return false;
        }
 protected internal override IEnumerable<IMove> GetStrategyAvailableMoves(IBoard board, ITurn turn, IGameRuleStrategyContext context)
 {
     if (board.Bar.Any(x => x.Player == turn.Player))
     {
         foreach (var die in this.GetAvailableDice(turn.Dice))
         {
             if (this.IsMoveValid(board, die.Value, turn.Player))
             {
                 yield return new DefaultMove(board.Bar, -1, die);
             }
         }
         context.IsDone = true;
     }
 }
 protected override bool CanStrategyMovePiece(IPlayer player, IBoard board, IMove move, IGameRuleStrategyContext context)
 {
     var targetIndex = move.LaneIndex + move.Die.Value;
     if (targetIndex < board.Lanes.Count || this.NeedToMovePiece(board, player.Name))
         return false;
     else if (targetIndex == board.Lanes.Count)
         return true;
     else
     {
         for (var i = (board.Lanes.Count * 3) / 4; i < move.LaneIndex; i++)
         {
             var lane = board.Lanes[i];
             if (lane.Count > 0 && lane[0].Player == player.Name)
                 return false;
         }
         return true;
     }
 }
        protected internal override IEnumerable<IMove> GetStrategyAvailableMoves(IBoard board, ITurn turn, IGameRuleStrategyContext context)
        {
            var playerName = turn.Player;
            var dice = this.GetAvailableDice(turn.Dice).ToList();
            for (var i = 0; i < board.Lanes.Count; i++)
            {
                var lane = board.Lanes[i];
                if (lane.Count == 0 || lane[0].Player != playerName)
                    continue;

                foreach (var die in dice)
                {
                    if (this.IsMoveValid(board, i, die.Value, playerName))
                    {
                        yield return new DefaultMove(lane, i, die);
                    }
                }
            }
        }
 protected abstract bool CanStrategyMovePiece(IPlayer player, IBoard board, IMove move, IGameRuleStrategyContext context);
 protected internal abstract IEnumerable<IMove> GetStrategyAvailableMoves(IBoard board, ITurn turn, IGameRuleStrategyContext context);
 protected override bool CanStrategyMovePiece(IPlayer player, IBoard board, IMove move, IGameRuleStrategyContext context)
 {
     return this.IsMoveValid(board, move.LaneIndex, move.Die.Value, player.Name);
 }
 private IList<IGameMove> CallGetStrategyValidMoves(GameRuleStrategyBase strategy, IGameBoard board, ITurn turn, IGameRuleStrategyContext context)
 {
     return strategy.GetStrategyAvailableMoves(board, turn, context)
         .Cast<IGameMove>()
         .ToList();
 }