C# - Programa para criar um Quiz


Hoje vou mostrar uma forma bem simples de criar um Quiz usando a linguagem C#.

Não sabe o que é um Quiz ?

Então vamos recorrer à Wikipedia:

Quiz (em inglês: quiz, plural quizzes) é o nome dado a um jogo ou passatempo no qual os jogadores (individualmente ou em equipes) tentam responder corretamente a questões que lhes são colocadas. Em alguns contextos, a palavra também é utilizada como sinónimo de teste informal para a avaliação de aquisição de conhecimentos ou capacidades em ambientes de aprendizagem.

Então veremos como criar um Quiz com questões de múltipla escolha bem simples onde iremos definir as questões e respostas em um arquivo texto.

Inicialmente temos uma quiz criada em um arquivo chamado quiz1.txt que possui o seguinte conteúdo:

Quiz sobre o Computador 2018
Qual a menor unidade no computador.| Block| Byte | Bit |C
Qual é o dispostivo mais usado no computador.| Discos de Estado Sólido| Mouse| Dísco Rígido|C
O que significa a sigla WWW ?| Wan Wide World. |World Wide Web |Wide Wan Web |B
Qual o nome do programa usado para visualizar páginas.| Internet |Navegador Web |Page Browser |B
Indique o programa que é um processador de textos.| Notepad. |MS-Excel |MS-Word |C
Quantos bits existem em um único byte.| 1 |8 |4 |B
ISP significa :|International Service Provide |Internet Service Printer |Internet Service Provider|C
Quantos bytes existem em 2040 bits ?.| 255 |1024 |100 |A
Cada sistema numérico possui uma base chamada ?|Index|Radix |Subscript|B
Um dispositivo que converte sinal digital para análogico é chamado|Packet |Modem|Block |B

Este arquivo esta localizado na pasta Quizzes na raiz do projeto.

Note que no arquivo, após a linha de título, cada linha contém a questão, as opções e a resposta correta.

Então o nosso trabalho será ler e exibir o conteúdo deste arquivo em um formato de Questões de múltipla escolha no formato de uma Quiz.

Criando o projeto no VS 2017 Community

Crie um novo projeto do tipo Windows Forms App(.NET Framework) no Visual Studio 2017 Community com o nome de Quiz.

Controles usados no formulário para apresentar a Quiz:

Disponha os controles conforme o leiaute abaixo:

Inclua no projeto uma classe chamada QuizInfo que representa uma quiz com o código abaixo:

    public class QuizeInfo
    {
        public string[] respostas;
        public string respostaCorreta = string.Empty;
        public string Questao = string.Empty;
        public string SelecionarResposta = "";
        public void InitArray(){
            respostas = new string[4];
        }
    }

A seguir os principais métodos e eventos usados no projeto:

1- Os namespaces usados no projeto :

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;

2 - No início do formulário vamos definir as variáveis

List<QuizeInfo> quizLista = new List<QuizeInfo>();
string arquivo_quiz = string.Empty;
string _Resposta = string.Empty;
int _questaoAtual = 0;

3 - No evento Load do formulário inclua o código abaixo que abre uma janela de diálogo que permite selecionar o arquivo da quiz a ser exibido :

        private void Form1_Load(object sender, EventArgs e)
        {

            //obtem caminho completo do arquivo quiz1.txt
            string arquivo = "";
            string caminho = Environment.CurrentDirectory;
            caminho = caminho.Replace("\\bin\\Debug", "");
            caminho = caminho + "\\Quizzes\\quiz1.txt";
            //
            OpenFileDialog ofd1 = new OpenFileDialog();
            ofd1.CheckPathExists = true;
            ofd1.Title = "Selecionar Quiz";
            ofd1.InitialDirectory = caminho;
            ofd1.Filter = "Texto (*.TXT;*.RTF)|*.TXT|" + "Todos (*.*)|*.*";
            ofd1.CheckFileExists = true;
            ofd1.CheckPathExists = true;
            if (ofd1.ShowDialog() == System.Windows.Forms.DialogResult.OK
                && ofd1.FileName.Contains(".txt"))
            {
                arquivo = ofd1.FileName;
            }
            else
            {
                MessageBox.Show("Formato de arquivo inválido...");
                return;
            }
            //atribuir o nome do arquivo obtido
            arquivo_quiz = arquivo;
            //Carrega a Quiz
            CarregaQuiz(arquivo_quiz);
            //Exibe a primeira questão
            ExibirQuestao(0);
            //Desabilita o botão prôximo
            PicProximo.Image = PicDisabled.Image;
            //oculta o panel final
            PanelFinal.Left = pnlQuestoes.Left;
            PanelFinal.Visible = false;
            this.Focus();
        }

