Lista 2

Recomendações Importantes

    • A lista deve ser entregue até às 23:59:59 do dia 15/05.
    • Deixe seus programas entendíveis. Imprima mensagens para auxiliar o usuário a utilizar o seu programa.
    • Seja criativo. As mensagens do seu programa não necessitam estar iguais aos exemplos, a menos que seja especificado.
    • A lista é individual, portanto não compartilhe seus códigos com outros alunos ou os coloque em locais públicos (Pastebin, Github).
    • Não copie. Se for detectado cópia da internet ou de um colega, as LISTAS envolvidas serão completamente zeradas.
    • Alguns exemplos aqui definidos podem apresentar comentários. Note que são apenas ilustrativos.
    • A correção da Questão Desafio é booleana. Ou seja: você receberá o ponto extra do desafio caso a resposta esteja 100% correta. Qualquer erro, mesmo que seja em apenas um caso, invalidará a questão.
    • Não é permitido o uso da API de Java ou bibliotecas externas, exceto quando permitido explicitamente na questão, na lista, ou autorizado por um monitor através da lista de email (Google Groups) da disciplina. Questões submetidas que violarem essa regra serão consideradas como não entregues.
    • Questões enviadas fora do formato de submissão serão consideradas NÃO ENTREGUES.
    • São permitidas nessa lista, para todas as questões:
    • String
    • Scanner
    • Random

Questão 1 - Constelactus W9K

Um vírus apocalíptico chegou à terra fazendo com que os seres humanos passassem a viver sentados alimentando-se somente de biscoitos com refrigerante, o que lhes proporciona uma vida de no máximo 40 anos e preguiça para estudar.

Devido a isto, nossos amigos e supremos seres de Beeblebrox (chamados inocentemente de ETs) vieram à terra para tentar salvar a espécie humana do declínio atual. Guilhermino, ultimo humano com bons hábitos e um eximio programador,

foi escolhido por eles para (re)transmitir os conhecimentos da humanidade para todos da terra. Para esta tarefa ele ganhou um 'Constelactus W9K', um robô que cabe dentro do ouvido e consegue armazenar todo o conhecimento do universo e transmitir

para a mente de quaisquer outra pessoa, contanto que Guilhermino cadastre os conhecimentos antes.

Guilhermino está encarregado de gerenciar os dados do 'Constelactus W9K' - ele quem cadastra e apaga itens do robô.

Mas, como nem tudo são flores, os Beeblebrox esqueceram o código-fonte do 'Constelactus W9K'. Então, você esta encarregado de programar o 'Constelactus W9K'. Ele terá as seguintes funções:

:add "Conhecimento" "Área"     //Adiciona um conhecimento à área escolhida
:remove "Conhecimento" "Área"  //Remove o conhecimento da área escolhida
:show "*"                      //Exibe todos os conhecimentos adicionados
:show "área"                   //Exibe os conhecimentos da área escolhida
:quit                          //Encerra o programa

Atenção: O método de busca deve ser implementado recursivamente.

As áreas de conhecimento são:

  • "Exatas"
  • "Natureza"
  • "Humanas"
  • "Linguagens"

Exemplo de uso:

:add "A matemática é a mãe das ciências" "Exatas"           // Entrada do usuário
Conhecimento adicionado à 'Exatas'                          // Saída
:add "A água é formada por moléculas de H2O" "Natureza"     // Entrada do usuário
Conhecimento adicionado à 'Natureza'                        // Saída
:remove "A matemática é a mãe das ciências" "Exatas"         // Entrada do usuário
Conhecimento removido de 'Exatas'                           // Saída
:show "*"                                                   // Entrada do usuário
1 - A água é formada por moléculas de H2O                   // Saída
:quit                                                       // Fim do programa

Questão 2 - Save the Itaquimongo City

Após uma longa jornada levando os saberes da humanidade para os humanos perdidos em biscoitos e refrigerante, Guilhermino chega na cidade de Itaquimongo. As lendas sobre a cidade são reais, além da doença nos humanos, a cidade está cheia de Lobicodes, monstros que danificam os códigos ao tocarem em seu código-fonte. Isto quer dizer que, se tocarem no 'Constelactus W9K', este ficará com defeito - e Itaquimongo não será salva.

Sua tarefa é chegar no primeiro humano que conseguir sem tocar em um Lobicodes- se tocar em algum, perderá a missão. Para isto, você terá de criar um mapa de tamanho 6x6 com uma chance de 20% de aparecer um humano ('H') em cada posição e de 10% de aparecer um Lobicodes('L') em cada posição. "_" indica caminho livre (sem humano e sem Lobicodes). Guilhermino deve sempre iniciar no canto inferior direito do mapa.

Exemplo de mapa:

_ L _ _ H _

L _ _ H _ L

_ _ _ _ _ _

_ _ _ _ _ _

L _ _ H _ _

H _ _ _ L G

OBS.:

W - Anda para cima

S - Anda para baixo

A - Anda para a esquerda

D - Anda para a Direita

Bem vindo a Itaquimongo
Salve a cidade, chegue até um humano
_ L _ _ H _
L _ _ H _ L
_ _ _ _ _ _
_ _ _ _ _ _ 
L _ _ H _ _
H _ _ _ L G

a \\Entrada

_ L _ _ H _
L _ _ H _ L
_ _ _ _ _ _
_ _ _ _ _ _ 
L _ _ H _ _
H _ _ _ X _
Que pena, você encontrou um Lobicode. A missão falhou! //Saída
//Fim do programa

Questão 3 - Epaminondas World

Eduardo, um grande desenvolvedor de jogos lhe convidou para desenvolver seu novo jogo: Epaminondas World. Como a grande empresa de Eduardo estava com o prazo atrasado, ele lhe alocou na área de desenvolvimento do sistema de players e equipamentos.

Esta é a sua tarefa:

Crie a classe arma com: nome, nível e poder.

Crie a classe armadura com: nome, nível e vida

Crie a classe jogador com: nome, nível, arma, armadura, ataque e vida

Crie um main que será um simulador de criação do personagem.

Deve ser possível a criação de armas, armaduras, e personagens equipados com esses equipamentos, logo em seguida o sistema deve imprimir todas as informações sobre o personagem para o usuário.

  • Um jogador só pode usar equipamentos (arma e armadura) de nível igual ou inferior ao seu.
  • O nível minimo de um jogador deve ser 1, começando com 100 de vida. Cada nivel a mais que o jogador ganha aumenta sua vida em 10 e seu ataque em 5.
  • Quando ele equipa uma armadura os pontos de hp do jogador se somam aos pontos de vida da armadura
  • Quando o jogador equipa uma arma, os pontos de ataque do jogador se somam aos pontos de poder da arma.
  • O usuário só pode criar uma arma/armadura por vez. Se ele criar uma nova arma/armadura o sistema pode sobreescrever a antiga.(Resumindo, não precisa armazenar)
  • Se o usuário tentar equipar uma arma/armadura não existente o sistema deve enviar uma mensagem e pedir uma nova entrada.
O que deseja fazer?
1- Criar um jogador
2- Criar arma
3- Criar armadura 
4- Sair                       //mensagem do sistema
2  //entrada do usuario
Digite o nome da arma:  //sistema
Dragon Power
Digite o nível da arma  //sistema
3  //entrada do usuario
Digite o poder da arma  //sistema
15  //entrada do usuario
O que deseja fazer?
1- criar um jogador
2- criar arma
3- criar armadura 
4- sair   //mensagem do sistema
1  //entrada do usuario
Digite o nome do jogador //sistema
Epaminondas  //usuario
Digite o nivel do jogador //sistema
5  //usuario
Deseja equipar alguma arma?  //sistema
Sim  //usuario
Digite o nome da arma //sistema
Power Dragon //usuario
Deseja equipar alguma armadura? //sistema
Nao //usuario
Nome: Epaminondas
Nivel: 5
Arma: Power Dragon (Nivel: 3, Poder: 15)
Armadura: vazio
Ataque: 50
Vida: 50
//sistema
//volta pro menu
//O programa só encerra quando o usuário escolher a opção de sair

Questão 4 - Helpinho

Pinho um jogador de dota muito habilidoso resolveu formar um time competitivo, porém após alguns desempenhos negativos ele resolveu criar um sistema onde ele pudesse cadastrar seus jogos passados para evitar de cometer os mesmo erros.

Implemente um sistema onde seja possível cadastrar uma partida, essa partida deve conter o nome dos dois times que participaram, um ID(numérico), a duração da partida, 5 personagens(heróis) de cada time e também os scores dos dois times(eliminações totais de heróis, gold adquirido de cada time).

Um personagem deve conter o nome do mesmo, seu level, sua função no jogo, número de eliminações, número de mortes, número de assistências, quantidades de creeps(unidades) eliminadas e creeps negadas, e a partir desses dados deve se calcular o valor estimado de gold desse personagem no fim da partida e seu gold por minuto(também se deve armazenar esse valor).

OBS: O valor médio adquirido ao se eliminar um creep é de 45 gold, caso se elimine um herói o gold adquirido será de aproximadamente 250 gold, desconsidere a perda de gold.

Sua parte no desenvolvimento desse programa é criar as classes necessárias para o desenvolvimento da questão, criando uma classe main onde essas classes possam ser testadas ou seja, onde se possa cadastrar uma partida e visualizar todos os dados da mesma.

Exemplo:

Olá cadastre sua partida:
Digite o ID desta partida:
144551//entrada
Qual foi a duração deste jogo?//inserir apenas o número
45//entrada
Informe o nome de um dos times:
PinhoTeam//entrada
Cadastre os personagens membros deste time:
Personagem 1 : qual o nome deste personagem?
void//entrada
Qual a função deste personagem?
carry//entrada
Qual level ele alcançou ao fim do jogo?
23//entrada
informe quantos inimigos(herois) ele abateu
15//entrada
Quantas vezes ele foi tirado de combate(morto)?
5//entrada
Quantas vezes ele contribui em eliminações(Assistências)?
20//entrada
Quantas unidades inimigas ele eliminou(creeps)?
250//entrada
Quantas unidades aliadas ele negou(creeps negadas)?
50//entrada
Personagem 2 : qual o nome deste personagem?
//repetir processo de cadastro até se complete os 5 membros do time
...
--PinhoTeam cadastrado com sucesso--//mensagem do sistema
Informe o nome do outro time:
PinhoEnemies//entrada
//repita o processo de cadastro da mesma maneira que ocorreu com o primeiro time.
...
--PinhoEnemies cadastrado com sucesso--//mensagem do sistema
PinhoTeam x PinhoEnemies - xxx ID
 duração:  minutos
 PinhoTeam - xx eliminações-  xx.xxx gold 
 
-membros-
  --- Void  -Carry - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- Chen  - Suporte - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- Pudge - Ganker - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- DarkSeer  - Offlaner- level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- Mirana - Semi -Carry - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
 
PinhoEnemis - xx eliminações-  xx.xxx gold  
 
-membros-
  --- Spectre  - Carry - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- Lion  - Suporte - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- Queen of Pain - Ganker - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- Clock  - Offlaner- level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx
  --- Tuskar - Semi -Carry - level xx - eliminações xx - mortes xx - assistências xx - eliminações creeps xx - creeps negadas xx- gold total xxxxx - gold por minuto xxx

Questão 5 - Egypt Adventures

Pinho era um menino muito atrevido que resolveu se aventurar nas floresta de Peruño Annos. Infelizmente ele não imaginava os perigos que essa floresta escondia!! Após ser capturado pela bruxa Daniela, Pinho foi escravizado e

forçado a trabalhar cuidando dos monstros que Daniela capturava.

Pinho que alem de atrevido era desorganizado está precisando da sua ajuda, pois ele não está conseguindo catalogar todos os monstros no tempo certo e se ele continuar assim a bruxa vai mandar-lo para os "cuidados" de Eduardo, o lenhador. Eduardo gosta muito de lutas e por isso a bruxa Daniela patrocina um evento de UFC com seus monstros para ver Eduardo ficar feliz e tentar ganhar sua atenção.

Crie a classe monstro com: nome, idade, peso, especie, HP, MP, força e inteligencia.

  • Quando um monstro é registrado, Pinho tem que distribuir 5 pontos de atributos para o monstro, dividindo os pontos entre Força e inteligencia. Ex: 3 força e 2 inteligencia.
  • Os pontos devem ser distribuídos em valores não negativos e não nulos e também respeitar o item anterior
  • Se o usuário tentar distribuir mais que cinco pontos ou menos que cinco pontos ele deve ser alertado e o sistema deve que pedir para que ele distribua os pontos novamente.
  • Cada monstro deve iniciar com 100 de HP e 50 de MP (valores sem os atributos estarem distribuídos)
  • Cada ponto de força adiciona 10 de HP
  • Cada ponto de inteligencia adiciona 10 de MP

Crie o main com as opções:

1 - Adicionar monstro     //adiciona um novo monstro
2 - Procurar monstro     //retorna todas as informações (nome, idade, peso...)

3 - Listar monstros //lista todos os monstros cadastrados no sistema até o momento

4 - Modificar monstro   //modifica um monstro existente

5 - Remover monstro //remove um monstro existente

6 - Promover luta     //promove uma luta
7 - Sair             //encerra o programa

Observações:

  • Não é possível adicionar 2 monstros com o mesmo nome, caso isso ocorra o sistema deve alertar a Pinho.(Não levando em consideração as letras maiúsculas Ex: edu = EDU)
  • Se Pinho tentar remover um monstro não existente ele deve ser alertado.
  • Não é possível tentar modificar um monstro não existente, caso isso ocorra o sistema deve alertar a Pinho.
  • Podem haver mais restrições de fluxos no seu programa. Procure alertar ao usuário todas as ações inválidas que ele cometer.

No modo de promover luta o usuário deve escolher 2 monstros registrados para que eles lutem entre si. (o usuário vai procurar o monstro pelo nome)

  • O sistema deve pedir o monstro do usuário e o monstro adversário.
  • Além disso cada monstro começa com 3 poções de HP e 3 poções de MP

A luta é organizada em turnos, ou seja, só se executa uma ação por vez:

Ações:

  1. Atacar
  2. Ataque especial
  3. Usar poção
  4. Gritar por socorro

Descrições:

  1. O comando atacar deve causar um dano aleatório que varia de 0 a 5 vezes a força do monstro e reduz esse valor do HP do adversário.
  2. O ataque especial consome do mp do monstro 5 vezes o valor da sua inteligência e deve gerar um dano aleatório que varia de 0 a 10 vezes o valor da inteligência do monstro.
    1. Se o usuário não tiver mais MP suficiente para dar o ataque especial, ele deve ser alertado e pedir para que ele use outra opção
  3. O programa pergunta se é poção de MP ou HP e recupera 10 do seu atributo.
    1. Se o monstro não tiver mais poções o usuário deve ser alertado e o programa deve pedir para ele usar outra opção.
  4. O sistema imprime uma mensagem de desespero

Sobre a luta:

  • Na rodada do usuário, o próprio usuário escolhe a opção, na rodada do monstro a escolha tem que ser aleatória com 25% de chance para cada opção.
  • A luta termina no momento que um dos dois combatentes perder todo o seu HP
  • Quando a luta terminar deve ser impresso: Fim de luta, o (qual player) ganhou!! e logo após retornar ao menu inicial do programa.
  • Após uma batalha, um mesmo monstro pode entrar em outra batalha e todos os seus atributos tem que estar recuperados, inclusive as poções.


Questão Desafio - Fermat

Estudando Matemática Discreta Dave aprendeu que pelo pequeno teorema de Fermat a^(p-1) == 1 (mod p) se p é primo e a e p são coprimos.

Dave é esperto e ele sabe que se: a == b (mod p) então a*x == b*x (mod p). Com esse conhecimento, Dave percebeu que ele poderia calcular o inverso modular de a mod p, sendo p primo e a e p coprimos, usando o pequeno teorema de Fermat.

a^(p-1) == 1 (mod p)

a^(p-1) * a^-1 == a^-1 (mod p)

a^(p-2) == a^-1 (mod p)

Ou seja, o inverso modular de a mod p é apenas a^(p-2) mod p sendo p um número primo e a e b coprimos.

  • Um número é primo se ele só é divisível por 1 e por ele mesmo.
  • Dois números são coprimos se o máximo divisor comum entre eles é 1.

O usuário deve dar entrada em 2 números separados por uma virgula, o primeiro sendo o A e o segundo sendo o P.

O programa só encerra quando o usuário digita sair.

Para cada caso:

  • Se p não for primo ou a e p não forem coprimos, imprima "Muito Difícil"
  • Caso contrário, imprima "Y" Onde Y é o inverso modular de a mod p.

Dica: Utilize o fato que (a*b)%m é igual a ((a%m)*(b%m))%m. a%b é o resto de a divido por b.

Exemplo

7, 100           //entrada do usuario
Muito difícil    //saida do sistema
19, 101          //entrada do usuario
16               //saida do sistema
1000, 29         //entrada do usuario
23               //saida do sistema
9, 3             //entrada do usuario
Muito difícil    //saida do sistema
Sair             //entrada do usuario
                 //encerra programa