Lista 3

Recomendações Importantes

    • A lista deve ser entregue até às 23:59:59 do dia 30/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 - O Pônei Saltitante

Cevado Carrapicho é o proprietário da taverna Pônei Saltitante, em Bri. A vida de taverneiro é bastante corrida, principalmente numa vila tão movimentada como

essa, onde toda a sorte de viajante procura um lugar para passar a noite.

Os clientes mais comuns costumam ser: Homens, Elfos e Hobbits. Ultimamente alguns Orcs também decidiram frequentar o Pônei, e andam quebrando mesas quando a

bebida sobe a cabeça. Carrapicho não sabia mais como gerenciar o lugar e estava à beira de fechar o estabelecimento quando, seu grande amigo Gandalf trouxe você,

programador, para a Terra Média com o seu notebook para resolver o problema! É melhor correr pois a bateria do seu computador só durará até 30 de maio =D

Seguem algumas descrições para facilitar a sua vida:

Todos os clientes possuem:

  • Nome
  • Dinheiro
  • Limite de Álcool Points
  • Nível de Álcool Points atual
  • Bebida Preferida
  • Quantas doses da Bebida Preferida eles precisam para deixar a casa.

O engraçado é que quando o cliente bebe demais (Álcool points >= Limite de Álcool) ativa o modo Perda Total que varia para cada um.

  • Homens: vomitam no chão (Imprima em que mesa eles estavam para que Carrapicho possa fazer a limpeza. Ex: "Sujeira na mesa 15, pegando o esfregão...").
  • Elfos: pagam uma rodada extra da Bebida Preferida de cada um para a mesa inteira!!! - não importa quanto custe, Carrapicho aceita se eles passarem um cheque e deixarem a casa (Muitos Sarumans para Carrapicho $.$).
  • Hobbits: dançam para a alegria do pessoal (Imprima qual música para que Carrapicho possa anotar no caderno quais músicas o povo prefere).
  • Orcs: Batem na mesa e quebram tudo (Carrapicho agora colocará duas mesas para cada uma quebrada, depois de remover os cacos da mesa, e expulsará os bagunceiros).

Todos são clientes, mas o modo Perda Total não é o mesmo para todos e alguns têm características peculiares (Use o conceito de herança).

Seguem as bebidas preferidas da galera:

  • Homens: Cerveja - 5 Álcool points. Preço: 2,00 Sarumans
  • Hobbits: Hidromel - 4 Álcool points. Preço: 3,00 Sarumans
  • Elfos: Vinho - 3 Álcool points. Preço: 6,50 Sarumans
  • Orcs: Carreteiro Batizado - 10 Álcool points. Preço: 0,50 Sarumans >.<"

O cilente deixa a casa quando fica sem dinheiro para comprar algo ou bebeu o suficiente de sua bebida preferida, e podem pedir qualquer bebida que o dinheiro puder pagar - sempre tenta comprar a mais cara para a mais barata.

Carrapicho não gosta de bagunça no Pônei, então sempre que alguém sair, os bebuns devem ocupar aquele lugar (nada de buracos no array, vagas só no fim). Cada mesa possui um número e um array de Clientes.

O menu do programa deve seguir esse padrão:

1- Add Mesa // As mesas comportam 5 clientes e esse número não deve ser alterado. O pônei começa com vaga para 3 mesas, adicione de acordo com a necessidade.

2- Remover Mesa // Se remover a única mesa, feche a casa.

3- Add Cliente // Se houver vaga na mesa coloque o cilente, se não coloque na seguinte... se não tiver, ponha uma mesa nova.

4- Remover Cliente //Acha o cliente se existir e remove da taverna.

5- Lançar Rodadas MesaX // Vá a uma mesaX e atenda aos pedidos da galera, receba adiantado =P

6 - Fechar a Casa // Ao fechar a casa, imprima quantas mesas foram quebradas, vômitos limpos, as músicas cantadas e quanto Carrapicho ganhou na noite.

Submenu Add Cliente:

1- Homem

2- Hobbit

3- Elfo