4- No método CarregaQuiz() exibe as questões definidas no arquivo texto da quiz :

        public void CarregaQuiz(string nomeArquivo)
        {
            QuizeInfo quizinfo;
            string Linha = string.Empty;
            bool IsPrimeiraLinha = true;
            string[] Linhas = { };
            quizLista.Clear();
            if (File.Exists(nomeArquivo))
            {
                try
                {
                    using (StreamReader sr = new StreamReader(nomeArquivo))
                    {
                        //le o arquivo ate o fim
                        while (!sr.EndOfStream)
                        {
                            Linha = sr.ReadLine().Trim();
                            if (Linha.Length > 0)
                            {
                                //se achou primeira linha obtem o titulo da questão
                                if (IsPrimeiraLinha)
                                {
                                    //Define o titulo
                                    Text = Linha;
                                    //proxima linha
                                    Linha = sr.ReadLine().Trim();
                                }
                                //Não mais primeira linha
                                IsPrimeiraLinha = false;
                                if (!IsPrimeiraLinha)
                                {
                                    //cria um novo objeto quizinfo
                                    quizinfo = new QuizeInfo();
                                    //Divide a linha
                                    Linhas = Linha.Split('|');
                                    //Cria um array de respostas
                                    quizinfo.InitArray();
                                    //Define a questão
                                    quizinfo.Questao = Linhas[0];
                                    //Define as respostas para a questão
                                    quizinfo.respostas[0] = Linhas[1].Trim();
                                    quizinfo.respostas[1] = Linhas[2].Trim();
                                    quizinfo.respostas[2] = Linhas[3].Trim();
                                    //Define a resposta correta
                                    quizinfo.respostaCorreta = Linhas[4].Trim().ToUpper();
                                    //Preenche a informação da quiz
                                    quizLista.Add(quizinfo);
                                    //Limpa o array
                                    Array.Clear(Linhas, 0, Linhas.Length);
                                }
                            }
                        }
                        sr.Close();
                    }
                }
                catch { }
            }
        }

5 -  O método ExibirQuestao() que exibe a primeira questão do Quiz:

        void ExibirQuestao(int index)
        {
            QuizeInfo q;
            //Carrega a questaão
            q = quizLista[index];
            //Define as labels
            lblQuestaoNumero.Text = (index + 1) + "/" + quizLista.Count.ToString();
            lblQuestao.Text = q.Questao;
            //Define as respostas
            opcaoA.Text = "(A) " + q.respostas[0];
            opcaoB.Text = "(B) " + q.respostas[1];
            opcaoC.Text = "(C) " + q.respostas[2];
        }

6 - O evento Click da pictureBox que permite navegar para a próxima questão:

        private void PicProximo_Click(object sender, EventArgs e)
        {
            _questaoAtual++;
            //Reseta o indice das questões
            if (_questaoAtual > quizLista.Count() - 1)
            {
                _questaoAtual = quizLista.Count() - 1;
                //Encerra a quiz
                CalcularRepostas();
                pnlQuestoes.Visible = false;
                PanelFinal.Visible = true;
            }
            ExibirQuestao(_questaoAtual);
          
 //Reseta o botão de resposta
            ResetarResposta();
        }

7 - O método ResetarResposta() que atribuir a resposta do usuário:

        public void ResetarResposta()
        {
            RadioButton rb = new RadioButton();
            string _escolha = _Resposta;
            if (_escolha == "A")
            {
                rb = opcaoA;
            }
            if (_escolha == "B")
            {
                rb = opcaoB;
            }
            if (_escolha == "C")
            {
                rb = opcaoC;
            }
            rb.Checked = false;
            rb.ForeColor = Color.Black;
            PicProximo.Enabled = false;
            PicProximo.Image = PicDisabled.Image;
        }

8 - O método CalcularRespostas() que calcula o resultado e exibe no Panel:

        public void CalcularRepostas()
        {
            int x = 0;
            int Placar = 0;
            double resultado = 0.0;
            while (x < quizLista.Count)
            {
                if (quizLista[x].respostaCorreta.Equals(quizLista[x].SelecionarResposta))
                {
                    Placar += 1;
                }
                x++;
            }
            resultado = (Placar * 100) / (int)quizLista.Count();
            //Exibe o resultado 
            lblCorreto.Text = Placar.ToString() + "/" + quizLista.Count().ToString();
            lblResultado.Text = "Seu Placar é  : " + resultado.ToString() + "%";
        }

6 - O evento Click que permite obter as resposta do usuário na seleção dos controles radiobuttons:

         private void optA_Click(object sender, EventArgs e)
        {
            RadioButton rb = (RadioButton)sender;
            _Resposta = (string)rb.Tag;
            quizLista[_questaoAtual].SelecionarResposta = _Resposta;
            PicProximo.Enabled = true;
            PicProximo.Image = picEnabled.Image;
            SelecionarResposta(rb);
        }

Além disso podemos editar o arquivo texto que monta a quiz e alterar as questões ou ainda criar uma nova quiz:

Executando o projeto iremos obter o seguinte resultado:

O projeto é bem simples e precisa ser melhorado em muitos aspectos, como salvar o resultado e outros recursos a gosto de cada usuário.

Pegue o código do projeto aqui:  CriaExibeQuiz.zip

"Porque Deus não nos destinou para a ira, mas para a aquisição da salvação, por nosso Senhor Jesus Cristo."

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti