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
 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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

×
  • Create New...