Buscar

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 41 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 41 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 41 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

2
UNIVERSIDADE PAULISTA
Alex de Jesus Freitas Souza – RA: F27GHG-1
Guilherme da Silva Albuquerque – RA: F317AE-9
Jefferson Rodrigues Botelho – RA: N6114H-0
Matheus José Nascimento Grotta – RA: F27GJH-4
APS – ATIVIDADE PRÁTICA SUPERVISIONADA
Desenvolvimento de um jogo em Java
São Paulo
2021
Alex de Jesus Freitas Souza
Guilherme da Silva Albuquerque
Jefferson Rodrigues Botelho
Matheus José Nascimento Grotta
APS – ATIVIDADE PRÁTICA SUPERVISIONADA
Desenvolvimento de um jogo em Java
Trabalho para conclusão do semestre apresentado no curso de ciência da computação da Universidade Paulista - UNIP.
		Orientador: Eliane Santiago.
São Paulo
2021
RESUMO
Com o intuito de criar um jogo na linguagem Java com os princípios de programação orientado a objetos esse trabalho se propõe a explicar e demonstrar o desenvolvimento de um quiz com perguntas sobre o meio ambiente com intuito de conscientização do jogador, sendo criados diagramas e algoritmos em seu processo. Possibilitando principalmente a expansão do conhecimento do grupo sobre o tema ambiental e sobre o desenvolvimento de um programa orientado a objetos.
Palavras-chave: Java; Jogo; Meio ambiente; Orientado a objetos. 
ABSTRACT
In order to develop a game in Java language with the principles of object-oriented programming this work aims to explain and demonstrate the development of a quiz with questions about the environment in order to raize awareness of the player, creating diagrams and algorithms in it’s process. Mainly enabling the expansion of the group’s knowledge on the environmental theme and on the development of an object-oriented program.
Keywords: Java; Game; Environment; Object-oriented. 
LISTA DE ILUSTRAÇÕES
FIGURA 1 - Resposta Inválida no menu						10
FIGURA 2 - Resposta “s” no menu						11
FIGURA 3 - Nome inválido							11
FIGURA 4 - Resposta inválida para pergunta sim ou não			12
FIGURA 5 - Resposta inválida para perguntas múltipla escolhas		12
FIGURA 6 - Resposta inválida para perguntas numérica			12
FIGURA 7 - Pergunta complexa							13
FIGURA 8 - Resultado da resposta complexa					13
FIGURA 9 - Pontuação e resultado final do jogo				14
FIGURA 10 - Fórmula do arranjo							17
FIGURA 11 - Aplicando a fórmula do arranjo					17
FIGURA 12 - Fórmula da probabilidade clássica				18
FIGURA 13 - Aplicando a Fórmula da probabilidade clássica		18
FIGURA 14 - Fórmula da probabilidade para eventos em sequência	18
FIGURA 15 - Diagrama de classes UML					20
FIGURA 15.1 - Classe Pergunta							21
FIGURA 16 - Exemplos de herança 						24
FIGURA 17 - Código fonte: Polimorfismo de sobrecarga			26
FIGURA 18 - Código fonte: Polimorfismo de sobrescrita			27
FIGURA 15.2 - Tratamento de exceções					27
FIGURA 1.3 – Agregação: classe Gerenciador					28
FIGURA 19 - 1.1 Classe abstrata Pergunta					29
FIGURA 20 - 1.2 Classe abstrata Pergunta					30
FIGURA 21 - Classe Exception personalizada					30
FIGURA 22 - 1.1 Classe Pergunta Complexa					31
FIGURA 23 - 1.2 Classe Pergunta Complexa, método executar pergunta	31
FIGURA 24 - 1.3 Classe Pergunta Complexa, método executar pergunta	32
FIGURA 25 - 1.4 Classe Pergunta Complexa, método executar pergunta	32
FIGURA 26 - 1.5 Classe Pergunta Complexa					33
FIGURA 27 - 1.6 Classe Pergunta Complexa					33
FIGURA 28 - 1.7 Classe Pergunta Complexa					34
FIGURA 29 - 1.8 Classe Pergunta Complexa					34
FIGURA 30 - 1.1 Classe Player							35
FIGURA 31 - 1.2 Classe Player							35
FIGURA 32 - 1.1 Classe Gerenciador						36
FIGURA 33 - 1.2 Classe Gerenciador						36
FIGURA 34 - 1.3 Classe Gerenciador						37
FIGURA 35 - 1.4 Classe Gerenciador 						37
FIGURA 36 - 1.5 Classe Gerenciador						38
FIGURA 37 - 1.6 Classe Gerenciador						38
SUMÁRIO
1 OBJETIVO DO TRABALHO.	7
2 INTRODUÇÃO..........................................................................................8
3 REGRAS E FUNCIONAMENTO DO JOGO.	10
4 PLANO DE DESENVOLVIMENTO DO JOGO.	15
5 PROJETO (ESTRUTURA) DO PROGRAMA.	20
 5.1 UML (unified modeling language).	21
 5.1.1 Breve explicação do diagrama	21
 5.2 Parâmetros.	22
 5.3 Herança e encapsulamento.	23
 5.4 Polimorfismo.	25
 5.4 Tratamento de exceções: processando a resposta incorreta	27
 5.5 Agregação.	27
