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