private void AddListener(Toggle decisionToggle, HandDecision decision) { decisionToggle.onValueChanged.AddListener(on => { if (on) { StartCoroutine(RoundRoutine(decision)); } }); }
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); }
public GameResult GetRoundResult(HandDecision playerDecision, HandDecision opponentDecision) { if (playerDecision == opponentDecision) { return(GameResult.Draw); } if (GetWinDecision(playerDecision) == opponentDecision) { return(GameResult.PlayerLose); } return(GameResult.PlayerWins); }
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); }
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()); } }
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()); } }
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); }