Question by
EduNog · Dec 15, 2019 at 11:00 AM ·
scripting problem
help with random quiz questions
I am creating a quiz game, but I have a problem, create the random quiz system, but I can't get the questions to repeat themselves after all the questions have passed.
[Header("Configuração dos Textos")]
public Text nomeTemaTxt;
public Text perguntaTxt;
public Text infoRespostasTxt;
public Text notaFinalTxt;
public Text msg1Txt;
public Text msg2Txt;
[Header("Configuração dos Textos Alternativas")]
public Text altAtxt;
public Text altBtxt;
public Text altCtxt;
public Text altDtxt;
[Header("Configuração da Barra")]
public GameObject barraProgresso;
[Header("Configuração dos Botões")]
public Button[] botoes;
public Color corAcerto, corErro;
public RectTransform detalhes;
public RectTransform detalhes1;
public RectTransform detalhes2;
public RectTransform detalhes3;
public RectTransform detalhes4;
public List perguntasrepetidas = new List();
[Header("Configuração do Modo de Jogo")]
public bool perguntasAleatorias;
public bool utilizarAlternativas;
public bool mostrarCorreta;
public int qtdPiscar;
[Header("Configuração das Perguntas")]
public string[] perguntas;
public string[] correta;
public List listaPerguntas;
public int qtdPerguntas;
[Header("Configuração das Alternativas")]
public string[] alternativasA;
public string[] alternativasB;
public string[] alternativasC;
public string[] alternativasD;
[Header("Configuração dos Painéis")]
public GameObject[] paineis;
public GameObject[] estrela;
[Header("Configuração das Mensagens")]
public string[] mensagem1;
public string[] mensagem2;
public Color[] corMensagem;
//---------
private int idResponder, qtsAcertos, notaMin1Estrela, notaMin2Estrelas, nEstrelas, idTema, idbtnCorreto;
private float percProgresso, qtdRespondida, notaFinal, valorQuestao;
private bool exibindoCorreta;
// Start is called before the first frame update
void Start()
{
idTema = PlayerPrefs.GetInt("idTema");
notaMin1Estrela = PlayerPrefs.GetInt("notaMin1Estrela");
notaMin2Estrelas = PlayerPrefs.GetInt("notaMin2Estrelas");
nomeTemaTxt.text = PlayerPrefs.GetString("nomeTema");
montarListaPerguntas();
progressaoBarra();
zerarposicao();
valorQuestao = 10 / (float)qtdPerguntas;
paineis[0].SetActive(true);
paineis[1].SetActive(false);
notaMin1Estrela = 5;
notaMin2Estrelas = 7;
}
// Update is called once per frame
void Update()
{
{
}
}
public void zerarposicao()
{
detalhes.localPosition = new Vector3(0, -5, 44);
detalhes1.localPosition = new Vector3(30, -100, 0);
detalhes2.localPosition = new Vector3(30, -100, 0);
detalhes3.localPosition = new Vector3(30, -100, 0);
detalhes4.localPosition = new Vector3(30, -100, 0);
}
public void montarListaPerguntas()
{
if (perguntasAleatorias == true)
{
bool addPergunta = true;
if (qtdPerguntas > perguntas.Length) { qtdPerguntas = perguntas.Length; }
while (listaPerguntas.Count < qtdPerguntas)
{
addPergunta = true;
int rand = Random.Range(0, perguntas.Length);
foreach (int idP in listaPerguntas)
{
if (idP == rand)
{
addPergunta = false;
}
}
if (addPergunta == true) { listaPerguntas.Add(rand); }
}
}
else
{
for (int i = 0; i < perguntas.Length; i++)
{
listaPerguntas.Add(i);
}
}
perguntaTxt.text = perguntas[listaPerguntas[idResponder]];
if (utilizarAlternativas == true)
{
altAtxt.text = alternativasA[listaPerguntas[idResponder]];
altBtxt.text = alternativasB[listaPerguntas[idResponder]];
altCtxt.text = alternativasC[listaPerguntas[idResponder]];
altDtxt.text = alternativasD[listaPerguntas[idResponder]];
}
else
{
calcularNotaFinal();
}
}
public void responder(string alternativa)
{
if (exibindoCorreta == true) { return; }
if (correta[listaPerguntas[idResponder]] == alternativa)
{
qtsAcertos += 1;
}
switch (correta[listaPerguntas[idResponder]])
{
case "A":
idbtnCorreto = 0;
break;
case "B":
idbtnCorreto = 1;
break;
case "C":
idbtnCorreto = 2;
break;
case "D":
idbtnCorreto = 3;
break;
}
if (mostrarCorreta == true)
{
foreach (Button b in botoes)
{
b.image.color = corErro;
}
exibindoCorreta = true;
botoes[idbtnCorreto].image.color = corAcerto;
StartCoroutine("mostrarAlternativaCorreta");
}
}
public void proximaPergunta()
{
idResponder += 1;
qtdRespondida += 1;
progressaoBarra();
if (idResponder < qtdPerguntas)
{
perguntaTxt.text = perguntas[listaPerguntas[idResponder]];
if (utilizarAlternativas == true)
{
altAtxt.text = alternativasA[listaPerguntas[idResponder]];
altBtxt.text = alternativasB[listaPerguntas[idResponder]];
altCtxt.text = alternativasC[listaPerguntas[idResponder]];
altDtxt.text = alternativasD[listaPerguntas[idResponder]];
}
}
else
{
calcularNotaFinal();
}
}
void progressaoBarra()
{
infoRespostasTxt.text = "Respondendo pergunta " + (qtdRespondida + 1) + " de " + qtdPerguntas + " perguntas";
percProgresso = qtdRespondida / qtdPerguntas;
barraProgresso.transform.localScale = new Vector3(percProgresso, 1, 1);
}
void calcularNotaFinal()
{
notaFinal = (valorQuestao * qtsAcertos);
if (notaFinal > PlayerPrefs.GetInt("notaFinal_" + idTema.ToString()))
{
PlayerPrefs.SetInt("notaFinal_" + idTema.ToString(), (int)notaFinal);
}
if (notaFinal == 10) { nEstrelas = 3; }
else if (notaFinal >= notaMin2Estrelas) { nEstrelas = 2; }
else if (notaFinal >= notaMin1Estrela) { nEstrelas = 1; }
notaFinalTxt.text = notaFinal.ToString();
notaFinalTxt.color = corMensagem[nEstrelas];
msg1Txt.text = mensagem1[nEstrelas];
msg1Txt.color = corMensagem[nEstrelas];
msg2Txt.text = mensagem2[nEstrelas];
foreach (GameObject e in estrela)
{
e.SetActive(false);
}
for (int i = 0; i < nEstrelas; i++)
{
estrela[i].SetActive(true);
}
paineis[0].SetActive(false);
paineis[1].SetActive(true);
}
IEnumerator mostrarAlternativaCorreta()
{
for (int i = 0; i < qtdPiscar; i++)
{
botoes[idbtnCorreto].image.color = corAcerto;
yield return new WaitForSeconds(0.2f);
botoes[idbtnCorreto].image.color = Color.white;
yield return new WaitForSeconds(0.2f);
}
foreach (Button b in botoes)
{
b.image.color = Color.white;
}
exibindoCorreta = false;
}
Comment
The code is very hard to decipher considering I don't speak the language, but you could just put the quizz in a scène, and reload the scene when it is over.
Your answer

Follow this Question
Related Questions
CS0029 Error cannot implicity convert type 'bool' 'UnityEngine.Rendering.ShadowCastingMode' 1 Answer
[SOLVED]bool is getting reset by no reason 2 Answers
Need help disabling a script in another GameObject 1 Answer
[SOLVED]My code line don't execute 1 Answer
SmoothDamp in my FPS controller. Does not feel like it is working. 0 Answers