示例#1
0
        public CheckMovesResult CheckRule(CheckMovesResult result)
        {
            // no player figure is on the game field which means no player figure has movepoint score between 0 and up to 40
            var numberOfFiguresOnBoard = nvp_RuleHelper.CountPlayersOnBoard(result.PlayerColor, result.PlayerFigures);

            // at least on player figure is in the house
            var numberOfPlayerInTheHouse = nvp_RuleHelper.CountPlayersInHouse(result.PlayerColor, result.PlayerFigures);

            // general rule
            if (numberOfPlayerInTheHouse == 0 || result.DiceValue < 6)
            {
                return(_nextRule.CheckRule(result));
            }

            // get figure to move
            var pf = result.PlayerFigures
                     .Where(x => x.LocalPosition < 0 && x.Color == result.PlayerColor)
                     .OrderBy(x => x.Index)
                     .First();

            result.CanMove = true;
            result.AdditionalRollGranted = true;
            result.LastActiveRule        = "Must leave house";
            result.PossibleMoves.Add(new PlayerMove
            {
                Color     = result.PlayerColor,
                Index     = nvp_RuleHelper.GetNextFigureToLeaveHouse(result.PlayerColor, result.PlayerFigures).Index,
                DiceValue = 0
            });

            return(result);
        }
        public CheckMovesResult Move(CheckMovesResult movesInfo, int indexMoveToMake = 0)
        {
            if (!movesInfo.CanMove)
            {
                return(movesInfo);
            }

            var move = movesInfo.PossibleMoves[indexMoveToMake];

            var figure = playerFigures.Single(x =>
                                              x.Color == move.Color &&
                                              x.Index == move.Index);

            figure.Move(move.DiceValue);

            // check for killing other player
            var figuresOnWorldPosition = nvp_RuleHelper.GetFiguresOnWorldPosition(movesInfo.PlayerFigures, figure.WorldPosition)
                                         .Where(x => x.Color != figure.Color).ToList();

            if (figuresOnWorldPosition.Count > 0)
            {
                figuresOnWorldPosition[0].LocalPosition = -1;
                figuresOnWorldPosition[0].WorldPosition = -1;
            }


            return(movesInfo);
        }
    public CheckMovesResult CheckRule(PlayerColors playerColor, List <PlayerFigure> playerFigures, int diceValue)
    {
        CheckMovesResult result = null;

        // no player figure is on the game field which means no player figure has movepoint score between 0 and up to 40
        var numberOfFiguresOnBoard = nvp_RuleHelper.CountPlayersOnBoard(playerColor, playerFigures);

        // at least on player figure is in the house
        var numberOfPlayerInTheHouse = nvp_RuleHelper.CountPlayersInHouse(playerColor, playerFigures);

        // general rule
        if (numberOfPlayerInTheHouse == 0 || diceValue < 6)
        {
            return(_nextRule.CheckRule(playerColor, playerFigures, diceValue));
        }

        result = new CheckMovesResult(true, true, "nvp_Rule_6_all_in_house_class: move out");

        // get figure to move
        var pf = playerFigures.Single(x => x.Index == 0 && x.Color == playerColor);

        // enlist the move for display
        result.PossibleMoves = new List <PlayerMove>();
        var move = new PlayerMove();

        move.Color             = playerColor;
        move.Index             = nvp_RuleHelper.GetNextFigureToLeaveHouse(playerColor, playerFigures).Index;
        move.MovePoints        = 0;
        move.GameBoardLocation = pf.OffSet;
        result.PossibleMoves.Add(move);

        return(result);
    }
        public CheckMovesResult CheckRule(CheckMovesResult result)
        {
            if (!nvp_RuleHelper.IsLocalPositionAvailable(result.PlayerColor, result.PlayerFigures, 0))
            {
                if (nvp_RuleHelper.CanExitStart(result.PlayerColor, result.PlayerFigures, result.DiceValue))
                {
                    var pf = nvp_RuleHelper.GetPlayerFigureFromByLocalPosition(result.PlayerColor, result.PlayerFigures, 0);
                    result.CanMove        = true;
                    result.LastActiveRule = "Must Leave Start";

                    var pm = new PlayerMove
                    {
                        Color     = result.PlayerColor,
                        Index     = pf.Index,
                        DiceValue = result.DiceValue
                    };

                    result.PossibleMoves = new List <PlayerMove> {
                        pm
                    };
                    return(result);
                }
                else
                {
                    result.CanMove = false;
                    result.AdditionalRollGranted = false;
                    result.LastActiveRule        = "Must Leave Start";
                    return(result);
                }
            }
            else
            {
                return(_nextRule.CheckRule(result));
            }
        }