4 - Orc

5- Voltar

Obs1: O programa só deve encerrar quando a opção fechar a casa for escolhida ou todas as mesas forem removidas.

Obs2: +2 pontos na questão se ao remover uma mesa, os clientes que estavam lá (menos os bagunceiros enxotados) forem redistribuídos nas demais mesas já existentes.

Questão 2 - Bilbo e Smaug

Todo mundo conhece a história sobre Bilbo, um hobbit tranquilo e Smaug o calango alado que dormia na Montanha Solitária... Enquanto você trabalhava para ajudar Carrapicho, Bilbo depois de ter tomado algumas jarras de hidromel acabou dizendo como realmente foram as coisas.

Ele contou que quando o terrível dragão acordou, a única coisa que pairava na sua mente malévola era... COMER. Vocês não fazem idéia da fome que dá por dormir tantos anos. Smaug prometeu não fritar o hobbit se ele ajudasse a regular a sua dieta, como Bilbo não fazia idéia do que fazer, Gandalf summonou o seu Avô, exímio programador do CIn na terra média - é aí que o álcool fala mais alto...

Você ficou curioso e vai reproduzir o incrível sistema "Fire and Death Fitness", a dieta de Smaug inclui:

  • Homens. Carne vermelha, equivalentes a 120 guloseimas.
  • Elfos. Magros demais, equivalente a 80 guloseimas.
  • Anões. Meio rançoso, mas robusto equivalente a 200 guloseimas.
  • Orcs. Gosto horrível, mas são como verduras para o nosso amigo lagarto e é preciso comê-los às vezes... 150 guloseimas
  • Wargs. Lobos gigantes que contém fibra alimentar, ajuda na digestão do dragão. -250 guloseimas

Através de um mapa AxB, Smaug deve voar e escolher suas refeições através dos comandos W, A, S e D do teclado, ingerindo grupos de 1000 guloseimas por dia durante 10 dias. Imprima na tela o que Smaug está comendo em cada área para que o seu Avô possa monitorar o progresso do dragão. Quando atingir sua meta diária ele deve parar de comer loucamente e apenas comer Orcs e Wargs por um dia(24hrs), durante esse tempo ele deve voar a procura desses espécimes, mas ele é alvo de flechas dos grupos que ele não come enquando faz a sua busca... Compute 150 de dano sofrido toda vez que ele sobrevoar uma área que não contém o que ele pode comer, se ele juntar 10000 de dano sofrido, nosso dragãozinho vai pras cucuias - imprima que raça derrotou o dragão, quantos dias Smaug está voando, e pague a bebida predileta do cidadão de bem!

Mal sabe seu avô que se terminar os 10 dias sem virar frango assado, Smaug irá provar o gosto de Calouro do CIn - imprima na tela "Virei espetinho, Bonna petit!".

Ao encerrar o programa com a vitória de Smaug sobre a balança descreva quantos indivíduos de cada raça foram almoçados, quantos dias Smaug voôu e o peso final do dragão.

Dados:

Cada Guloseima x 0,5kgs+ (Guloseimas negativas X -0,5kgs).

Ao devorar uma área, os habitantes do local devem ser repostos aleatoriamente(Ex: Smaug comeu um anãozinho rechonchudo, a próxima vez que ele passar por lá pode ser um Orc ou Hobbit, etc... - randomicamente)

Smaug demora 2 horas para voar de uma área para outra, e não pode se mover na diagonal apenas para cima e para baixo, esquerda e direita, imprima quando ele tentar voar para um local além de seus domínios.

O peso inicial do dragão é 30 humildes toneladas.

Have Fun Dragonslayer!

Digite os limites de altura e largura (A e B) para gerar o mapa.
5 5 // entrada do usuário
O mapa gerado foi:
H A H E E
E W O H A
W W A E O
O A H E H
W H A O S // <-Smaug está aqui 
Escolha para onde voar (W,A,S,D).
W // Entrada do usuário
Voando para cima... Hmn... humanos saborosos
//Imprima o novo mapa gerado com a reposição da área e a nova localização de Smaug
Escolha para onde voar (W,A,S,D).
W
Voando para cima... Hmn... Orcs, tem gosto de beterraba =C
Escolha para onde voar (W,A,S,D).
D
Não podemos voar até aí =/

