Example #1
0
 private void AddListener(Toggle decisionToggle, HandDecision decision)
 {
     decisionToggle.onValueChanged.AddListener(on =>
     {
         if (on)
         {
             StartCoroutine(RoundRoutine(decision));
         }
     });
 }
Example #2
0
        public HandDecision MakeOpponentDecision(
            HandDecision decision,
            float unhonestCoef,
            int playerScore,
            int opponentScore)
        {
            if (Mathf.Approximately(unhonestCoef, 1f))
            {
                return(GetWinDecision(decision));
            }
            if (Mathf.Approximately(unhonestCoef, 0f))
            {
                return(GetLoseDecision(decision));
            }

            float current;

            if (playerScore != 0) // защита от деления на ноль
            {
                current = opponentScore / (float)playerScore;
            }
            else
            {
                current = 1 - unhonestCoef;
            }

            if (current < unhonestCoef) // нужно победить
            {
                // ничья обеспечивает более медленное приближение к целевому значению
                float maybeCurrent = (opponentScore + 1) / (float)(playerScore + 1);

                if (maybeCurrent < unhonestCoef)
                {
                    // но если в результате мы не достигаем unhonestCoef, то двигаемся победой
                    return(GetWinDecision(decision));
                }
                return(decision);       // двигаемся ничьей
            }
            if (current > unhonestCoef) // нужно програть
            {
                //return GetOpponentDecisionToLose(decision);
                // ничья обеспечивает более медленное приближение к целевому значению
                float maybeCurrent = (opponentScore + 1) / (float)(playerScore + 1);

                if (maybeCurrent > unhonestCoef)
                {
                    // но если в результате мы не достигаем unhonestCoef, то двигаемся поражением
                    return(GetLoseDecision(decision));
                }
                return(decision); // двигаемся ничьей
            }
            return(decision);
        }
Example #3
0
        public GameResult GetRoundResult(HandDecision playerDecision, HandDecision opponentDecision)
        {
            if (playerDecision == opponentDecision)
            {
                return(GameResult.Draw);
            }

            if (GetWinDecision(playerDecision) == opponentDecision)
            {
                return(GameResult.PlayerLose);
            }

            return(GameResult.PlayerWins);
        }
Example #4
0
        private IEnumerator ShowOpponentDecision(HandDecision opponentDecision)
        {
            opponentDecisionText.text = ".";

            yield return(new WaitForSeconds(ANIMATION_DURATION));

            opponentDecisionText.text = "..";

            yield return(new WaitForSeconds(ANIMATION_DURATION));

            opponentDecisionText.text = "...";

            yield return(new WaitForSeconds(ANIMATION_DURATION));

            opponentDecisionText.text = Localization.Localize(opponentDecision);
        }
Example #5
0
        private HandDecision GetWinDecision(HandDecision playerDecision)
        {
            switch (playerDecision)
            {
            case HandDecision.Paper:
                return(HandDecision.Scissors);

            case HandDecision.Scissors:
                return(HandDecision.Stone);

            case HandDecision.Stone:
                return(HandDecision.Paper);

            default:
                throw new NotImplementedException(playerDecision.ToString());
            }
        }
Example #6
0
        public static string Localize(HandDecision handDecision)
        {
            switch (handDecision)
            {
            case HandDecision.Paper:
                return("paper");

            case HandDecision.Scissors:
                return("scissors");

            case HandDecision.Stone:
                return("stone");

            default:
                AssertExt.Fail("value not localized: " + handDecision);
                return(handDecision.ToString());
            }
        }
Example #7
0
        private IEnumerator RoundRoutine(HandDecision playerDecision)
        {
            buttonsLayout.SetInteractable(false);

            HandDecision opponentDecision;

            if (honestToggle.isOn)
            {
                opponentDecision = logic.MakeOpponentDecision();
            }
            else
            {
                opponentDecision = logic.MakeOpponentDecision(
                    playerDecision,
                    unhonestCoefSlider.value,
                    playerScore,
                    opponentScore);
            }

            yield return(ShowOpponentDecision(opponentDecision));

            GameResult roundResult = logic.GetRoundResult(playerDecision, opponentDecision);

            yield return(ShowRoundResult(roundResult));

            UpdateScore(roundResult);

            // TODO show user some notification like "press to continue"
            yield return(new WaitWhile(() => Input.GetMouseButtonDown(0) == false));

            HideRoundResult();
            // TODO localization
            opponentDecisionText.text = "ваш ход";
            buttonsLayout.SetAllTogglesOff();
            buttonsLayout.SetInteractable(true);
        }