6 RELATÓRIO COM AS LINHAS DE CODIGO.	29
 REFERÊNCIAS	39
 Bibliografia das questões do programa	39
1 OBJETIVO DO TRABALHO.
Este trabalho acadêmico tem como objetivo desenvolver um jogo na linguagem Java utilizando o paradigma de programação orientado a objeto, com o intuito de desenvolver e praticar os conhecimentos, habilidades e conceitos aprendidos em aula e para conscientização sobre o meio ambiente.
2 INTRODUÇÃO.
Com o passar dos anos o progresso da sociedade eventualmente chegou a um ponto em que é necessário muito cuidado e atenção com que tipo de impacto as ações individuais e coletivas em âmbito social causam na natureza e no ambiente em que vivemos, por esse motivo ao se deparar com a tarefa de criar um jogo com temática relacionada ao meio ambiente não havia outra possibilidade ao grupo a não ser ter como um dos principais objetivos a conscientização do jogador perante esse tema de uma forma que sua mensagem seja direta e perceptível sem tornar a experiência algo indesejável ao jogador.
Tendo como proposta de trabalho que os alunos desenvolvam um jogo com ou sem interface gráfica utilizando a linguagem Java, os princípios de programação orientada a objetos (POO) e que o tema contenha a educação ambiental na base da vida em uma grande metrópole o desenvolvimento seguiu para um jogo no estilo Quiz, jogo de perguntas e repostas no qual o usuário ganha pontos a cada pergunta respondida corretamente e perde pontos a cada pergunta respondida de forma incorreta, porém, para não se tornar uma atividade repetitiva ou com a possibilidade do jogador decorar as respostas corretas das questões em sequência as perguntas apresentadas toda vez que o jogo se inicia são escolhidas de uma lista pré-estabelecida de forma aleatória, no final do jogo diferentes resultados são apresentados dependendo de quantos pontos foram obtidos.
Para atender aos requisitos do projeto o jogo é composto por diferentes tipos de perguntas sobre o meio ambiente abordando questões que envolvem a natureza, a relação humana com o meio ambiente e história. Tema muito relevante para se tratar considerando a situação atual resultante da atividade humana e o perigo para as gerações futuras causadas por ela, é de extrema importância que o meio ambiente seja preservado uma vez que por meio dele sobrevivemos. Seguindo esta ideia o jogador tem a chance de perceber o quanto conhece sobre os temas e aprender mais sobre eles, trazendo uma reflexão sobre suas ações e seus impactos.
A principal motivação da escolha deste tipo de jogo foi a possibilidade de poder de uma forma simples transmitir facilmente conhecimento ao jogador, mostrando a ele assuntos e temas que provavelmente não conhecia e ou que já tivesse alguma familiaridade, mas nunca tivesse se aprofundado, podendo assim adquirir mais conhecimento sobre os temas enquanto se diverte em uma atividade recreativa.
Nos subsequentes capítulos deste trabalho serão apresentados os seguintes temas: Regras e funcionalidade do jogo, explicará toda a forma como funciona o jogo como também simulações de jogadas; Plano de desenvolvimento do jogo, será apresentado e explicado os elementos e ferramentas utilizadas no processo de desenvolvimento do programa; em seguida, Projeto (estrutura) do programa apresentará os conceitos, métodos e técnicas de programação orientada a objetos em Java e como esses conceitos foram utilizados no desenvolvimento do jogo; Relatório, com as linhas de código, é o capítulo que demonstra toda a estrutura do código do programa e por fim será apresentada a bibliografia contendo todas as obras consultadas e utilizadas para criação deste projeto.
3 REGRAS E FUNCIONAMENTODO JOGO.
O projeto desenvolvido é um jogo no estilo Quiz sem implementação de interface gráfica composto por quatro tipos de perguntas diferentes: perguntas de múltipla escolha, nas quais o jogador terá que escolher uma alternativa dentre cinco disponíveis; perguntas complexas que exibem uma parte de um pequeno texto possuindo uma frase a ser completada pelos jogadores no qual deve-se escolher umas das alternativas possíveis que melhor se encaixar no espaço vazio, este processo ocorre três vezes atualizando o texto com os espaços completados de acordo com as escolhas do jogador até que a frase não possua mais espaços vazios, para acertar a questão o jogador deverá completar todos os espaços da frase corretamente; perguntas sim ou não que apresentam ao usuário perguntas cuja resposta será apenas uma afirmação ou negação do que é mostrado, utilizando “s” para sim e “n” para não; e por fim, o último tipo, pergunta numérica, só aceita como resposta um número qualquer positivo maior do que zero e vai esperar do jogador que escreva o número correto correspondente a resposta da pergunta.
Ao iniciar o jogo o usuário é apresentado ao menu inicial, neste momento é exibida uma mensagem de boas-vindas, o nome do jogo, Quiz Green, suas regras e uma pergunta ao jogador questionando se quer iniciar o jogo ou encerrar a aplicação.
Caso a resposta para a pergunta do menu esteja fora dos valores esperados “s” ou “n”, será exibida uma mensagem informando que a resposta digitada é inválida e a pergunta será repetida. Como ilustra a figura a seguir:
Figura 1 - Resposta Inválida no menu
Fonte: Autoria própria.
Se o jogador responder “n” o jogo é encerrado, se a resposta for “s” será apresentado um espaço para que ele digite seu nome e finalmente o jogo será iniciado. Veja na imagem:
Figura 2 - Resposta “s” no menu
Fonte: Autoria própria.
Caso o jogador tivesse inserido um nome vazio ou deixasse de escrever um valor como nome ele também seria advertido e a pergunta feita novamente. Observe na imagem:
Figura 3 - Nome inválido
Fonte: Autoria própria.
Ao iniciar o jogo a primeira pergunta do quiz é do tipo sim ou não, caso o usuário responda fora dos parâmetros permitidos uma mensagem será mostrada e a pergunta será repetida. Como mostra a imagem:
Figura 4 - Resposta inválida para pergunta sim ou não
Fonte: Autoria própria.
O mesmo acontece com outros tipos de perguntas é possível ver a seguir:
Figura 5 - Resposta inválida para perguntas múltipla escolhas
Fonte: Autoria própria.
Figura 6 - Resposta inválida para perguntas numérica
 Fonte: Autoria própria.
