Jump to content

Unity: программа угадывает числа (угадыватель)


Recommended Posts

Скрипт для Unity, который использует трюк числами, когда за 5 вопросов, компьютер угадывает, какое число в пределах 1-30 загадал игрок. Можно интегрировать в любой проект, достаточно вынести префаб на сцену.

 

 

Скачать https://yadi.sk/d/Y47u1vzk3Ynr6t 280 кб

 

Код скрипта с# для Unity3d (для работы необходим префаб по ссылке выше):

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // для работы с текстом

/// <summary> УГАДЫВАНИЕ ЗАГАДАННОГО ИГРОКОМ ЧИСЛА с помощью 5 карточек </summary>
public class GuessNumber : MonoBehaviour
{
    // Алгоритм угадывания - пользователю показывают 5 карточек с разными числами, если на карточке есть загаданное число, он
    // нажимает согласие, если нет, то отрицание. Числа на карточках подобраны так, что зная, на какой из карточек есть, а на
    // какой нет загаданного числа, можно вычислить, какое число загадно.

    [Tooltip("Какой символ будет заполнять полосу загрузки?")]
    public string loadingSymbol = "00 ";

    [Tooltip("Продолжительность эмуляции загрузки между панелями (секунды)")]
    public float loadingDelay = 1;

    [Tooltip("Количество делений у полосы загрузки")]
    public float countDivisionLoadBar = 10;

    // заглавная панель с предложением загадать число
    public GameObject panelChange;
    // массив панелей (5 шт) с опросом есть ли на экране загаданное число
    public GameObject[] panelsGuess;
    // панель выводящая, какое число загадано
    public GameObject panelResult;
    // текст сообщения с информацией о загаданном числе
    public Text textResult;
    // текст для симуляции процесса загрузки
    public Text loadingBar;

    // алгоритм программы сюда записывает загаданное пользователем число
    int guessNubmer = 0;
    // если на панели есть загаданное число, то в ButtonStart сюда прибавляет соответствующее значение (для каждой панели разное)
    // если нет (когда пользователь нажимает кнопку отрицания), то ничего не добавляется

    public void ButtonStart()
    {
        panelChange.SetActive(false); // выкл панель выбора числа
        panelsGuess[0].SetActive(true); // выкл первую угадывательную панель
    }

    // КНОПКА ДА, когда пользователь подтверждает, что на панели есть загаданное число
    // (вызывается кнопкой на экране, кнопка передает в качестве параметра номер текущей панели)
    public void ButtonYes(int numberCurrentPanel)
    {
        // если это панель под номером таким-то то добавляем к загаданному числу соответствующее значение
        // далее переходим к другой панели через корутину с задержкой
        if (numberCurrentPanel == 0) { guessNubmer += 1; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); }
        if (numberCurrentPanel == 1) { guessNubmer += 2; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); }
        if (numberCurrentPanel == 2) { guessNubmer += 4; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); }
        if (numberCurrentPanel == 3) { guessNubmer += 8; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); }
        if (numberCurrentPanel == 4) { guessNubmer += 16; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); }
    }

    // КНОПКА НЕТ, когда пользователь не видит своего числа на панели
    public void ButtonNo(int numberCurrentPanel)
    {
        StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); // переходим к следующей панели с задержкой
    }

    // переход к следующей панели и задержка, чтобы видна была анимация эмуляции загрузки
    protected IEnumerator GoToNextPanelDelay(int numberCurrentPanel)
    {
        // закрывает текущую панель
        panelsGuess[numberCurrentPanel].SetActive(false); 
        // запускаем "анимацию" эмуляции загрузки
        StartCoroutine(LoadingBar());
        // задержка в секундах, чтобы видеть анимацию
        yield return new WaitForSeconds(loadingDelay);
        // если активировать нужно не 5 панель (5-я результирующая), то активируем (нумерация с 0)
        if (numberCurrentPanel != 4) panelsGuess[numberCurrentPanel + 1].SetActive(true);
        // если это пятая панель, то выводим результат
        if (numberCurrentPanel == 4) Result();
        // завершаем корутину
        yield break;
    }

    // "анимация" полосы загрузки
    protected IEnumerator LoadingBar()
    {
        loadingBar.text = ""; // ставим в ноль полосу загрузки (очищаем)

        int i = 0; // количество циклов (шагов загрузки)
        while (i < countDivisionLoadBar) // пока 5 раз не изменим полосу
        {
            // увеличиваем длинну полосы прибавляя символ загрузки к строке
            loadingBar.text += loadingSymbol; 
            // чтобы из цикла выйти
            i++; 
            // задержка в секундах между добавлением делений к полосе загрузки
            // делится общее время задрежки при загрузке на количество делений
            yield return new WaitForSeconds(loadingDelay / countDivisionLoadBar); 
        }
    }

    // когда опрос закончен, вывод числа на экран
    void Result()
    {
        panelResult.SetActive(true); // вкл панель результата
        // если получилось от 1 до 30
        if (guessNubmer > 0 & guessNubmer < 31)
        {
            textResult.fontSize = 300; // на случай если else изменил размер шрифта (число большим шрифтом эпичней выглядит)
            textResult.text = guessNubmer.ToString(); // заносим результат просчета алгоритма для вывода на экран
        }
        else // если пользователь вводил ошибочные ответы
        {
            textResult.fontSize = 70; // чтобы текст влез
            textResult.text = "Ошибка! Будьте внимательней! Попробуйте еще.";
        }
    }

    // кнопка на последней панели, перезапускает программу
    public void ButtonRestart()
    {
        guessNubmer = 0; // очищение переменной для угадывания
        panelResult.SetActive(false); // выкл результирующую панель
        panelChange.SetActive(true); // активация стартовой панели
    }

    // Use this for initialization
    void Start()
    {
        if (panelChange == null) Debug.LogError("Потеряна ссылка на panelChange");
        if (panelsGuess == null) Debug.LogError("Массив панелей null");
        if (panelResult == null) Debug.LogError("Потеряна ссылка на panelResult");
        if (textResult == null) Debug.LogError("Потеряна ссылка на textResult");
        if (loadingBar == null) Debug.LogError("Задайте текст в loadingBar");
    }

    // Update is called once per frame
    void Update()
    {

    }
}

 

Link to post
Share on other sites
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Powered by Invision Community
Поддержка Invision Community в России

×
  • Create New...