Questão 3 - Sarupinho

Sarupinho era um poderoso mago, que um dia foi puro e ajudava no controle da paz na terra média. Agora ele é um mago com o coração corrompido pelas forças cruéis de Sauron (a mesma pessoa que faz a lista de IP e de álgebra de vocês). Influenciado por Sauron, Sarupinho deve fazer um exército para lutar contra os bravos guerreiros defensores da terra média: Gimly, Aragorn, Legolas (estamos desconsiderando os Hobbits pq eles são inúteis na batalha e só ficam carregando aquele anel que deixa o cara dependente de crack, mas a batalha acabará se Sarupinho capturar o anel por algum motivo que eu, o narrador, não sei). O seu objetivo é travar uma batalha na terra média.

O exército da terra média é composto por Elfos, Anões e Humanos e o de Sauron é composto por Orcs, Goblins Arqueiros e Uruk-hais. Os campeões da terra média são Aragorn, Gimly e Legolas. Os campeões de Sarupinho são Espectro, Balrog e Warg-arqueiro

//------------------------------------------------Humanos/Orcs--------------------------------------------------------------------

-Atributos

Pontos de vida (HP): 100

Dano causado: 30

Dano bloqueado: 10

Chance de bloqueio: 50%

Chance de acerto : 100%

-Ações

Ataque: Causa dano no inimigo se ele não for bloqueado.

//-----------------------------------------------Elfos/Goblins Arqueiros-------------------------------------------------------

-Atributos

Pontos de vida(HP): 50

Dano causado : 50

Dano bloqueado: 5

Chance de acerto : 50%

Chance de bloqueio: 0%

-Ações

Ataque: Causa dano no inimigo se ele não for bloqueado.

//----------------------------------------------Anões/Uruk-Hais----------------------------------------------------------------

-Atributos

Pontos de vida(HP): 150

Dano causado: 20

Dano bloqueado: 30

Chance de acerto: 100%

Chance de bloqueio: 70%

-Ações

Ataque: Causa dano no inimigo ignorando o bloqueio.

//--------------------------------------------Campeões------------------------------------------------------------------------

Aragorn:

Possui as mesmas ações dos Humanos e os atributos são dobrados (menos as chances de acerto e bloqueio). Possui a habilidade especial (ação) "Double Hit" (Ataca duas vezes no turno).

Legolas:

Possui as mesmas ações dos Elfos e os atributos são dobrados(menos as chances de acerto e bloqueio). Possui a habilidade especial (ação) "Headshot" (Aumenta a chance de acerto para 90% e aumenta o dano em 10 no turno).

Gimly:

Possui as mesmas ações dos Elfos e os atributos são dobrados(menos as chances de acerto e bloqueio). Possui a habilidade especial "Beserk""(Tira um dano randômico que vai de 10 - 90 no turno).

Espectro:

Possui as mesmas ações dos Orcs e os atributos são dobrados (menos as chances de acerto e bloqueio). Possui a habilidade especial (ação) "Soul Reap" (Mata um inimigo instantaneamente, mas só pode ser usado uma vez).

Warg - Arqueiro:

Possui as mesmas ações dos goblins arqueiros e os atributos são dobrados(menos as chances de acerto e bloqueio). Possui a habilidade especial (ação) "Mounted Fury" (Aumenta o dano em 20 no turno).

Balrog:

Possui as mesmas ações dos Uruk-hais e os atributos são dobrados (menos as chances de acerto e bloqueio). Possui a habilidade especial(ação) "Fire slash" (Tira 50 de dano ignorando o bloqueio).

//--------------------------------------------Regras-------------------------------------------------------------------------

A soma das unidades de ambos exércitos (sem contar com os campeões) é no máximo 10 mas pode ser menos para testes.

As linhas dos exércitos estarão distribuidas da seguinte maneira:

Sarupinho/Frodo

................................... Arqueiros/Goblins arqueiros/Legolas/Warg arqueiro

................................... Anões/Uruk-hais/Balrog/Gimly

................................... Humanos/Orcs/Aragorn/Espectro

Só se pode atacar as unidades das próximas linhas se todas as unidades das linhas anteriores forem mortas.

Os arqueiros são uma exceção a essa regra, mas seguem essa regra de ataque nos turnos : Ataque - 1 turno de delay - Ataque.

Todas as habilidades dos campeões (fora a soul reap) só podem ser usadas no máximo 3 vezes.

A batalha acaba quando todas as unidades de um exército estiverem mortas.

Os turnos funcionam assim:

1 - Ataque : Linha de frente (se não existir será a segunda linha) e campeão dessa linha ---> Arqueiros e campeão arqueiro ---> fim.

2 - Os defensores da terra média atacam primeiro.

3 - Os lacaios de Sarupinho atacam depois.

4 - Acaba o turno.

OBS:

1 - As unidades básicas devem ser armazenadas em um repositório e os campeões em outro.

2 - A ordem de ataque das linhas segue a ordem do repositório de array, se elas não estiverem mortas é claro.

3 - Use herança.

4 - Use orientação a objetos.

5 - Imprima a quantidade de unidades no fim de cada turno.

6 - Imprima o ganhador no final da batalha.

7 - As entradas devem ser validadas.

8 - Crie uma interface amigável com o usuário.

9 - Se divirta, você está fazendo uma simulação de guerra.

Boa sorte general :)

Questão 4 - Erick Riobravo

Como todos sabem, hobbits gostam de beber e comer bastante. Erick Riobravo é um hobbit particularmente beberrão e estava sentindo falta de bons bares em seu condado.

Um dia, um indivíduo apareceu nesse condado, ele se chamava Programador. Erick foi o primeiro a falar com o indivíduo e descobriu que ele poderia ajudá-lo a administrar um bar com os poderes mágicos das coisas estranhas que ele controlava chamadas "Computadores", chegando a compará-lo com um velho mago cinzento que passara pro lá em eras antigas. Você é Programador, um estudante que caiu na terra média e irá ajudar Erick Riobravo a montar seu bar.

Você achou um bom livro para ajudá-lo em sua jornada, vamos lá!

"Como montar um bar para hobbits em Java, por Thays Fogovivo."

1) Um bar precisa de aperitivos e bebidas deliciosas para fazer sucesso que são inseridos no cardápio segundo o dono desse bar;

2) O estoque do bar precisa ser controlado para não haver imprevistos com constantes impressoes do numero de comidas de bebidas;

3) Sempre que você necessitar buscar algo, isso deve ser feito;

4) Caso o estoque acabe, é necessário enchê-lo e dobrar o seu tamanho;

5) Cada bebida tem uma identificação numérica, pois hobbits adoram números;

6) Cada alimento tem um nome para sua identificação, hobbits adoram nomes criativos para pratos;

7) Se o dono do bar quiser retirar um alimento ou bebida do cardápio, isso deverá ser possível;

8) Um bar deve possuir um método que simule uma noite com hobbits, ou seja, o estoque será esvaziado seguindo a seguinte fórmula

  • Bebidas consumidas = numero de hobbits no bar * 2;
  • Alimentos consumidos = numero de hobbits no bar/2; (Sempre arredondado pra cima).

9) Por último, um bar precisa de um método que imprima todos os dados do bar, como número de comidas e bebidas, nome do bar e quantidade de noites de bebedeira de hobbits que o bar hospedou;