Para as perguntas complexas e múltipla escolha a mesma mensagem será exibida, perceba que para cada gênero uma resposta diferente é dada ao jogador, o indicando como esta deve ser respondida.
Diferente das outras perguntas nas quais o jogador precisa somente fornecer uma resposta, nas perguntas complexas é necessário que sejam dadas três respostas em sequência para que a questão seja válida. Observe no exemplo:
Figura 7 - Pergunta complexa
Fonte: Autoria própria.
É possível perceber que a cada resposta dada pelo usuário o espaço vazio é completado pela alternativa que foi escolhida, com isso a segunda parte da pergunta já tem o texto da primeira parte completo e a terceira parte possui o texto das duas anteriores completado. Ao final o jogador pode visualizar como ficaria o texto completo com todas as suas escolhas e um feedback sobre seu resultado. Veja a seguir:
Figura 8 - Resultado da resposta complexa
Fonte: Autoria própria.
Ao final do jogo tendo respondido as dez perguntas, o quiz irá mostrar a pontuação do jogador, podendo até mesmo alcançar uma pontuação negativa, menor que zero, uma vez que o jogo sempre retira pontos quando é dada uma resposta incorreta, sendo a pontuação máxima 110. Após o resultado é apresentada uma pergunta sobre jogar novamente ou encerrar a aplicação. Como mostra a imagem:
Figura 9 - Pontuação e resultado final do jogo
Fonte: Autoria própria.
Nesse exemplo o jogador obteve um "Ótimo resultado”, pois sua pontuação ficou entre os 30 e 100 pontos. No jogo existem quatro resultados diferentes que seguem de acordo com o exemplo:
“Gamer Ecológico, seu resultado é pior do que jamais esperávamos, não ouse nem sair de casa você é um risco.”. Para pontuação menor que 0.
"Seu resultado foi mediano Gamer Ecológico, ainda há muitas coisas para aprender sobre a natureza.". Para pontuação entre 0 e 30.
"Ótimo resultado Gamer Ecológico, cometeu alguns erros, mas está muito bem em seus conhecimentos sobre a natureza.". Para pontuação entre 30 e 100.
"Muito bem, meus parabéns, Gamer Ecológico, você é incrível não há nada para ser ensinado a você aqui.". Para pontuação acima de 100.
Como pode ser observado o quiz foi preparado pensando na implementação de diferentes tipos de interações e para conseguir lidar com as diferentes situações que o usuário possa causar durante sua execução.
4 PLANO DE DESENVOLVIMENTO DO JOGO.
Para início do desenvolvimento do jogo os integrantes do grupo se reuniram para se organizar e definir qual tipo de projeto seria feito, quais características este deveria possuir considerando que deve utilizar os conceitos de LPOO aprendidos em aula e trazer consigo uma mensagem de conscientização ambiental para o jogador e finalmente quais seriam as ferramentas que iriam ser utilizadas para sua criação.
Ao buscar uma forma de conseguir organizar o desenvolvimento entre os quatro integrantes da equipe foi decidida a utilização da plataforma GitHub, capaz de possibilitar a hospedagem do código do projeto na internet e a capacidade de simultaneamente serem trabalhadas diferentes partes do mesmo projeto sem que essas entrem em conflito com as outras áreas sendo desenvolvidas, dessa forma foi possível que os integrantes da equipe não dependessem de diversos envios ou de respostas unitárias de outros membros para progredirem com o desenvolvimento.
Sobre qual IDE (Integrated Development Environment, ou seja, Ambiente de Desenvolvimento Integrado), seria utilizada durante o desenvolvimento do projeto o grupo se viu entre duas escolhas: Eclipse IDE ou Apache NetBeans que são amplamente conhecidas no desenvolvimento de programas em JAVA, ao ser efetuada uma comparação direta com o objetivo de decidir qual seria utilizada neste projeto não foram encontradas grandes diferenças que fizessem o grupo dar preferência a uma IDE em específico além de que em estações de trabalho menos capacitadas a velocidade de inicialização do Eclipse se mostraria bem mais rápida, deixando assim para que os membros individualmente decidam qual dos dois eles se adaptam melhor para o desenvolvimento do projeto.
O grupo então decidiu que o trabalho seria o desenvolvimento de um jogo do tipo quiz com a implementação de funções extras para cumprir com as necessidades mínimas especificadas, feito tanto no Eclipse quanto no NetBeans para ser compatível com as preferências de cada integrante em relação a qual das IDE’s utilizar durante o desenvolvimento.
Havia um consenso entre os integrantes que somente a criação de um quiz seguindo os padrões já desenvolvidos anteriormente não seria o suficiente para suprir os requisitos mínimos indicados neste projeto, por esse motivo o primeiro objetivo se tornou definir quais características dentro dele fariam que este utilizasse os princípios da Linguagem de Programação Orientada a Objetos, como também se destacasse entre outros projetos que eventualmente pudessem ter o mesmo tipo de jogo como tema. Tendo isso em mente foi definido que o projeto possuiria tipos de perguntas que propusessem diferentes interações com o usuário, podendo assim gerar classes diferentes para cada tipo de pergunta, uma herança entre elas e uma classe abstrata, além de que cada pergunta deveria possuir os métodos que fizessem os processos de atribuir os valores de perguntas, executar as perguntas e checar a resposta dada pelo usuário.
Após esta decisão se iniciou o desenvolvimento de uma versão simplificada dessa ideia somente com duas classesde perguntas, uma abstrata que serviria de “classe mãe” para todas as subsequentes, e outra sendo de perguntas de múltipla escolha para efetuar a herança entre elas, os testes da implementação dos métodos e também se viu a necessidade de uma pesquisa mais detalhada sobre os temas que seriam utilizados para criação das perguntas que o jogador iria responder durante o jogo, esta pesquisa se estendeu durante todo o processo de criação do programa incluindo temas como: reciclagem, eventos históricos importantes relacionados a preservação do meio ambiente no Brasil e no mundo, impactos de diversos problemas causados pelos humanos no meio ambiente, causas e tipos de poluição, entre outros.
Com os testes efetuados na versão inicial do programa foi decidida a criação de três outras classes de perguntas para as implementações das outras formas de interação do usuário, a primeira exigindo uma resposta em valor numérico, a segunda exigindo do usuário uma resposta entre os valores “s” e “n” e, por fim, a última classe que mostraria uma frase ao usuário que ele iria completar com a resposta de acordo com uma lista de valores dados para ele e assim que responder outra parte da frase iria ser mostrada com mais um campo para ser completado até que o usuário complete três partes da frase. 
Outro ponto pensado pelo grupo foi a criação de uma classe ou método para geração de números aleatórios utilizando a classe Random do Java, para assim cada método de execução de perguntas utilizar desse número como indicação de qual pergunta seria executada, dessa forma seria possível que a cada partida as perguntas fossem diferentes das anteriores. Inicialmente se pensou que seria necessário que a classe guardasse os números que já haviam sido utilizados em uma partida anterior para que não se repetissem, porém, utilizando do conhecimento adquirido nas aulas de Estatística e Probabilidade foi identificado que a chance de todas as perguntas se repetirem na mesma ordem era tão baixa que seria irrelevante tratar desse caso, para comprovar isso foi realizado os seguintes cálculos:
Seriam executadas quatro perguntas de múltipla escolha, três de sim ou não, duas complexas e uma numérica. A primeira parte era descobrir quantas combinações são possíveis de fazer sem que a ordem se repita em cada grupo de perguntas, iniciando com as de múltipla escolha temos 15 questões sendo agrupadas em um conjunto de quatro em cada execução, para calcular a possibilidade usou-se a fórmula de combinação do arranjo, como pode ser observado na imagem a seguir:
Figura 10 – Fórmula do arranjo
 Fonte: diferenca.com.
Sendo “n” neste caso o número total de perguntas e “p” o número de perguntas que será executado a cada partida. Dessa forma ficaria:
 	Figura 11 – Aplicando a fórmula do arranjo
 Fonte: Autoria do autor.
O fatorial de 15 é igual a 1,30767437.1012 e 15 – 4 resulta em 11 sendo seu fatorial igual a 39.916.800, realizando a divisão é obtido 32.760 formas diferentes de combinar 15 perguntas em um conjunto de 4, sem repetir a ordem.
O próximo passo é calcular a probabilidade que um desses conjuntos ocorra em sequência na geração de perguntas, a forma para essa probabilidade é a clássica (ou teórica). Presente a seguir:
Figura 12 - Fórmula da probabilidade clássica
Fonte: Autoria do autor.
Para este caso o dividendo é 1 e o divisor é 32.760², como o objetivo é obter a chance desse conjunto ocorrer duas vezes seguidas. Substituindo os valores na fórmula se obtém o seguinte resultado:
Figura 13 - Aplicando a Fórmula da probabilidade clássica
Fonte: Autoria do autor.
Passando o resultado para porcentagem a chance de serem geradas as mesmas perguntas na mesma ordem duas vezes seguidas para perguntas de múltipla escolha é de 9,31777489.10-8%.
Como os eventos de gerar números para cada tipo de perguntas é independe, ou seja, um não interfere no outro, aplicando todos esses cálculos nas outras perguntas e multiplicando seu resultado terá a seguinte equação:
Figura 14 – Fórmula da probabilidade para eventos em sequência
 Fonte: Autoria do autor.
