简体   繁体   English

Unity 3D Quiz游戏随机问题

[英]Unity 3D Quiz game random questions

So i got 10 questions, so when the game starts, example the starting question is " 4 out of 10 " then if the next question is random to "10 out of 10" the game ends. 所以我有10个问题,因此当游戏开始时,示例开始的问题是“ 10个问题中的4个 ”,如果下一个问题随机出现到“ 10个问题中的10个”,则游戏结束。 what i want is to random the 10 questions: 我想要的是随机10个问题:

private int idMode;
public Text question;
public Text answerA;
public Text answerB;
public Text answerC;
public Text answerD;
public Text infoAnswer;
public Text stat;
public string[] questions;          
public string[] alternativeA;   
public string[] alternativeB;
public string[] alternativeC;
public string[] alternativeD;
public string[] correct;
private int idQuestion; 
private float points;
private float fact; 
private float average;
private int results;

void Start () {
    idMode = PlayerPrefs.GetInt ("idMode");
    idQuestion = 0;
    fact = questions.Length;
    question.text = questions [idQuestion];
    answerA.text = alternativeA [idQuestion];
    answerB.text = alternativeB [idQuestion];
    answerC.text = alternativeC [idQuestion];
    answerD.text = alternativeD [idQuestion];
    infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString () + "";
}
public void answer(string alternative)
{
    if (alternative == "A") {

        if (alternativeA [idQuestion] == correct [idQuestion]) {

            points += 1;

        } else {

        }
    }
    if (alternative == "B") {

        if (alternativeB [idQuestion] == correct [idQuestion]) {

            points += 1;
        } else {
    }

}
    if (alternative == "C") {
        if (alternativeC [idQuestion] == correct [idQuestion]) {
            points += 1;
        } else {
    }
}

    if (alternative == "D") {
        if (alternativeD [idQuestion] == correct [idQuestion]) {
            points += 1;
        } else {
    }
}
    nextQuestion ();
} 
void nextQuestion()
{
    idQuestion += Random.Range(0,10);
    if(idQuestion <= (fact-1))
    {
        question.text = questions [idQuestion];
        answerA.text = alternativeA [idQuestion];
        answerB.text = alternativeB [idQuestion];
        answerC.text = alternativeC [idQuestion];
        answerD.text = alternativeD [idQuestion];
        stat.text = " Correct: " + points.ToString () + "";
        infoAnswer.text =  (idQuestion + 1).ToString() + " of " + fact.ToString () + "";
    }
    else
    {
        average = 10 * (points / fact);
        results = Mathf.RoundToInt (average);
        if (results > PlayerPrefs.GetInt ("results" + idMode.ToString ())) {
            PlayerPrefs.SetInt ("results" + idMode.ToString (), results);
            PlayerPrefs.SetInt ("points" + idMode.ToString (), (int)points);
        }
        PlayerPrefs.SetInt ("resultsTemp" + idMode.ToString (), results);
        PlayerPrefs.SetInt ("pointsTemp" + idMode.ToString (), (int)points);
        Application.LoadLevel("results");
    }
}
}

Change your data structure, make a class that represents the question and the possible answers so you have one array instead of 6. 更改您的数据结构,创建一个代表问题和可能答案的类,以便您使用一个数组而不是6。

Once you do that before you start asking questions shuffle the list then just go through the list in the new randomized order. 一旦这样做,您就可以在开始提问之前, 将列表随机排序,然后以新的随机顺序浏览列表。

[Serializeable] 
public class Question
{
    public string Text;
    public string A;
    public string B;
    public string C;
    public string D;
    public string CorrectChoice; //Holds "A", "B", "C", or "D"
}

