【问题标题】:Quiz Game - How to ask 6 random questions without repeating?问答游戏 - 如何在不重复的情况下提出 6 个随机问题?
【发布时间】:2018-05-24 13:27:04
【问题描述】:

早上好,我正在做一个问答游戏,每个主题有 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");


        }
            }

    }
}

【问题讨论】:

  • 将您的问题存储在一个列表中,当您收到随机问题时,将其从列表中删除并将其存储在您的“提问”列表中。
  • 只需要逐个滚动列表即可。没有真正需要删除。
  • 请尽量将您的问题分解为问题,没有英文 cmets 没有人有时间阅读您的源代码。

标签: c# unity3d


【解决方案1】:

使用List&lt;String&gt; 代替string[],因此您可以使用shuffle。快速有效。

【讨论】:

    【解决方案2】:

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

       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]; // 
    
           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());
       } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 2022-01-25
      • 1970-01-01
      • 2020-06-20
      • 2018-11-11
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      相关资源
      最近更新 更多