Com isso é possível chegar ao resultado que a probabilidade de serem geradas as mesmas perguntas na mesma ordem é de 8,87610016.10-19%, uma chance extremamente baixa.
Para implementar essa funcionalidade foi criada mais uma classe chamada Gerenciador, esta classe é a responsável por toda a execução do programa além de criar os números que representariam quais perguntas seriam executadas, fazendo as verificações para que os números gerados não se repitam, executando o menu inicial do jogo, as perguntas, o resultado e questionando ao jogador se o jogo vai ser executado mais uma vez ou se é fechado.
Tendo todas essas funcionalidades implementadas a última necessidade era o tratamento de erros, para isso foi criada uma classe estendendo a classe Exception presente no Java com o objetivo de utilizar das funções de sua classe mãe para criar uma exceção própria e usá-la para fazer a checagem se o jogador escreveu uma resposta presente dentro dos valores esperados para o tipo de pergunta a qual está respondendo, uma vez implementada toda a funcionalidade do projeto foi efetuada.	Comment by Alex Souza: palavras estrangeiras devem estar em itálico sem “aspas” 
Com a conclusão do desenvolvimento deste trabalho acadêmico foi possível perceber uma melhora considerável nas habilidades e conhecimentos da equipe sobre a programação orientada a objeto além da expansão de seu conhecimento sobre o meio ambiente, foi possível se aprofundar mais em suas características únicas como paradigma de linguagem, além de implementar conceitos aprendidos em outras matérias como Estatística e Probabilidade. Apesar de não ter sido possível implementar uma interface visual no programa pode-se concluir que o conteúdo ensinado em aula e o material utilizado para esse trabalho ajudou no desenvolvimento pessoal de todos os integrantes do grupo.
5 PROJETO (ESTRUTURA) DO PROGRAMA.
A seguir será apresentado a estrutura do trabalho apresentada em diagrama de classes UML (Unified Modeling Language).
Figura 15 – Diagrama de classes UML
	Comment by Alex Souza: é melhor usar as imagens disponíveis no WhatsApp	Comment by Jefferson Botelho: não estão dimensionadas corretamente. no wpp eu te explico melhor	Comment by Guilherme Albuquerque: mudar para o diagrama correto.
