Как проверить, что одно и то же случайное значение ранее вызывалось в единице? - PullRequest
0 голосов
/ 07 марта 2019

Я делаю сумму умножения, где int a и int b оба получают значения из random.range (1,11).и есть 4 кнопки, чтобы нажать правильный ответ.когда нажата правильная кнопка ответа, я снова вызываю функцию создателя суммы, поэтому появится следующая сумма.Моя проблема в том, что иногда я получаю тот же вопрос в следующий раз.например, в первый раз 2 X 5, и когда я снова вспоминаю создателя суммы, я получаю 2 x 5. Я попытался добавить значение b в список, а затем сравнить, если значение используется ранее, если да, то снова рандомизировать его (я пытаюсь контролироватьтолько дублирование б) Но, насколько я понимаю, я назначаю одно значение б, когда я вызываю функцию создателя суммы.Там нет петли, потому что я хочу только один вопрос за один раз.и когда я вспоминаю ту же функцию, он не помнит, какое значение использовалось ранее.Как мне решить это?пожалуйста, помогите.

void SumCreator()
{
    // we do multiplication here
    bool reloop;
    bool[] numbers = new bool[301];

    List<int> usedValues = new List<int>();
    a = Random.Range(1, 11);
    b = Random.Range(1, 11);
    while (usedValues.Contains(b))
    {
        b = Random.Range(1, 11);
    }              

    locationOfAnswer = Random.Range(0, ansButtons.Length);

    answer = a * b;
    numbers[answer] = true;

    if (valueA != null && valueB != null)
    {
        valueA.text = a.ToString();
        valueB.text = b.ToString();
    }
    // mathSymbolObject.sprite = mathSymbols[0];

    for (int i = 0; i < ansButtons.Length; i++)
    {
        if (i == locationOfAnswer)
        {
            ansButtons[i].GetComponentInChildren<TextMeshProUGUI>().text = "" + answer;
        }
        else
        {
            // the below code make sure that all the values assigned to the ans button are within the range

            int value = 0;
            do
            {
                reloop = false;
                if (answer <= 10)
                {
                    value = Random.Range(0, 15);
                }
                else if (answer <= 30 & answer >= 11)
                {
                    value = Random.Range(10, 45);
                }
                else if (answer <= 60 & answer >= 31)
                {
                    value = Random.Range(25, 75);
                }
                else if (answer <= 90 & answer >= 61)
                {
                    value = Random.Range(55, 105);
                }
                else if (answer <= 120 & answer >= 91)
                {
                    value = Random.Range(85, 135);
                }

                if (numbers[value]) //already select?
                {
                    reloop = true;
                }

            } while (reloop);

            numbers[value] = true;
            ansButtons[i].GetComponentInChildren<TextMeshProUGUI>().text = "" + value;
        }

    }//for loop
}

Кнопка Script.cs

//method whihc help us to identify if player has pressed correct or wrong answer
public void checkTheTextofButton()
{

    if (gameObject.CompareTag( MathsAndAnswerScript.instance.tagOfButton))
    {
       // do something                       
    }
    else
    {                      
       //do something else            
    }

    // if question is answered correct, call the sum creator method to create new question
    MathsAndAnswerScript.instance.SumCreator();

}

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Мое понимание из вашего кода SumCreator () используется для создания следующего вопроса?в этом случае List usedValues ​​= new List ();Не следует назначать внутри этого метода, каждый раз, когда вы нажимаете кнопку, он создает новый список.

    private List<int> usedValues = new List<int>();
    private bool reloop;
    private bool[] numbers = new bool[301];
    private const int MIN = 1;
    private const int MAX = 11;

    void SumCreator()
    {
        a = Random.Range(1, 11);
        b = GetUniqRandomNumber(MIN,MAX);
        // your logic
    }

      private int GetUniqRandomNumber(int min, int max)
        {
            int num = Random.Range(1, 11);

            if (usedNum.Contains(num))
            {
                num = GetUniqRandomNumber(min, max);
            }
            else {
                usedNum.Add(num);
            }
            if(usedNum.Count == max -1) //  THIS WILL PREVENT entering infinite LOOP - 10  should be yourMax number -1 
            {
                usedNum.Clear();
            }
            return num;
        }

ПОДТВЕРДИТЕ ЭТО ПОМОГАЕТ ВАМ

0 голосов
/ 07 марта 2019

вы используете Round Robin algo, чтобы добиться того, чего вы хотите здесь.но понимание циклического перебора может занять много времени.

Вы можете добиться того же, используя код, прикрепленный ниже.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RandomQuestionGentrator : MonoBehaviour {

    List<int> All_possible_values_of_b = new List<int>();  //List to store all possible value that b can hold;

    void Start ()
    {
        int minRange = 1;
        int MaxRange = 11;

        for (int  i = minRange; i <= MaxRange; i++)    //inserting all possible value of b in list
        {
            All_possible_values_of_b.Add(i);
        }
    }

    void Update ()
    {
        if(Input.GetKeyDown("a"))           //call GenrateNewRandomQuestion when user press correect answer button;
        {
            GenrateNewRandomQuestion();
        }
    }

    void GenrateNewRandomQuestion()
    {
        int a = Random.RandomRange(1, 11);      //a can remain random;

        if(All_possible_values_of_b.Count <= 0)     // changing range when all values of b has been used;
        {
            setnewrange();
        }

        int UsedValueOf_b_InList = Random.Range(0, All_possible_values_of_b.Count);    //accessing remaining values of b in list;

        int b = All_possible_values_of_b[UsedValueOf_b_InList];         //b = some value in list;

        All_possible_values_of_b.RemoveAt(UsedValueOf_b_InList);     //dropping the value of b that is used 

        Debug.Log(a + "x" + b);
    }

    void setnewrange()          //setting new range
    {
        int minRange = 12;
        int MaxRange = 30;
        for (int i = minRange; i <= MaxRange; i++)
        {
            All_possible_values_of_b.Add(i);
        }
    }
}
...