测验游戏 - 如何在不重复的情况下提出6个随机问题?

时间:2018-05-24 13:27:04

标签: c# unity3d

早上好,我正在做一个问答游戏,每个主题有6个问题。我想随机提出问题(没有转发器),在我完成6个问题后给出最终成绩。

我尝试使用Random.Range,但它没有用,因为有时我只跑了大约2,3或1个问题并很快进入笔记屏幕,我看到一些关于制作列表的话题Shuffle也试过但是Shuffle没有出现在我的脚本中,并且更多地减去了.Count命令,所以我不知道它是否会起作用。

任何人都可以帮助我吗?好吧,我知之甚少,我不知道如何正确使用Shuffle。如果他们可以详细谈论或发送更正后的脚本,我将非常感激。提前感谢您的关注和理解,我为任何拼写错误道歉,我巴西和我使用谷歌翻译来翻译该消息。

这是我用于问答的完整脚本。

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    using UnityEngine.SceneManagement;

    public class responder : MonoBehaviour {

    private int idTema;

    public Text pergunta;
    public Text respostaA;
    public Text respostaB;
    public Text respostaC;
    public Text respostaD;
    public Text InfoRespostas;

    public string[] perguntas;          //armazena todas as perguntas
    public string[] alternativaA;       //armazena todas as alternativas A
    public string[] alternativaB;       //armazena todas as alternativas B
    public string[] alternativaC;       //armazena todas as alternativas C
    public string[] alternativaD;       //armazena todas as alternativas D
    public string[] corretas;           //armazena todas as alternativas corretas

    private int idPergunta;

    private float acertos;
    private float questoes;
    private float media;
    private int notaFinal;

    // Use this for initialization
    void Start () 
    {
        idTema = PlayerPrefs.GetInt ("idTema");
        idPergunta = 0;
        questoes = perguntas.Length;

        pergunta.text = perguntas [idPergunta];
        respostaA.text = alternativaA [idPergunta];
        respostaB.text = alternativaB [idPergunta];
        respostaC.text = alternativaC [idPergunta];
        respostaD.text = alternativaD [idPergunta];

        InfoRespostas.text = "Respondendo "+(idPergunta + 1).ToString()+" de "+questoes.ToString()+" perguntas.";
    }

    public void resposta (string alternativa)
    {
        if (alternativa == "A") 
        {
            if (alternativaA [idPergunta] == corretas [idPergunta])
                acertos += 1;
        } 

        else if (alternativa == "B") 
        {
            if (alternativaB [idPergunta] == corretas [idPergunta])
                acertos += 1;
        } 

        else if (alternativa == "C")
        {
            if (alternativaC [idPergunta] == corretas [idPergunta])
                acertos += 1;
        } 

        else if (alternativa == "D") 
        {
            if (alternativaD [idPergunta] == corretas [idPergunta])
                acertos += 1;
        }
        proximaPergunta ();
    }

    void proximaPergunta()
    {
        idPergunta += 1;  /// se fosse 20 questões aqui seria 19
        if(idPergunta <= (questoes-1))
        {
        pergunta.text = perguntas [idPergunta];
        respostaA.text = alternativaA [idPergunta];
        respostaB.text = alternativaB [idPergunta];
        respostaC.text = alternativaC [idPergunta];
        respostaD.text = alternativaD [idPergunta];

        InfoRespostas.text = "Respondendo "+(idPergunta + 1).ToString()+" de "+questoes.ToString()+" perguntas.";
        }


    else

    {


            {
                media = 10 * (acertos / questoes);  //calcula a media com base no percentual de acerto
                notaFinal = Mathf.RoundToInt(media); //calcula a nota para o proximo inteiro, segundo a regra da matematica

                if(notaFinal > PlayerPrefs.GetInt("notaFinal"+idTema.ToString()))
            {
                PlayerPrefs.SetInt ("notaFinal" + idTema.ToString (), notaFinal);
                PlayerPrefs.SetInt("acertos"+idTema.ToString(), (int) acertos);

            }

                PlayerPrefs.SetInt ("notaFinalTemp" + idTema.ToString (), notaFinal);
                PlayerPrefs.SetInt("acertosTemp"+idTema.ToString(), (int) acertos);

                SceneManager.LoadScene ("notaFinal");


        }
            }

    }
}

2 个答案:

答案 0 :(得分:5)

而不是string[]使用List<String>,因此您可以shuffle。快速有效。

答案 1 :(得分:3)

另一种可能性是从可用的列表中删除提出的问题:

   private static Random s_Random = new Random();

   // Question: Let's extract question into class
   public static IEnumerable<Question> AskQuestions(IEnumerable<Question> allQuestions) {
     if (null == allQuestions)
       throw new ArgumentNullException("allQuestions");  

     // Copy of all the questions
     List<Question> availableQuestions = allQuestions.ToList(); 

     while (availableQuestions.Any()) {
       int index = s_Random.Next(availableQuestions.Count);

       yield return availableQuestions[index]; // Ask Question

       availableQuestions.RemoveAt(index);     // And Remove It
     }
   }

所以你可以把

   // Any collection (let it be list) of all possible question
   List<Question> allQuestions = ....

让我们问N个问题:

   int N = 6; // 6 distinct (no repeating) questions

   foreach (Question question in AskQuestions(allQuestions).Take(N)) {
     //TODO: Ask question here, give response etc.
     Console.WriteLine(question.ToString());
   }