Fonte: dos autores.
5.1 UML (unified modeling language).
O diagrama de classes UML foi o modelo apresentado em sala de aula e requisitado para a elaboração de projetos. Além disso, este é o modelo adotado pelo mercado quando se trata de uma representação visual da idealização de um software.
Embora existam muitas representações gráficas diferentes, um fator importante para a adoção do diagrama de classes UML é que, segundo Deitel e Deitel (2017, p. 10), essa linguagem gráfica é amplamente utilizada para comunicar os resultados de qualquer processo desse tipo e se tornou o esquema gráfico mais utilizado para modelagem de sistemas orientados a objetos.
Além disso:
Na indústria, diagramas UML ajudam projetistas de sistemas a especificar um sistema de maneira gráfica, concisa e independente de linguagem de programação antes de os programadores implementarem o sistema em uma linguagem específica. Deitel e Deitel (2017, p. 61).
5.1.1 Breve explicação do diagrama.	Comment by Jefferson Botelho: substituir x por algarismo arábico
“Na UML, cada classe é modelada em um diagrama de classe como um retângulo com três compartimentos.” Deitel e Deitel (2017, p. 62).
Figura 15.1 – Classe Pergunta
Fonte: dos autores.
A criação desse diagrama segue as seguintes regras: o retângulo superior contém o nome da classe, aqui sendo Pergunta, centralizado horizontalmente em negrito. 	Comment by Guilherme Albuquerque: transformar em um parágrafo só	Comment by Jefferson Botelho: aqui eu não trato da classe, mas de cada aspecto dos retângulos isoladamente
O retângulo do centro contém os atributos, aqui compostos por qtdPerguntas e tecla, sendo variáveis do tipo private em Java, assimo diagrama UML de classe lista um modificador de acesso com um sinal de subtração (-) antes do nome do atributo. Depois do nome do atributo há um caractere dois pontos e a definição do tipo de atributo, no caso, int para qtdPerguntas e Scanner para tecla. 
O retângulo inferior contém as operações da classe, verificar e verificarErro. Segundo Deitel e Deitel (2017, p. 62), o UML modela as operações listando o nome de cada uma precedido por um modificador de acesso. Esse sinal de adição (+) indica que verificar é uma operação pública na UML (porque é um método public em Java). A operação verificar possui um parâmetro resposta, do tipo boolean. A operação verificarErro, também de caráter público, possui dois parâmetros e a palavra-chave throws para tratamento de exceções.
A essas operações, em Java, dá-se o nome de métodos. A função do método, dentro do programa, é de realizar tarefas. “O método armazena as declarações do programa que, na verdade, executam as tarefas; além disso, ele oculta essas declarações do usuário.” Deitel e Deitel (2017, p. 9). A ocultação de métodos e atributos em Java atende ao conceito de encapsulamento dentro do paradigma de orientação a objetos. Esse assunto será tratado logo mais.
5.2 Parâmetros.
A UML modela um parâmetro de um modo pouco diferente do Java listando o nome desse parâmetro, seguido por dois-pontos e pelo tipo dele nos parênteses que seguem o nome da operação. O UML tem seus próprios tipos de dado semelhantes àqueles do Java [..]. Deitel e Deitel (2017, p. 62).
Para simplificar, serão usados os tipos de dados do Java. O método verificar da classe Pergunta (Figura 1.1) tem um parâmetro String chamado resposta.
A classe Pergunta possui, também, três métodos abstratos. Os métodos: definirPerguntas; checarResposta e executarPergunta não possuem implementação, sendo métodos abstratos. Sendo assim, por possuir esses métodos, a classe Pergunta é uma classe abstrata. “O Propósito de uma classe abstrata é fornecer uma superclasse apropriada a partir da qual outras classes podem herdar e assim compartilhar um design comum.” Deitel e Deitel (2017, p. 316).
Mas o que seriam classes e superclasses?
5.3 Herança e encapsulamento.
“No Java, é criado uma unidade de programa chamada ‘classe’ para armazenar o conjunto de métodos que executam as tarefas dela.” Deitel e Deitel (2017, p. 9). No diagrama de classes UML (Figura 15), a classe abstrata Pergunta é uma superclasse. Ela é uma classe que possui métodos que são declarados, mas não implementados, ou seja, métodos abstratos. A classe Pergunta não é instanciada, seu objetivo é ser um, no caso do diagrama (Figura 15), Pergunta é superclasse de: PerguntaSN; PerguntaMultiplaEscolha; PerguntaComplexa e PerguntaNumerica, portanto, essas são subclasses de Pergunta. Nas subclasses, os métodos abstratos de Pergunta são herdados e recebem implementações, sendo assim, as subclasses de Pergunta são classes concretas.
Foi apresentado a superclasse Pergunta, que também pode ser chamada de classe mãe, e suas classes filhas, isto é, subclasses. Ao dizer que PerguntaMultiplaEscolha herda de Pergunta, por exemplo, é abordado o conceito de heranças dentro do paradigma de orientação a objetos. Uma subclasse ao estender uma superclasse, herda os seus atributos e métodos, podendo convenientemente modificá-los personalizando e adicionando aspectos próprios, observa Deitel e Deitel (2017). Por exemplo, o método abstrato checarResposta na classe Pergunta é herdado pela classe PerguntaNumerica e é implementado segundo as regras de negócio da classe por meio de outro conceito de orientação a objetos, o polimorfismo, que será apresentado logo mais.
“Frequentemente, um objeto de uma classe também é um objeto de outra classe.” Deitel e Deitel (2009, p. 284). Por exemplo uma classe Animal, apresentado durante a aula de herança. Seguindo o exemplo, um Cavalo é um Animal, assim como um Cachorro também é um Animal. Dessa forma pode-se dizer, em Java, que Cavalo e Cachorro são classes que herdam de Animal. Por tanto, Animal é uma superclasse. A figura 16 lista alguns exemplos simples de superclasses e subclasses. É possível observar que superclasses são mais genéricas, enquanto subclasses são mais específicas.
Figura 16 – Exemplos de herança
Fonte: dos autores.
Apesar das subclasses herdarem os atributos e métodos de sua classe mãe, sendo os mesmos de acesso privado, não poderão ser acessados diretamente. No Java, há um padrão de métodos de acesso público conhecidos como getters e setters, que são métodos para definição e acesso, através deles, é possível que os atributos da classe, sendo de acesso privado, possam ser manipulados dentro das regras estabelecidas pelo método que dá acesso a eles, como se fosse uma ponte. O motivo disso é para garantir a segurança e integridade dos métodos e/ou atributos de uma classe que serão acessados. A isto dá-se o nome de encapsulamento, que por sua vez, também é um conceito importantíssimo dentro do paradigma de orientação a objetos. Para simplificar, é possível atribuir o conceito de encapsulamento para o mundo real, explicando o caso de um vendedor de jornal: ao comprar um jornal, o comprador entrega o dinheiro para o vendedor de jornal e recebe dele o jornal comprado e o troco, se houver. Agora imagine a seguinte situação: o comprador abre a área de uso exclusivo do vendedor e retira o jornal da forma que bem entender e por sua vez, o jornaleiro pega a carteira do bolso do comprador, retira o dinheiro e pede ao comprador para que guarde o dinheiro no caixa e retire o troco, se houver. Não faz o menor sentido. Abstraindo isso para o paradigma de orientação a objetos, é exatamente esse tipo de situação “perigosa” que o conceito de encapsulamento quer prevenir, ainda falando sobre abstração, esse também é um conceito importante da orientação a objetos junto do encapsulamento. Deitel e Deitel (2017, p. 9) afirma que: 
Os objetos podem se comunicar entre si, mas eles em geral não sabem como outros objetos são implementados – os detalhes de implementação permanecem ocultos dentro dos próprios objetos. Esse ocultamento de informações, como veremos, é crucial à boa engenharia de software.
5.4 Polimorfismo.
As classes PerguntaComplexa; PerguntaMultiplaEscolha; PerguntaNumerica e PerguntaSN, apresentada no diagrama (figura 1) são classes que estendem da classe abstrata Pergunta. Sendo Pergunta uma classe abstrata que não é instanciada, seus métodos não possuem implementação, ao estenderem da Pergunta, suas subclasses herdam seus métodos, e cabe a elas implementarem esses métodos por meio de outro conceito de orientação a objetos: o polimorfismo. 
O polimorfismo permite ‘programar no geral’ em vez de ‘programar no específico’. Em particular, o polimorfismo permite escrever programas que processam objetos que compartilham a mesma superclasse, direta ou indiretamente, como se todos fossem objetos da superclasse; isso pode simplificar a programação. Deitel e Deitel (2017, p. 312).
Será apresentado um trecho de código fonte da classe PerguntaComplexa:
Figura 17 – Código fonte: Polimorfismo de sobrecarga	Comment by Jefferson Botelho: alterar depois
Fonte: dos autores.
No código fonte da classe PerguntaComplexa, foi abstraído e exibido apenas as linhas que serão tratadas nesse tópico. Pode ser observado que a classe estende a classe Pergunta, isto é, herda seus atributos e métodos. O método checarResposta possui o mesmo nome e a mesma assinatura do método abstrato da superclasse Pergunta, porém, na subclasse ele vem acompanhado pela notação Override, que indica que o método será sobrescrito, recebendo implementação, deixando de ser um método abstrato e se tornando um método concreto na classe PerguntaComplexa. A isto dá-se o nome de polimorfismo de sobrescrita.
Além do polimorfismo de sobrescrita, em Java, também é trabalhado o polimorfismo de sobrecarga. Nas imagens a seguir serão apresentados os códigos fonte de dois métodos sem implementação, para fins didáticos foram abstraídos dos códigos apenas as linhas de códigoa serem comentadas, mas os mesmos possuem implementação, sendo assim, métodos de uma classe concreta: PerguntaComplexa.
Figura 18 - Código fonte: Polimorfismo de sobrescrita	Comment by Jefferson Botelho: alterar x para algarismo arabico	Comment by Guilherme Albuquerque: usar somente 1 imagem
Fonte: dos autores.
Apesar de terem tido suas implementações abstraídas, ambas as classes possuem implementações distintas que correspondem à sua assinatura. Observe que ambos os métodos possuem o mesmo nome, porém, suas assinaturas são distintas, este conceito de orientação a objetos é chamado de polimorfismo de sobrecarga.
Neste projeto não foi necessário o uso de interfaces, mas elas muitas vezes se fazem necessárias na implementação de métodos processados poliformicamente.
5.4 Tratamento de exceções: processando a resposta incorreta.
Deital e Deitel (2017, p. 201) diz que “Uma exceção indica um problema que ocorre quando um programa é executado. O nome “exceção” sugere que o probema ocorre com pouca frequência[...]” e também “O tratamento de exceção ajuda a criar programas tolerantes a falhas que podem resolver (ou tratar) exceções. Em muitos casos, isso permite que um programa continue a executar como se nenhum problema fosse encontrado.” No diagrama de classes UML (figura 1) pode ser notado uma classe de nome RespostaInvalidaException.
Figura 15.2 – Tratamento de exceções
Fonte: dos autores.
A classe RespostaInvalidaException herda de Exception uma classe nativa do Java e possui apenas o método construtor. Assim caso seja informado uma entrada de dados inválida, será construído um objeto que irá executar as tarefas que forem definidas pelos métodos, nesse caso executará uma mensagem informando que ação foi efetuada de forma incorreta, para tratar possíveis erros que possa prejudicar o funcionamento do código durente sua execução. “O processo para fazer isso se chama instanciação. Um objeto é então referido como uma instância da sua classe.” Deitel e Deitel (2017, p. 9).
5.5 Agregação.
Em Java, é possível que uma classe use outras classes em suas operações como no exemplo da classe Gerador (figura 15). Veja a seguir:
Figura 1.3 – Agregação: classe Gerenciador
Fonte: dos autores.
A classe Gerenciador promove a interação de diferentes classes entre si. É necessário entender que ‘menuInicial’ e ‘iniciar’ são procedimentos que dentro da classe Gerenciador criam os objetos necessários e executam o programa. Quando instanciada na classe Principal, o objeto instanciado da classe Gerenciador executa o quiz, contendo toda a programação desenvolvida no projeto seguindo o paradigma de orientação a objetos em Java.
6 RELATÓRIO COM AS LINHAS DE CODIGO.
O código das figuras a seguir também está disponível em:
https://github.com/AlexdeJesusFS/APS-3---Java-Game
	
Figura 19 - 1.1 Classe abstrata Pergunta
Fonte: Autoria própria.
Figura 20 - 1.2 Classe abstrata Pergunta
Fonte: Autoria própria.
Figura 21 - Classe Exception personalizada
Fonte: Autoria própria.
Figura 22 - 1.1 Classe Pergunta Complexa
Fonte: Autoria própria.
Figura 23 - 1.2 Classe Pergunta Complexa, método executar pergunta
Fonte: Autoria própria.
Figura 24 - 1.3 Classe Pergunta Complexa, método executar pergunta
Fonte: Autoria própria.
Figura 25 - 1.4 Classe Pergunta Complexa, método executar pergunta
Fonte: Autoria própria.
Figura 26 - 1.5 Classe Pergunta Complexa
Fonte: Autoria própria.
Figura 27 - 1.6 Classe Pergunta Complexa
Fonte: Autoria própria.
Figura 28 - 1.7 Classe Pergunta Complexa
Fonte: Autoria própria.
Figura 29 - 1.8 Classe Pergunta Complexa
Fonte: Autoria própria.
Figura 30 - 1.1 Classe Player
Fonte: Autoria própria.
Figura 31 - 1.2 Classe Player
 Fonte: Autoria própria.
Figura 32 - 1.1 Classe Gerenciador
Fonte: Autoria própria.
Figura 33 - 1.2 Classe Gerenciador
Fonte: Autoria própria.
Figura 34 - 1.3 Classe Gerenciador
Fonte: Autoria própria.
Figura 35 - 1.4 Classe Gerenciador
Fonte: Autoria própria.
Figura 36 - 1.5 Classe Gerenciador
Fonte: Autoria própria.
Figura 37 - 1.6 Classe Gerenciador.
Fonte: Autoria própria.
REFERÊNCIAS
DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 10. ed. São Paulo: Pearson, 2017
FARINELLI, Fernanda. Conceitos Básicos de programação orientada a objetos. Instituto Federal Sudeste de Minas Gerais, 2007.
RICARTE, Ivan Luiz Marques. Programação Orientada a Objetos: uma abordagem com Java. http://www.dca.fee.unicamp.br/cursos/PooJava/Aulas/poojava. pdf - Acesso em: 08/05/2021
Bibliografia das questões do programa
ROBERTO, Paulo. A relação entre meio ambiente e saúde e a importância dos princípios da prevenção e da precaução. Disponível em: https://jus.com.br/artigos/6484/a-relacao-entre-meio-ambiente-e-saude-e-a-importancia-dos-principios-da-prevencao-e-da-precaucao - Acesso em 03/05/2021
VERLY, Sergio. A SOCIEDADE E O MEIO AMBIENTE. Disponível em: https://meuartigo.brasilescola.uol.com.br/geografia/a-sociedade-meio-ambiente.htm - Acesso em 05/05/2021
ALVES, Rodolfo. Tipos de poluição. Disponível em: https://brasilescola.uol.com.br/geografia/tipos-poluicao.htm - Acesso em 20/05/2021
SARDINHA, Helivania. Poluição. Disponível em: https://www.biologianet.com/ecologia/poluicao.htm#:~:text=Polui%C3%A7%C3%A3o%20%C3%A9%20a%20degrada%C3%A7%C3%A3o%20do,estar%20e%20tamb%C3%A9m%20%C3%A0%20economia - Acesso em 22/05/2021

Mais conteúdos dessa disciplina