public static class RandomExtensions
{
    public static void Shuffle<T> (this T[] array)
    {
        int n = array.Length;
        while (n > 1) 
        {
            int k = Random.Range(0, n--);
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }
}

Then change your code to 然后将您的代码更改为

private int idMode;
public Text question;
public Text answerA;
public Text answerB;
public Text answerC;
public Text answerD;
public Text infoAnswer;
public Text stat;
public Question[] questions;
private int idQuestion; 
private float points;
private float fact; 
private float average;
private int results;

void Start () {
    idMode = PlayerPrefs.GetInt ("idMode");
    idQuestion = 0;
    fact = questions.Length;
    questions.Shuffle();
    question.text = questions[idQuestion].Text;
    answerA.text = questions[idQuestion].A;
    answerB.text = questions[idQuestion].B;
    answerC.text = questions[idQuestion].C;
    answerD.text = questions[idQuestion].D;
    infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString () + "";
}
public void answer(string alternative)
{
    if (alternative == questions[idQuestion].CorrectChoice) 
    {
        points += 1;
    }

    nextQuestion ();
} 
void nextQuestion()
{
    idQuestion += Random.Range(0,10);
    if(idQuestion <= (fact-1))
    {
        question.text = questions[idQuestion].Text;
        answerA.text = questions[idQuestion].A;
        answerB.text = questions[idQuestion].B;
        answerC.text = questions[idQuestion].C;
        answerD.text = questions[idQuestion].D;
        stat.text = " Correct: " + points.ToString () + "";
        infoAnswer.text =  (idQuestion + 1).ToString() + " of " + fact.ToString () + "";
    }
    else
    {
        average = 10 * (points / fact);
        results = Mathf.RoundToInt (average);
        if (results > PlayerPrefs.GetInt ("results" + idMode.ToString ())) {
            PlayerPrefs.SetInt ("results" + idMode.ToString (), results);
            PlayerPrefs.SetInt ("points" + idMode.ToString (), (int)points);
        }
        PlayerPrefs.SetInt ("resultsTemp" + idMode.ToString (), results);
        PlayerPrefs.SetInt ("pointsTemp" + idMode.ToString (), (int)points);
        Application.LoadLevel("results");
    }
}

If you really don't want to change your data structure this is the other option I mentioned in the comments about creating a mapping array. 如果您确实不想更改数据结构,那么这是我在有关创建映射数组的注释中提到的另一个选项。

private int idMode;
public Text question;
public Text answerA;
public Text answerB;
public Text answerC;
public Text answerD;
public Text infoAnswer;
public Text stat;
public string[] questions;          
public string[] alternativeA;   
public string[] alternativeB;
public string[] alternativeC;
public string[] alternativeD;
public string[] correct;
private int idQuestion; 
private float points;
private float fact; 
private float average;
private int results;
private int[] questionMapper;

void Start () {
    idMode = PlayerPrefs.GetInt ("idMode");
    idQuestion = 0;
    fact = questions.Length;
    questionMapper = new int[questions.Count];
    for(int i = 0; i < questionMapper.Count; i++)
    {
        questionMapper[i] = i;
    }
    questionMapper.Shuffle();
    question.text = questions [questionMapper[idQuestion]];
    answerA.text = alternativeA [questionMapper[idQuestion]];
    answerB.text = alternativeB [questionMapper[idQuestion]];
    answerC.text = alternativeC [questionMapper[idQuestion]];
    answerD.text = alternativeD [questionMapper[idQuestion]];
    infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString () + "";
}

//...

void nextQuestion()
{
    idQuestion += Random.Range(0,10);
    if(idQuestion <= (fact-1))
    {
        question.text = questions [questionMapper[idQuestion]];
        answerA.text = alternativeA [questionMapper[idQuestion]];
        answerB.text = alternativeB [questionMapper[idQuestion]];
        answerC.text = alternativeC [questionMapper[idQuestion]];
        answerD.text = alternativeD [questionMapper[idQuestion]];
        stat.text = " Correct: " + points.ToString () + "";
        infoAnswer.text =  (idQuestion + 1).ToString() + " of " + fact.ToString () + "";
    }
    else
    {
        average = 10 * (points / fact);
        results = Mathf.RoundToInt (average);
        if (results > PlayerPrefs.GetInt ("results" + idMode.ToString ())) {
            PlayerPrefs.SetInt ("results" + idMode.ToString (), results);
            PlayerPrefs.SetInt ("points" + idMode.ToString (), (int)points);
        }
        PlayerPrefs.SetInt ("resultsTemp" + idMode.ToString (), results);
        PlayerPrefs.SetInt ("pointsTemp" + idMode.ToString (), (int)points);
        Application.LoadLevel("results");
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM