Lista 3

Recomendações Importantes

    • A lista deve ser entregue até às 23:59:59 do dia 05/01/2013.
    • 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.
    • São permitidas nessa lista, para todas as questões, a não ser que exista alguma restrição na questão:
    • String
    • Scanner

Questão 1 - Corretor Recursivo

Seu chefe está com problemas no antigo editor de texto da empresa. Ao digitar os relatórios, quando caracteres iguais aparecem juntos, ocorre um erro fatal e o programa é finalizado. Como você é um estagiário promissor, ele pediu que você elaborasse um programa para separar os caracteres iguais com asteriscos, para não haver problemas. Mas como ele é exigente, a implementação deve ser de forma recursiva.

Exemplo:
Insira seu texto:
//Entrada

Do mesmo modo, o consenso sobre a necessidade de qualificação desafia a capacidade de equalização das direções preferenciais no sentido do progresso.

//Saída
Texto Corrigido:

Do mesmo modo, o consenso sobre a neces*sidade de qualificação desafia a capacidade de equalização das direções preferenciais no sentido do progres*so.

Insira seu texto:
//Entrada

Aaaa, abc, ooeea, dia 11/11 / 2000

//Saída
Texto Corrigido:
Aa*a*a, abc, o*oe*ea, dia 1*1/1*1 / 20*0*0

OBS:

    1. Não é permitido nenhum tipo de laço.
    2. Deve haver apenas uma função (além do main), com a seguinte assinatura: public String corrigirTexto (String texto);
    3. Permitido o uso dos métodos String.charAt, String.length e String.substring apenas.
    4. Não é permitido imprimir no console dentro da função corrigirTexto.

Questão 2 - JavaKut

Para competir com a Rede Social Consolebook, você foi designado para elaborar o JavaKut, uma rede social inovadora que não possui conexão com a web nem banco de dados... e em JAVA!


Para isso você precisará criar as seguintes classes:


Usuário

• Atributos: Nome, Idade, Lista de Amigos, Senha, Email, Mensagens Recebidas, Comunidades;

• Métodos: toString() - retorna uma String com "Usuário: "+Nome + Email;

Comunidade

• Atributos: Nome, Descrição, Quantidade de Membros;

• Métodos: toString() - retorna uma String com "Comunidade: "+Nome + Quantidade de Membros;

Mensagem

• Atributos: Destinatário(Um ou vários), Remetente, Texto;

• Métodos: toString() - retorna uma String com "Mensagem: "+Remetente;



A Classe JavaKut possui, no mínimo, os métodos:

login

logout

cadastrarUsuario


E, no mínimo, dois atributos:

Lista de Usuários

Lista de Comunidades


JavaKut funciona dessa maneira:


1) Ao iniciar o programa, você deve escolher entre Logar, se Cadastrar ou Fechar Programa;

1.1) Se escolher o cadastro, você deve preencher os campos Nome, Idade, Email e Senha e Confirmar Senha. Caso os campos Senha e Confirme Senha estejam diferentes, peça para que o usuário digite novamente; Se o Email já estiver cadastrado, imprima a mensagem "Email já cadastrado" e volte à tela inicial;

1.1.1)Ao digitar a senha, deve ser impresso um campo "Força da Senha", que é medido de 0 a 10 de acordo com as seguintes condições:

+3 se tamanho for >=3 ;

+2 se tamanho for >=6;

+2 se possuir letras e números;

+3 se possuir letras, números e caracteres especiais (por exemplo: ' , ", [ );

Máximo: |========>10| Mínimo: |1|

Exemplo: 123a

Força da Senha: |===>5|

1.2) No login será necessário que o Email e Senha estejam corretos;


2) Ao logar, de acordo com o horário atual do seu computador, será impresso uma mensagem de BoasxVindas. Por exemplo, às 20h será impresso: Boa Noite, NomeDoUsuárioLogado;


Exemplo:


1- Login
2- Cadastrar
3- Fechar programa


2 //Cadastrar


Informe seu nome:
Mark Zuckerberg //entrada
Informe sua idade:
27
Email:
markinho@concorrente.com
Senha:
123abc
Força da Senha: |=====>7|
Confirme Senha:
123abc


Cadastro Realizado com Sucesso!


1- Login
2- Cadastrar
3- Fechar Programa


1 // Login


Email:
markinho@concorrente.com
Senha:
123abc


Boa Noite, Mark Zuckerberg!
0 mensagens recebidas – 0 nova(s)


Opções:
1- Ler Mensagens
2- Adicionar Amigo
3- Procurar Pessoa
4- Criar Comunidade
5- Adicionar Comunidade
6- Procurar Comunidade
7- Deixar Comunidade
8- Enviar Mensagem
9- Logout
10- Excluir Conta


As opções funcionam da seguinte maneira:


1. Imprime as descrições das mensagens recebidas e destaca as mensagens que forem novas com a TAG (Mensagem Não-Lida). Logo após, você escolhe qual deseja ler;

2. Para adicionar um amigo, utiliza-se o email. Para completar essa operação, o amigo deve aceitar a solicitação. Ou seja, quando o amigo "logar", ele deve escolher se aceita ou não a solicitação. Caso for aceito, quando o solicitante logar novamente, deve ser impresso a mensagem: "AmigoSolicitado aceitou sua amizade";

3. Para procurar uma Pessoa, utiliza-se parte do nome; Deve ser impresso o nome completo e o Email. Se for digitado um asterisco, as descrições de todos os Usuários da rede devem ser impressas;

4. Ao criar uma comunidade, deve-se escolher o nome e descrição, e automaticamente adicioná-la nas Comunidades do criador.

5. Adiciona comunidade pelo Nome nas Comunidades do Usuário;

6. Mesmo mecanismo de Procurar Pessoa. Porém, deve ser impresso o Nome e Quantidade de Membros.

7. Sai de determinada comunidade. (Utilize o Nome para identificar a comunidade);

8. Envia uma mensagem apenas para Amigo(s); (Contém, no mínimo, um destinatário); Se algum destinatário não for seu Amigo, imprima a mensagem: "Não foi possível enviar a mensagem para 'NomeDoAmigoInexistente' ";

9. Volta à tela Inicial de Login/Cadastro/Fechar Programa;

10. A conta é excluída. Todos os amigos, ao logarem,devem ser avisados e ninguém mais pode ter você na Lista de Amigos;


OBS:

    1. Os métodos e atributos descritos na questão não são suficientes para o pleno funcionamento do programa. Elabore os restantes que sejam necessários para a implementação.
    2. Para armazenamento, é permitido o uso de arrays ou ArrayList..
    3. Caso algo não foi especificado diretamente, interprete e elabore o pedido da melhor forma possível de acordo com as boas práticas de programação e os conceitos vistos em aula;

Questão 3 - Legend of Hyrule

Hyrule é uma terra bastante perigosa, mas Link é um herói corajoso que fará tudo para proteger a princesa Zelda. Ela está correndo um grande perigo, e Link começará sua grande aventura com o objetivo de encontrá-la no Castelo antes que se passem 2 dias! A missão acaba com sucesso caso Link chegue ao castelo a tempo; ou com derrota caso Link morra ou não chegue a tempo.

1 - Parte:

Deve ser gerado aleatoriamente um mapa (array bidimensional 5 x 10) com as seguintes características geográficas:

OBS:

    • Castelo e posição original de Link não contam como terreno.
    • Link começará sua aventura na posição inferior-direita do mapa(L) e o castelo na superior-esquerda (C)

2ª Parte

Mas Link não está sozinho! Também há monstros criados por Ganondorf para prejudicáxlo em sua jornada. Pena que Link tem apenas 3 corações =\

OBS:

    • A probabilidade é calculada apenas quando é um terreno permitido
    • Símbolo n -> nenhum monstro.
    • Corações perdidos por Link num eventual encontro durante o caminho

3ª Parte

Deve ser possível controlar Link pelo mapa através de entradas no console. (w -> cima; a->esquerda, d->direita, s->baixo). Caso algum movimento não seja possível, o jogador deve ser avisado.

OBS: Não é possível movimentar-se diagonalmente.

Exemplo de funcionamento:

“Vida: s2 s2 s2”
“Horas restantes: 48”
“Mapa \ Monstros”

C x x x ^ x = x ^ x C n n n > n n ~ n n

^ _ x x x _ x x o x > n n n n n n n n n

^ x x x o x x x o x n n n n n n n n n n

x x = x x x o x x x n n n n n n n ~ n n

x = x _ x o x ^ x L n n n n n n n n L

\\Entrada
a
“Vida: s2 s2”
“Horas restantes: 46”
“Mapa \ Monstros”

C x x x ^ x = x ^ x C n n n > n n ~ n n

^ _ x x x _ x x o x > n n n n n n n n n

^ x x x o x x x o x n n n n n n n n n n

x x = x x x o x x x n n n n n n n ~ n n

x = x _ x o x ^ L n n n n n n n n f L

Questão 4 - LeString

Você, um entusiamado aluno de IP, depois de ouvir seus monitores dizendo inúmeras vezes que não dá pra sair usando bibliotecas a torto e a direito, resolveu implementar sua própria versão da String, a LeString.

A LeString possui apenas um atributo, um array de char que guarda as informações. Um dos monitores, com toda sua bondade e proatividade, até deu um pedaço de código, de onde pode se começar a implementação da classe.

public class LeString {


private char[] leString;


public LeString (String string){

this.leString = new char[string.length()];

for(int i=0;i<string.length();i++){

this.leString[i] = string.charAt(i);

}

}


public String toString(){

String string="";

for(char c : this.leString){

string+= c;

}

return string;

}

}

A partir desse código, você deve implementar os seguintes métodos na classe LeString:

    • char charAt (int index)
    • int compareTo (LeString leString)
    • int compareToIgnoreCase (LeString leString)
    • LeString concat (LeString leString)
    • boolean contains (LeString leString)
    • boolean endsWith (LeString leString)
    • boolean equals (LeString leString)
    • boolean equalsIgnoreCase (LeString leString)
    • int indexOf (char ch)
    • int indexOf (char ch, int fromIndex)
    • int indexOf (LeString leString)
    • int indexOf (LeString leString, int fromIndex)
    • int lastIndexOf (char ch)
    • int lastIndexOf (char ch, int fromIndex)
    • int lastIndexOf (LeString leString)
    • int lastIndexOf (LeString leString, int fromIndex)
    • LeString replace (LeString target, LeString replacement)
    • LeString replace (char target, char replacement)
    • boolean startsWith (LeString leString)
    • LeString subString (int beginIndex)
    • LeString subString (int beginIndex, int endIndex)
    • LeString toLowerCase ()
    • LeString toUpperCase ()

OBS: Não se deve usar a classe String em nenhum momento, além do que pode ser visto no construtor LeString e no toString (Que já estão prontos no código exemplo). O uso da classe String em qualquer outro ponto do código acarretará na anulação da questão.

OBS2: Todos os métodos acima listados são equivalentes aos encontrados na classe String. Logo, em caso de dúvida sobre o que cada método faz, consulte a documentação em:

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

Questão 5 - Java on the Rocks

Heitor, jornalista de jogos, te passou um contato de um amigo dele, Corraino, desenvolvedor de jogos.

Corraino, interessado pela mão de obra barata dos alunos de IP do CIn, decidiu deixar o núcleo da lógica de seu mais novo jogo em cargo desses alunos, enquanto ia pro boteco tomar uma com os amigos.

Sua tarefa é implementar o sistema de batalha desse jogo.

Segue o documento que o desenvolvedor te enviou:

Obrigado por aceitar em me ajudar :D

Aqui está o que eu preciso:

Você deve implementar um campeonato entre jogadores, em que cada Personagem participante deve lutar com todos os outros, e o primeiro lugar será aquele que venceu mais vezes.

Cada objeto da classe Personagem deve ter como atributos:

* força - inteiro

* agilidade - inteiro

* inteligencia - inteiro

* nome - string

* saúde - inteiro

* arma - Arma

* escudo - Escudo

E ter como métodos:

* calcularDano() - Dano

Usa Arma.calcularDano(Personagem) para calcular o dano

* calcularDefesa(Dano) - Dano

usa Escudo.calcularDefesa(Personagem,Dano) para calcular quanto deve receber de dano

* sofrerDano(Dano) - void

remove de sua saúde a soma dos componentes do Dano

* reiniciar() - void

Se prepara para mais uma luta, recuperando toda sua saúde e igualmente reiniciando seu Escudo e Arma

O construtor deve receber parametros de tipos (int,int,int,Arma,Escudo), que sao relativos a (forca,agilidade,inteligenca,arma,escudo)

Além de getters e setters para seus atributos.

A classe Arma deve ter como metodos:

* calcularDano(Personagem), que calcula quanto Dano um ataque deve causar levando em conta atributos do Personagem.

* reiniciar(), que reinicia todos os contadores internos de quaisquer efeitos dessa Arma.

A classe Escudo deve ter como metodo

* calcularDefesa(Personagem,Dano), que calcula quanto Dano o Personagem deve realmente receber, levando em conta os atributos do Personagem.

* reiniciar(), que reinicia todos os contadores internos de quaisquer efeitos desse Escudo.

A classe Dano deve ter como atributos:

* danoFisico - inteiro

* danoMagico - inteiro

e getters e setters adequados.

A classe Personagem deve ser extendida em 3 outras classes:

* Mago

Após calcular o Dano usando a sua Arma, multiplica o dano mágico desse Dano por 2.

* Arqueiro

Após calcular o Dano usando a sua Arma, multiplica o dano físico desse Dano por 2.

* Guerreiro

Quando for `sofrerDano`, divide o Dano total recebido pela metade antes de deduzir ele da sua saúde.

A classe Arma deve ser extendida em 6 outras classes:

* EspadaLonga

Causa 2 * forca + 1 * agilidade como dano físico

Causa 1 * inteligencia como dano mágico

* ArcoLongo

Causa 2 * agilidade + 1 * forca como dano físico

Causa 1 * inteligencia como dano mágico

* Cetro

Causa 1 * inteligencia como dano físico

Causa 3 * inteligencia como dano mágico

* Besta

Causa 3 * agilidade como dano físico

Causa 0 como dano mágico

A cada 3 ataques, causa 2 * agilidade como dano magico

* Cimitarra

Causa 2 * agilidade + 2 * forca como dano físico

Causa 0 como dano mágico

* LivroArcano

Causa 0 dano físico

Causa 3 * inteligencia como dano mágico

A cada 3 ataques, causa dano físico igual ao dano mágico

A classe Escudo deve ser extendida em 4 outras classes:

* EscudoMadeira

Divide por 2 o dano físico recebido

* EscudoFerro

Divide por 3 o dano físico recebido

* EscudoOuro

Divide por 2 o dano físico recebido

Divide por 2 o dano mágico recebido

* EscudoArcano

Divide por 2 o dano mágico recebido

A cada 3 defesas, subtrai 1 * inteligencia do dano recebido

Cada luta segue a estrutura a cada turno:

Ambos Personagens atacam e calculam o Dano causado

Ambos Personagens defendem o Dano causado por seu inimigo, reduzindo-o se conseguirem.

Ambos Personagens recebem o Dano causado, e reduzem sua saúde.

Se algum Personagem morreu, o outro Personagem vence (caso ambos morram no mesmo turno, eles empatam e não ganham nenhum ponto)

Caso ninguém morra, o processo se repete.

Algumas regras:

* O Personagem morre quando sua saúde chega a zero.

* Cada Personagem inicia a luta com 50 de saúde.

* Todos os personagens devem ficar armazenados em um array de Personagem

* Não é permitido usar nenhuma variável de subclasses de Personagem

* Não é permitido usar nenhuma variável de subclasses de Arma

* Não é permitido usar nenhuma variável de subclasses de Escudo

* Não é permitido instanciar nenhum objeto de classe Personagem, somente Arqueiro, Mago ou Guerreiro

* Não é permitido instanciar nenhum objeto de classe Arma, somente as classes listadas lá acima.

* Não é permitido instanciar nenhum objeto de classe Escudo, somente as classes que estendem Escudo que já foram citadas.

* ou seja (sem levar em contas o formato correto do construtor),



       Guerreiro g = new Guerreiro() // ERRADO

Personagem p = new Personagem() // ERRADO

Personagem p = new Guerreiro() // CERTO

p.setArma(new Arma()) // ERRADO

p.setArma(new EspadaLonga()) //CERTO

* O array de personagens deve ser preenchido pelo usuário:



       //inicio do programa

Quantos competidores irão batalhar? 5

Competidor numero 1:

Nome? Rodrigo

Qual tipo de Personagem ele é? Guerreiro

Qual sua força? 6

Qual sua agilidade? 5

Qual sua inteligencia? 3

Qual sua Arma? Cimitarra

Qual seu Escudo? EscudoFerro.

Competidor numero 2:

Nome? Thiago

Qual tipo de Personagem ele é? Mago

Qual sua força? 2

Qual sua agilidade? 4

Qual sua inteligencia? 7

Qual sua Arma? Cimitarra

Qual seu Escudo? EscudoFerro.

//etc...


Ranking:


Rodrigo - 3 vitórias

Thiago - 2 vitórias

Walter - 2 vitórias

Erick - 1 vitória


Campeonato Finalizado.

//Fim do programa

Questão 6 (Desafio) - Legend of Ganondorf

Ganondorf, astuto como sempre, mandou construir barreiras que Link não consegue atravessar. Portanto, antes de começar sua jornada, Link tem de descobrir se existe algum caminho até o Castelo. Mas como ele é preguiçoso, você terá que implementar um método recursivo para descobrir se esse caminho existe. Otimize seu algoritmo para que não visite um terreno mais de uma vez.

//Entrada (5 x 10) console
C x x x x x x x x x x
x x b x x x x x x x x
b b b b b b b b x x x
x x x x x x x x x x x
x x x x x x x x x x L
//Saída
Existe um caminho!
//Entrada 2
C x b x x x x x x x x
x x b x x x x x x x x
b b b b b b b b x x x
x x x x x x x x x x x
x x x x x x x x x x L
//Saída 2
Não é possível chegar ao Castelo =\