示例#5
0
    public CheckMovesResult CheckRule(PlayerColors playerColor, List <PlayerFigure> playerFigures, int diceNumber)
    {
        if (nvp_RuleHelper.IsFieldOccupiedByOwnFigure(playerColor, playerFigures, 0))
        {
            if (nvp_RuleHelper.CanExitStart(playerColor, playerFigures, diceNumber))
            {
                var pf     = nvp_RuleHelper.GetPlayerFigureOnField(playerColor, playerFigures, 0);
                var result = new CheckMovesResult(true, false, "");

                var pm = new PlayerMove();
                pm.Color      = playerColor;
                pm.Index      = pf.Index;
                pm.MovePoints = diceNumber;

                result.PossibleMoves = new List <PlayerMove>();
                result.PossibleMoves.Add(pm);
                return(result);
            }
            else
            {
                var result = new CheckMovesResult(false, false, "");
                return(result);
            }
        }
        else
        {
            return(_nextRule.CheckRule(playerColor, playerFigures, diceNumber));
        }
    }
 public CheckMovesResult CheckRule(CheckMovesResult result)
 {
     result.CanMove = false;
     result.AdditionalRollGranted = false;
     result.LastActiveRule        = "Rule Default.";
     return(result);
 }
        public CheckMovesResult CheckRule(CheckMovesResult result)
        {
            // get players on board
            var ownFigures = nvp_RuleHelper.GetFiguresOnBoardByColor(result.PlayerColor, result.PlayerFigures, result.DiceValue);

            ownFigures = ownFigures.Where(x => x.LocalPosition < 40).ToList();

            if (ownFigures.Count == 0)
            {
                return(_nextRule.CheckRule(result));
            }

            if (ownFigures.Count > 1)
            {
                var haveToKill = false;
                haveToKill |= CheckRuleForFigure(result, ownFigures[0]);
                haveToKill |= CheckRuleForFigure(result, ownFigures[1]);
                if (haveToKill)
                {
                    return(result);
                }
            }

            return(_nextRule.CheckRule(result));
        }
        public CheckMovesResult CheckRule(CheckMovesResult result)
        {
            // get players on board
            var playerFigures = nvp_RuleHelper.GetFiguresOnBoardByColor(result.PlayerColor, result.PlayerFigures, result.DiceValue);

            if (playerFigures.Count == 0)
            {
                return(_nextRule.CheckRule(result));
            }

            for (int i = 0, n = playerFigures.Count; i < n; i++)
            {
                var pf = playerFigures[i];
                if (pf.LocalPosition + result.DiceValue < 45)
                {
                    result.CanMove        = true;
                    result.LastActiveRule = "JustMove";

                    result.PossibleMoves.Add(new PlayerMove
                    {
                        Color     = result.PlayerColor,
                        DiceValue = result.DiceValue,
                        Index     = pf.Index
                    });
                }
            }

            result.PossibleMoves = result.PossibleMoves.OrderBy(x => x.Index).ToList();
            return(result);
        }
        public void test_rules_h4_b0_s0_d_g6_g6_g5_g5_g5()
        {
            /** roll sequence test
             * Setting inital position 4 player game
             * Player black rolls:
             * 6 - 6 - 5 - 5 - 5
             * Expected Result
             * A green figure should be on world position 10 = ((21 + 30) % 41) and
             * local position 21
             */

            CheckMovesResult result = null;
            var diceRolls           = new[] { "g6", "g6", "g5", "g5", "g5" };

            for (int i = 0, n = diceRolls.Length; i < n; i++)
            {
                result = CheckRules(diceRolls[i]);
                if (!result.CanMove)
                {
                    break;
                }
                result = _gameboard.Move(CheckRules(diceRolls[i]));
            }

            Assert.AreEqual(true, result.CanMove);
            Assert.AreEqual(false, result.AdditionalRollGranted);
            var pf = CheckWorldPosition((21 + 30) % 41);

            Assert.IsNotNull(pf);
            Assert.AreEqual(0, pf.Index);
            Assert.AreEqual(21, pf.LocalPosition);
            Assert.AreEqual(10, pf.WorldPosition);
            Assert.AreEqual(PlayerColors.green, pf.Color);
        }
 public CheckMovesResult CheckRule(CheckMovesResult result)
 {
     if (result.DiceValue == 6)
     {
         result.AdditionalRollGranted = true;
     }
     return(_nextRule.CheckRule(result));
 }
        // +++ public Methods +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        public CheckMovesResult CheckPossiblePlayerMoves(PlayerColors playerColor, int diceValue)
        {
            var defaultResult = new CheckMovesResult();

            defaultResult.PlayerColor   = playerColor;
            defaultResult.DiceValue     = diceValue;
            defaultResult.PlayerFigures = playerFigures;
            return(_ruleChain[0].CheckRule(defaultResult));
        }
示例#12
0
    void OnPlayerDiceRoll(PlayerDiceRoll diceRoll)
    {
        _lastCalculatedMoveResult = _gameLogic.CheckPossiblePlayerMoves(
            diceRoll.playerColor,
            diceRoll.diceValue
            );

        // invoke event
        OnPlayerMovesCalculated(_lastCalculatedMoveResult);
    }
 // +++ event handler ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 void OnPlayerMovesCalculate(CheckMovesResult result)
 {
     Clear();
     for (int i = 0, n = result.PossibleMoves.Count; i < n; i++)
     {
         _moveTexts[i].text = string.Format(
             "Player {0} can move Figur {1} for {2}"
             , result.PossibleMoves[i].Color
             , result.PossibleMoves[i].Index
             , result.PossibleMoves[i].DiceValue
             );
     }
 }
        public void test_rules_h4_b0_s0_d_rbyg6_rbyg6_rbyg2()
        {
            /** multiple player roll sequence test
             * Setting inital position 4 player game
             * each player rolls:
             * 6 - 6 - 2
             * Expected Result
             * A figure of each player should local position 8
             * world position red     : 8
             * world position black   : 18
             * world position yellow  : 28
             * world position green   : 38
             */

            CheckMovesResult result = null;
            var diceRolls           = new[] { "r6", "r6", "r2", "b6", "b6", "b2", "y6", "y6", "y2", "g6", "g6", "g2" };

            for (int i = 0, n = diceRolls.Length; i < n; i++)
            {
                result = CheckRules(diceRolls[i]);
                if (!result.CanMove)
                {
                    break;
                }
                result = _gameboard.Move(CheckRules(diceRolls[i]));
            }

            int numberOfRedFigures    = nvp_RuleHelper.CountPlayersOnBoard(PlayerColors.red, result.PlayerFigures);
            int numberOfGreenFigures  = nvp_RuleHelper.CountPlayersOnBoard(PlayerColors.green, result.PlayerFigures);
            int numberOfYellowFigures = nvp_RuleHelper.CountPlayersOnBoard(PlayerColors.yellow, result.PlayerFigures);
            int numberOfBlackFigures  = nvp_RuleHelper.CountPlayersOnBoard(PlayerColors.black, result.PlayerFigures);

            Assert.AreEqual(1, numberOfRedFigures);
            Assert.AreEqual(1, numberOfYellowFigures);
            Assert.AreEqual(1, numberOfGreenFigures);
            Assert.AreEqual(1, numberOfBlackFigures);

            var pf = nvp_RuleHelper.GetFigureOnWorldPosition(_gameboard.playerFigures, 8);

            Assert.AreEqual(PlayerColors.red, pf.Color);

            pf = nvp_RuleHelper.GetFigureOnWorldPosition(_gameboard.playerFigures, 18);
            Assert.AreEqual(PlayerColors.black, pf.Color);

            pf = nvp_RuleHelper.GetFigureOnWorldPosition(_gameboard.playerFigures, 28);
            Assert.AreEqual(PlayerColors.yellow, pf.Color);

            pf = nvp_RuleHelper.GetFigureOnWorldPosition(_gameboard.playerFigures, 38);
            Assert.AreEqual(PlayerColors.green, pf.Color);
        }
    private void OnPlayerMovesCalculated(CheckMovesResult result)
    {
        DeactivateButtons();

        if (result.CanMove)
        {
            Invoke("InvokeTurn", 0.1f);
            // if(result.PossibleMoves.Count > 1) {
            //  ActivateButtons(result.PossibleMoves.Count);
            // }
            // else{
            //  Invoke("InvokeTurn", 0.1f);
            // }
        }
    }
示例#16
0
        public CheckMovesResult Move(CheckMovesResult movesInfo, int indexMoveToMake = 0)
        {
            if (!movesInfo.CanMove)
            {
                return(movesInfo);
            }

            var move = movesInfo.PossibleMoves[indexMoveToMake];

            var figure = playerFigures.Single(x =>
                                              x.Color == move.Color &&
                                              x.Index == move.Index);

            figure.Move(move.DiceValue);
            return(movesInfo);
        }
        public void test_rules_h4_b0_s0_d_g6_g6_g6_g5_g6_g4_g4()
        {
            /** multiple figures of red player on board
             * Setting inital position 4 player game
             * red player rolls:
             * 6-6-6-5-6-4-4
             * Expected Result
             * world position red-0     : 6
             * world position red-1     : 5
             * world position red-2     : 8
             */

            CheckMovesResult result = null;
            var diceRolls           = new[] { "r6", "r6", "r6", "r5", "r6", "r4", "r4" };

            for (int i = 0, n = diceRolls.Length; i < n; i++)
            {
                result = CheckRules(diceRolls[i]);
                if (!result.CanMove)
                {
                    break;
                }
                result = result.PossibleMoves.Count == 1
                    ? _gameboard.Move(CheckRules(diceRolls[i]))
                    : _gameboard.Move(CheckRules(diceRolls[i]), 2);
            }

            // There should be 3 figures on board
            int numberOfGreenfigures = nvp_RuleHelper.CountPlayersOnBoard(PlayerColors.red, result.PlayerFigures);

            Assert.AreEqual(3, numberOfGreenfigures);

            // 3 move should be possible after the last roll
            Assert.AreEqual(true, result.CanMove);
            Assert.AreEqual(3, result.PossibleMoves.Count);

            // if we move the figure with the index 2 for the last roll
            //
            var pf = nvp_RuleHelper.GetFigureOnWorldPosition(_gameboard.playerFigures, 5);

            Assert.AreEqual(PlayerColors.red, pf.Color);
            pf = nvp_RuleHelper.GetFigureOnWorldPosition(_gameboard.playerFigures, 6);
            Assert.AreEqual(PlayerColors.red, pf.Color);
            pf = nvp_RuleHelper.GetFigureOnWorldPosition(_gameboard.playerFigures, 8);
            Assert.AreEqual(PlayerColors.red, pf.Color);
            Assert.AreEqual(2, pf.Index);
        }
        public void test_throwing_out_black_player()
        {
            var player_red_0   = nvp_RuleHelper.GetPlayerFigure(_gameboard.playerFigures, PlayerColors.red, 0);
            var player_black_0 = nvp_RuleHelper.GetPlayerFigure(_gameboard.playerFigures, PlayerColors.black, 0);

            // move black player to position
            CheckMovesResult result = null;
            var diceRolls           = new[] { "b6", "b1", "r6", "r6" };

            for (int i = 0, n = diceRolls.Length; i < n; i++)
            {
                result = CheckRules(diceRolls[i]);
                if (!result.CanMove)
                {
                    break;
                }
                result = result.PossibleMoves.Count == 1
                    ? _gameboard.Move(CheckRules(diceRolls[i]))
                    : _gameboard.Move(CheckRules(diceRolls[i]), 0);
            }

            Assert.AreEqual(1, player_black_0.LocalPosition);
            Assert.AreEqual(11, player_black_0.WorldPosition);
            Assert.AreEqual(6, player_red_0.LocalPosition);
            Assert.AreEqual(6, player_red_0.WorldPosition);

            diceRolls = new[] { "r5" };
            for (int i = 0, n = diceRolls.Length; i < n; i++)
            {
                result = CheckRules(diceRolls[i]);
                if (!result.CanMove)
                {
                    break;
                }
                result = result.PossibleMoves.Count == 1
                    ? _gameboard.Move(CheckRules(diceRolls[i]))
                    : _gameboard.Move(CheckRules(diceRolls[i]), 0);
            }

            Assert.AreEqual(-1, player_black_0.LocalPosition);
            Assert.AreEqual(-1, player_black_0.WorldPosition);
            Assert.AreEqual(11, player_red_0.LocalPosition);
            Assert.AreEqual(11, player_red_0.WorldPosition);
        }
        public CheckMovesResult CheckRule(CheckMovesResult result)
        {
            // no player figure is on the game field which means no player figure has movepoint score between 0 and up to 40
            var numberOfFiguresOnBoard = nvp_RuleHelper.CountPlayersOnBoard(result.PlayerColor, result.PlayerFigures);

            // at least on player figure is in the house
            var numberOfPlayerInTheHouse = nvp_RuleHelper.CountPlayersInHouse(result.PlayerColor, result.PlayerFigures);

            // general rule
            if (numberOfFiguresOnBoard > 0 || numberOfPlayerInTheHouse == 0)
            {
                return(_nextRule.CheckRule(result));
            }


            _numberOfTries++;
            if (_numberOfTries >= 3 && result.DiceValue < 6)
            {
                // used all free rolls
                result.LastActiveRule        = "nvp_Rule_40_Cant_leave_house_class";
                result.CanMove               = false;
                result.AdditionalRollGranted = false;
                _numberOfTries               = 0;
                return(result);
            }

            if (result.DiceValue == 6)
            {
                result.LastActiveRule        = "nvp_Rule_40_Cant_leave_house_class";
                result.CanMove               = true;
                result.AdditionalRollGranted = true;
                _numberOfTries               = 0;
                return(result);
            }
            else
            {
                result.CanMove = false;
                result.AdditionalRollGranted = true;
                result.LastActiveRule        = "nvp_Rule_40_Cant_leave_house_class";
                return(result);
            }
        }
        public void test_rule_must_kill_v0()
        {
            CheckMovesResult result = new CheckMovesResult {
                DiceValue = 2
            };

            var rf1 = new PlayerFigure(PlayerColors.red, 0, 1, 1, 0);
            var rf2 = new PlayerFigure(PlayerColors.red, 1, 2, 2, 0);
            var gf1 = new PlayerFigure(PlayerColors.green, 0, 13, 3, 10);

            result.PlayerFigures.AddRange(new[] { rf1, rf2, gf1 });

            var rule = new nvp_Rule_50_HaveToKill().SetNextRule(new nvp_RuleDefault_class());

            result = rule.CheckRule(result);
            Assert.AreEqual(true, result.CanMove);
            Assert.AreEqual(false, result.AdditionalRollGranted);
            Assert.AreEqual(1, result.PossibleMoves.Count);
            Assert.AreEqual(0, result.PossibleMoves[0].Index);
        }
        private bool CheckRuleForFigure(CheckMovesResult result, PlayerFigure figureToCheck)
        {
            int          worlPositionToCheck = (figureToCheck.WorldPosition + result.DiceValue) % 41;
            PlayerFigure playerFigureFound   = nvp_RuleHelper.GetFigureOnWorldPosition(result.PlayerFigures, worlPositionToCheck);

            if (playerFigureFound == null || (playerFigureFound != null && playerFigureFound.Color == result.PlayerColor))
            {
                return(false);
            }

            result.CanMove        = true;
            result.LastActiveRule = "nvp_Rule_50_HaveToKill";
            result.PossibleMoves.Add(new PlayerMove
            {
                Color     = result.PlayerColor,
                DiceValue = result.DiceValue,
                Index     = figureToCheck.Index
            });

            return(true);
        }
    public CheckMovesResult CheckRule(PlayerColors playerColor, List <PlayerFigure> playerFigures, int diceNumber)
    {
        // no player figure is on the game field which means no player figure has movepoint score between 0 and up to 40
        var numberOfFiguresOnBoard = nvp_RuleHelper.CountPlayersOnBoard(playerColor, playerFigures);

        // at least on player figure is in the house
        var numberOfPlayerInTheHouse = nvp_RuleHelper.CountPlayersInHouse(playerColor, playerFigures);

        // general rule
        if (numberOfFiguresOnBoard > 0 || numberOfPlayerInTheHouse == 0)
        {
            return(_nextRule.CheckRule(playerColor, playerFigures, diceNumber));
        }

        CheckMovesResult result = null;

        _numberOfTries++;
        if (_numberOfTries >= 3 && diceNumber < 6)
        {
            // used all free rolls
            result         = new CheckMovesResult(false, false, "nvp_Rule_5to1_all_in_house_class");
            _numberOfTries = 0;
            return(result);
        }

        if (diceNumber == 6)
        {
            result         = new CheckMovesResult(true, true, "nvp_Rule_5to1_all_in_house_class");
            _numberOfTries = 0;
            return(result);
        }
        else
        {
            result = new CheckMovesResult(false, true, "nvp_Rule_5to1_all_in_house_class");
            return(result);
        }
    }
 void OnPlayerMovesCalculated(CheckMovesResult result)
 {
     _lastCalculatedMoveResult = result;
 }
示例#24
0
        public CheckMovesResult CheckRule(PlayerColors playerColor, List <PlayerFigure> playerFigures, int diceNumber)
        {
            var result = new CheckMovesResult(false, false, "End of rule chain reached.");

            return(result);
        }