Nesta série de exercícios iremos praticar o uso da linguagem PHP desenvolvendo uma aplicação web de perguntas e respostas denominado Show do Bilhão.
O Show do Bilhão é um programa idealizado pela emissora SBT (Sistema Belo-Horizontino de Televisão). Neste programa, um candidato escolhido da audiência é submetido a uma sequência de 5 perguntas de conhecimento geral. A medida em que o candidato responde cada pergunta ele avança no jogo.
O jogo termina quando o candidato responde uma pergunta incorretamente. Após o término do jogo o sistema calcula a pontuação final do candidato. Sua pontuação é dada pela quantidade de perguntas respondidas corretamente pelo candidato.
O proprietário da emissora requisitou que você desenvolvesse uma aplicação web que gerencie as perguntas do jogo. Mais especificamente, esse sistema irá fazer o controle das respostas do jogo
O primeiro passo é elaborar uma prova de conceito para mostrar ao conselho diretor. Implemente uma página em PHP que carregue e exiba as perguntas (Todas na mesma página).
Segue alguns requisitos:
- Você deverá utilizar arrays para armazenar os dados das perguntas:
- um vetor para enunciados
- uma matriz (vetor de vetores) com as alternativas
- um vetor com o índice para a alternativa certa
- Deverá haver um loop que irá iteragir com cada pergunta para carregá-la e exibi-la na página
$questoes = [
1 => 'No poema, aparece a palavra "só", corretamente acentuada. Assinale a alternativa que contenha apenas palavras corretamente acentuadas pela mesma regra.',
2 => 'Renato pediu empréstimo ao banco para pagamento em um ano com taxa anual real de juros de 28%. Sabendo que a inflação prevista para o período é de 7%, a taxa aparente de juros é de, aproximadamente:',
3 => 'Dos 50 detentos de um presídio, 17 cometeram o crime de latrocínio, 32 cometeram o crime de estupro e 25 cometeram o crime de estupro, mas não o de latrocínio. Nesse caso, é correto afirmar que',
4 => 'Considerando a anatomia humana, a cavidade abdominal é separada da torácica pelo',
5 => 'Zeus trabalha há dois anos no posto de abastecimento de combustíveis Deuses do Olimpo Centro Automotivo, exercendo a função de frentista, executando o abastecimento de automóveis. Conforme normas de segurança e da medicina do trabalho, Zeus faz jus ao pagamento de adicional de:',
];
$respostas = [
1 => [
1 => "a) Cipó, quatí e dendê.",
2 => "b) Ipê, pó e pá.",
3 => "c) Pôs, nós e pó. CERTA",
4 => "d) Pó, pé e arára.",
5 => "e) Pá, pé e cipó.",
],
2 => [
1 => "a) 33%",
2 => "b) 34%",
3 => "c) 35%",
4 => "d) 36%",
5 => "e) 37% CERTA",
],
3 => [
1 => "a) 40 detentos cometeram ou o crime de latrocínio ou o crime de estupro.",
2 => "b) 15 detentos cometeram o crime de latrocínio, mas não o de estupro.",
3 => "c) 5 detentos cometeram os crimes de latrocínio e de estupro.",
4 => "d) 45 detentos cometeram um ou os dois crimes (latrocínio e estupro).",
5 => "e) 8 detentos não cometeram nem o crime de latrocínio nem o de estupro. CERTA",
],
4 => [
1 => "a) pericárdio.",
2 => "b) fígado.",
3 => "c) diafragma. CERTA",
4 => "d) hipogástrio.",
5 => "e) mediastino.",
],
5 => [
1 => "a) insalubridade, no valor de 30% calculado sobre toda a sua remuneração.",
2 => "b) penosidade, no importe de 35% calculado sobre o salário-mínimo regional.",
3 => "c) periculosidade, no valor de 30% calculado sobre seu salário, sem os acréscimos resultantes de gratificações prêmios ou participação nos lucros da empresa. CERTA",
4 => "d) periculosidade, variando entre 10%, 20% ou 40% calculado sobre o salário-mínimo nacional.",
5 => "e) transferência e risco, no valor de 25% calculado sobre o seu salário-base, sem nenhum acréscimo.",
],
];
$respostas_certas = [
1 => 3,
2 => 5,
3 => 5,
4 => 3,
5 => 3,
];
for ($i = 1; $i <= 5; ++$i){
echo '<h3>'.$questoes[$i].'</h3>';
for ($k = 1; $k <= 5; ++$k){
echo $k == $respostas_certas[$i] ? '<p><b>'.$respostas[$i][$k].'</b><p>' : '<p>'.$respostas[$i][$k].'<p>';
}
}
Agora que a prova de conceito foi implementada, você deverá separar as perguntas de forma a exibir uma por página. Para poder definir qual pergunta será exibida, a página receberá como parâmetro de uma requisição do tipo GET
o índice de acesso da pergunta que será exibida. Por exemplo, uma requisição para http://localhost:8080/perguntas.php?id=3
irá carregar na página perguntas.php
a pergunta armazenada na posição 3 do vetor.
Segue alguns requisitos:
- A pergunta deverá ser recuperada através de uma função chamada
carregaPergunta($id)
que irá acessar o vetor de perguntas, alternativas e respostas, e retornar os dados referentes a pergunta selecionada. - A função implementada anteriormente deverá ser armazenada em um partial chamado
perguntas.inc
. Esse partial conterá funções auxiliares que irão manipular as perguntas da página. É importante ressaltar que esse conjunto de funções é fundamental para o funcionamento do sistema. - A sua página conterá alguns trechos em HTML que poderão ser reaproveitados em outros momentos, como menu, rodapé, etc. Crie dois arquivos, chamados
menu.inc
erodape.inc
que irão armazenar o código HTML do menu e rodapé, e importe-os na página de perguntas. Diferentemente do arquivoperguntas.inc
, o sistema pode tolerar eventuais problemas de carregamento do menu e rodapé.
Agora que as perguntas foram separadas por página. Você deverá implementar a lógica de evolução do jogo. Ao entrar na página inicial do jogo, a primeira pergunta deverá ser carregada. O usuário então seleciona a alternativa que ele julgar correta e submete a resposta. O sistema deverá verificar a resposta do usuário. Caso a resposta esteja correta, o usuário avança para a próxima pergunta. Caso contrário ele deverá ser redirecionado para uma página de game over.
Segue alguns requisitos:
- As alternativas para as perguntas deverão ser fornecidas por meio de um formulário, para possibilitar o envio da resposta ao servidor
- Seu sistema deverá exibir um progresso do jogo (Quantas perguntas ele acertou, por exemplo).
- Os dados deverão ser enviados através de requisições do tipo
POST
.
dica: você precisará enviar entre as requisições um identificador de qual pergunta será mostrada ao usuário. Pesquise sobre hidden input fields.
Chegou a hora de seu programa identificar o jogador que está participando do jogo. Utilize os conceitos de sessões e cookies para identificar quem está jogando. O jogador que está jogando no momento deverá ser identificado por meio de sessão. Utilize cookies para mostrar ao usuário quando foi a última vez que ele jogou e qual foi sua última pontuação.
Segue alguns requisitos:
- O jogador não poderá acessar as perguntas se ele não tiver sido identificado antes. Ou seja, você precisará implementar um simples método de autenticação.
- Deverá haver uma opção para que o jogador se desidentifique do jogo para que outro possa jogar. Ou seja, você precisará implementar uma rotina de logout.
Agora que a mecânica principal do sistema está funcionando, podemos estender o sistema implementando rotinas para persistência de dados.
A persistência pode se dar basicamente por meio de arquivos e banco de dados. Nesse etapa nós iremos implementar nossa persistência no formato de arquivos.
Você deverá implementar um módulo de cadastro e autenticação que irá gerenciar os usuários do sistema. Os dados dos usuários deverão ficar armazenados em um único arquivo, chamado users.txt
.
Os usuários deverão fornecer os seguintes dados para realizar o cadastro (que deverão ser armazenados no arquivo, obviamente):
- Nome
- Login
- Senha
O login deverá ser feito através do login e senha do usuário. Durante o processo de login, o sistema deverá verificar se existe um usuário com este login e, caso exista, verificar se a senha é correta. Caso a autenticação falhe, uma mensagem de erro deverá ser retornada para o usuário.
As perguntas também deverão ser manipuladas através de um arquivo texto. Você deverá implementar um módulo que irá fazer a leitura das perguntas de um arquivo chamado perguntas.txt
.
Cada pergunta armazenada no arquivo deverá conter:
- Enunciado
- Alternativas disponíveis
- Alternativa correta
Manipular dados diretamente por meio de arquivos pode dar muito trabalho. Porém, você pode economizar muito trabalho se utilizar uma forma estrutural de armazenamento. Entre as formas estruturais disponíveis, o PHP fornece suporte nativo para JSON
e XML
.
Caso você opte pelo formato JSON
, sugiro a seguinte estruturação para usuários e perguntas:
usuários.json
[
...
{
"login": "valor",
"senha": "valor",
"email": "valor@v.com",
"nome": "valor"
},
{
"login": "valor",
"senha": "valor",
"email": "valor@v.com",
"nome": "valor"
},
...
]
perguntas.json
[
...
{
"enunciado": "bla bla bla",
"alternativas": ["alt1", "alt2", "alt3", ...],
"resposta": 1
},
{
"enunciado": "bla bla bla",
"alternativas": ["alt1", "alt2", "alt3", ...],
"resposta": 1
},
...
]
Agora que os dados do nosso sistema foram modelados estruturalmente dentro dos arquivos, podemos replicar essa estrutura dentro do código do próprio sistema aplicando conceitos de POO.
Você deverá implementar as classes User
e Question
que deverão manipular os usuários e perguntas do sistema. Essas classes deverão possuir atributos para armazenar as informações contidas no arquivo de cada usuário.
Agora que os dados do nosso sistema estão encapsulados no formato de objetos, fica muito mais fácil trafegar essas informações entre as páginas e requisições.
Você deverá encontrar os pontos do sistema onde os dados são manipulados separadamente e alterar de forma que esses dados estejam encapsulados em seus respectivos objetos e que a manipulação se dê por meio dos objetos criados.