Requisitos do bar:

  • Inicialmente você deve criar um método que insira bebidas em comidas em seus respectivos repositórios e sempre que o usuário quiser. O numero e os atributos desses são escolhidos pelo usuário.
  • Deve existir um método que procura comidas e outro que procura bebidas e retornar uma mensagem alertando se há ou não esse tipo de bebida no repositório.
  • Caso o estoque acabe, deve haver um método que dobre o seu tamanho.
  • Caso o estoque acabe é necessário encher ele pelo menos com uma comida e com uma bebida a escolha do usuário.
  • Caso o usuário deseje retirar uma comida ou bebida do estoque ele poderá fazê-lo usando um método criado por você.
  • Um estoque é considerado vazio se não houver mais comidas e/ou bebidas nele.
  • Deve existir um método que simula uma noitada, seguindo a fórmula descrita no livro.
  • Se o número de alimentos consumidos for maior que tem no estoque, o estoque é zerado (tudo que tem no estoque some, bebes e comes).
  • Deve existir um método que imprime os dados do bar: Quantidade de comidas e bebidas no estoque, o nome do bar e a quantidade de noitadas que aconteceram naquele bar.
  • Na noitada, o número resultado das duas fórmulas deve ser retirado dos repositórios de comida e de bebida, retirando os elementos da direita pra esquerda.
  • O programa deve acabar quando o comando "/close" for escrito no console e deve possuir um menu para que o usuário escolha o que ele quer fazer (inserir, deletar elemento.
  • Escreva uma interface amigável e que valide as entradas, o usuário deverá escolher os valores dos atributos das comidas e bebidas.

Programador, agora é sua vez.

Boa sorte, hobbits famintos nunca são fáceis de lidar.

Questão 5 - Kept you waiting, huh?

Solid Snake é um lendário espião, chamado sempre que o mundo está a triz do caos total. Depois da sua última missão, na ilha de Shadow Moses, Snake percebeu que precisa de uma maneira melhor de gerenciar todos os itens que carrega em durante suas missões, pois não dá pra passar 5 minutos procurando o maldito maço de cigarros pra no final achá-lo dentro de uma caixa de papelão, ao lado do RPG-7 e embaixo de 3 dúzias de granadas.

Como seu amigo Otacon está muito atarefado, construindo um novo Metal Gear, esse trabalho ficou pra você. Você vai precisar criar um sistema que cadastre todos os possíveis itens que Snake pode encontrar ao decorrer de sua missão, e também auxiliar ele na hora de buscar e usar um desses itens.

Esse sistema deve gerenciar os seguintes tipos de itens:

  • Item Padrão
  • Item Especial
  • Item Consumível
  • Arma

Dados relevantes:

  • Todos os itens tem, obrigatoriamente, um id numérico, um nome, uma descrição, e um peso.
  • Um item padrão não sofre desgaste de uso, e que pode ser utilizado quantas vezes Snake quiser.
  • Um item especial funciona da mesma maneira que um item padrão, porém por ter sido dado a Snake por alguém importante (Cujo nome deve ser atrelado ao item), não pode ser excluído do inventário, a não ser que uma nova missão comece.
  • Um item consumível é bem parecido com um item padrão, mas possui um limitador de uso/quantidade. Caso a limitação seja de quantidade, o peso total do item equivale ao seu peso padrão x quantidade. Em caso contrário, o peso permanece sempre inalterado.
  • Uma arma é um item que, além de ter seu próprio peso, possui também o peso de cada munição(Bala, míssel, dardo, etc). Além disso, possui também um contador de munição, e um tamanho de um pente de munições. O peso total de uma arma deve levar em conta toda a munição associada à mesma. Ao utilizar uma arma, deve ser avisado a Snake quando ele estiver no seu último pente ou se ele só possuir cinco munições ou menos. (O que vier primeiro)

De posse dessas informações, você deve criar um programa que gerencie os itens para Snake. Esse sistema deve permitir que ele execute as seguintes operações:

1 - Iniciar Missão

Limpa todo o inventário, solicita a Snake o máximo de peso em Kg que ele pretende carregar durante a missão, e adiciona automaticamente um maço de cigarros (Os dados desse item estão definidos no exemplo de execução).

2 - Adicionar item

Executa uma série de perguntas que permite que Snake cadastre um novo item no sistema.

3 - Procurar item

Executa uma procura através do nome do item (Pode ser parcial). Caso a busca retorne mais de um item, esses devem ser listados para que Snake escolha um. Ao fim da operação, o sistema deve exibir todas as informações do item selecionado.

4 - Listar itens

Lista todos os itens do inventário, e permite que Snake escolha um deles para ser detalhado.

5 - Utilizar item

Executa uma busca por nome (Análoga ao item 3), ou diretamente através do id numérico. Ao fim da operação, o item é utilizado. No caso de uma arma, uma munição é disparada.

6 - Excluir item

Executa uma busca por nome (Análoga ao item 3), ou diretamente através do id numérico. Ao fim da operação, o item é eliminado do inventário.

7 - Finalizar Gerenciador

Termina a execução do programa

1 - Iniciar nova missão
2 - Adicionar item
3 - Procurar item
4 - Listar itens
5 - Utilizar item
6 - Excluir item
7 - Finalizar Gerenciador
> 1
Iniciando missão... Qual o peso máximo dessa vez Snake?
> 150
Inventário preparado. Boa sorte Snake.
1 - Iniciar nova missão
2 - Adicionar item
3 - Procurar item
4 - Listar itens
5 - Utilizar item
6 - Excluir item
7 - Finalizar Gerenciador
> 5
Insira o termo de busca ou id
> gar
Item encontrado

Id: 001

Nome: Cigarros

Peso: 0.200 Kg

Desc: Um maço de cigarros da marca preferida de Snake. Sua utilização pode acabar com sua saúde.

Tipo: Padrão

Snake, você utilizou o item '001 - Cigarros'.
1 - Iniciar nova missão
2 - Adicionar item
3 - Procurar item
4 - Listar itens
5 - Utilizar item
6 - Excluir item
7 - Finalizar Gerenciador
> 5
Insira o termo de busca ou id
> 1
Item encontrado

Id: 001

Nome: Cigarros

Peso: 0.200 Kg

Desc: Um maço de cigarros da marca preferida de Snake. Sua utilização pode acabar com sua saúde.

Tipo: Padrão

Snake, você utilizou o item '001 - Cigarros'.
1 - Iniciar nova missão
2 - Adicionar item
3 - Procurar item
4 - Listar itens
5 - Utilizar item
6 - Excluir item
7 - Finalizar Gerenciador
> 7
Snake, você está aí? SNAKE? SNAAAAAAAKE?!?!?!

Observações:

  • Lembre-se de utilizar herança durante a implementação da questão. Explique na forma de comentário no seu código as escolhas feitas.
  • Snake usará o gerenciador no meio do campo de batalha, e não pode ter muito cuidado durante a utilização do programa. Por isso, tente tratar todos os fluxos errados que seu programa pode cometer e avise a Skane o que ele está fazendo de errado. (Um bom exemplo é se Snake tentar usar um item consúmivel que se encontra zerado). Existem muitos outros casos, encontrar e tratar esses casos faz parte da avaliação da questão. Crie uma classe vazia "Briefring", que contém apenas um texto (Em forma de comentário) listando e explicando os fluxos errôneos que seu programa trata.
  • O gerenciador deve guardar todos os itens em apenas um array, que possui inicialmente tamanho 5. Crie uma política de gerenciamento do tamanho desse array para quando o mesmo ficar lotado, e explique através de comentário sua decisão.
  • Ao excluir um item do array, o mesmo deve ser reordenado para que não hajam posições vazias em meio aos outros itens.

Questão Desafio - Olhe e fale

Implemente uma função recursiva que devolva o n-ésimo número da sequencia "olhe e fale", definida da seguinte maneira:

  • 1 é o primeiro número da sequencia.
  • 1 é lido como "um 1", logo o segundo valor da sequencia é 11.
  • 11 é lido como "dois 1s", logo o terceiro valor é 21.
  • 21 é lido como "um 2, então um 1", logo temos 1211.
  • 1211 é lido como "um 1, então um 2, então dois 1s", logo temos 111221.
  • 111221 é lido como "três 1s, então dois 2s, então um 1", logo temos 312211.

Sequencia: 1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211...

Digite o n:
> 10
13211311123113112211