Mudanças entre as edições de "Projeto POO - 2013.2"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(10 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 12: Linha 12:
 
* Cada pokemon possui '''4 golpes de luta''' (2 fracos e 2 fortes), sendo que cada '''golpe''' possui o '''dano que causa''' e a '''probabilidade de acerto'''.
 
* Cada pokemon possui '''4 golpes de luta''' (2 fracos e 2 fortes), sendo que cada '''golpe''' possui o '''dano que causa''' e a '''probabilidade de acerto'''.
 
** '''Golpes fortes''' possuem uma probabilidade menor de acerto (40%)
 
** '''Golpes fortes''' possuem uma probabilidade menor de acerto (40%)
*** Envenenamento - Faz com que o adversário perca 30% de sua vida ao final da rodada em que foi usada.  
+
*** Envenenamento - Faz com que o adversário perca 30 pontos de sua vida ao final da rodada em que foi usada.  
*** Queimadura - Faz com que o adversário perca 30% de sua vida ao final da rodada em que foi usada.  
+
*** Queimadura - Faz com que o adversário perca 30 pontos de sua vida ao final da rodada em que foi usada.  
 
** '''Golpes fracos''' possuem uma probabilidade maior de acerto (80%)
 
** '''Golpes fracos''' possuem uma probabilidade maior de acerto (80%)
 
*** Paralisia - Faz com que o adversário tenha sua velocidade de ataque reduzida em 20% a cada que for usada. Se usado diversas vezes contra o mesmo pokemon, este terá sua velocidade reduzida em no máximo em 80%.
 
*** Paralisia - Faz com que o adversário tenha sua velocidade de ataque reduzida em 20% a cada que for usada. Se usado diversas vezes contra o mesmo pokemon, este terá sua velocidade reduzida em no máximo em 80%.
*** Soco - Faz com que o adversário perca 10% de sua vida ao final da rodada em que foi usada.  
+
*** Soco - Faz com que o adversário perca 10 pontos de sua vida ao final da rodada em que foi usada.  
 
* Cada pokemon possui um único '''item especial''' e que só pode ser usado uma única vez durante a batalha
 
* Cada pokemon possui um único '''item especial''' e que só pode ser usado uma única vez durante a batalha
 
** Recuperar vida - Faz com que o nível de vida do pokemon selecionado fique novamente cheio
 
** Recuperar vida - Faz com que o nível de vida do pokemon selecionado fique novamente cheio
Linha 27: Linha 27:
  
 
A tabela abaixo indica os valores de ataque, defesa e velocidade de cada pokemon. Também indica qual tipo de pokemon tem vantagem e desvantagem sobre outros tipos.
 
A tabela abaixo indica os valores de ataque, defesa e velocidade de cada pokemon. Também indica qual tipo de pokemon tem vantagem e desvantagem sobre outros tipos.
* A vantagem significa: Se o pokemon do tipo Fogo atacar um pokemon do tipo Gelo, então a força do seu ataque será aumentada em 50%. Supondo que tenha usado um golpe forte, que tem um dano de 30%, então este ataque será de 45%.
+
* A vantagem significa: Se o pokemon do tipo Fogo atacar um pokemon do tipo Gelo, então a força do seu ataque será aumentada em 50%. Supondo que tenha usado um golpe forte, que tem um dano de 30, então este ataque será de 45.
* A desvantagem significa: Se o pokemon do tipo Fogo atacar um pokemon do tipo Água, então a força do seu ataque será reduzida em 50%. Supondo que tenha usado um golpe forte, que tem um dano de 30%, então este ataque será de 15%.
+
* A desvantagem significa: Se o pokemon do tipo Fogo atacar um pokemon do tipo Água, então a força do seu ataque será reduzida em 50%. Supondo que tenha usado um golpe forte, que tem um dano de 30, então este ataque será de 15.
 +
 
 +
* O resultado de um ataque é calculado da seguinte forma:
 +
 
 +
<math>
 +
resultado = \begin{cases} (fA + nA - nD) * (pV) , & \mbox{se o atacante tiver vantagem sobre o atacado} \\ (fA + nA - nD) * (pD) , & \mbox{se o atacante tiver desvantagem sobre o atacado} \end{cases}
 +
</math>
 +
 
 +
sendo, <math>fA</math> a força do ataque, <math>nA</math> o nível de ataque do atacante, <math>nD</math> o nível de defesa do pokemon que está sendo atacado, <math>pV</math> para indicar o multiplicador de vantagem para o ataque ou <math>pD</math> para indicar o multiplicador de desvantagem para o ataque. Se <math>resultado</math> ficar negativo, então deve-se deixá-lo com o valor <math>=0</math>.
 +
 
 +
 
  
 
===Lista dos pokemons===
 
===Lista dos pokemons===
Linha 75: Linha 85:
  
 
===Códigos das mensagens usadas no protocolo de comunicação===
 
===Códigos das mensagens usadas no protocolo de comunicação===
 +
package poo;
 +
public class Mensagem{
 +
    public int codigo;
 +
    public String corpo;
 +
    public Mensagem(int cod, String co){
 +
      this.codigo = cod;
 +
      this.corpo = corpo;
 +
    }
 +
}
 +
  
 
{| border="1" cellpadding="2"
 
{| border="1" cellpadding="2"
Linha 85: Linha 105:
 
|-
 
|-
 
| 102 || Aguarde || Mensagem enviada pelo servidor para o primeiro jogador que se conectou. É usada para informar que o adversário ainda não entrou na sala  
 
| 102 || Aguarde || Mensagem enviada pelo servidor para o primeiro jogador que se conectou. É usada para informar que o adversário ainda não entrou na sala  
 +
|-
 +
| 110 || Bate papo || Mensagem enviada do cliente para o servidor e vice-versa para trocar mensagens no bate papo
 +
|-
 +
| 120 || Desconectar || Cliente envia para o servidor indicando que irá sair. Servidor envia para cliente para informar que o outro Cliente saiu
 
|-
 
|-
 
| 200 || 0:1:2:3:4:5 || Cliente envia para o servidor os códigos dos pokemons que selecionou. Cada código é separado por : e os códigos iniciam de 0 a vão até 9  
 
| 200 || 0:1:2:3:4:5 || Cliente envia para o servidor os códigos dos pokemons que selecionou. Cada código é separado por : e os códigos iniciam de 0 a vão até 9  
Linha 120: Linha 144:
 
| 339 || pokemon 9 || Enviada pelo cliente para indicar que escolheu o pokemon de código 9
 
| 339 || pokemon 9 || Enviada pelo cliente para indicar que escolheu o pokemon de código 9
 
|-
 
|-
| 600 || 0=100:1=100:2=100:3=100:4=100:5=100 || Enviada pelo servidor para cada um dos clientes no início de cada rodada. Serve para os clientes poderem atualizar na tela as informações sobre seus pokemons. O conteúdo da mensagem é formado pelo código do pokemon seguido pelo seu nível de vida, que são separados pelo símbolo = . A separação dos pokemons também é feita pelo símbolo :, assim como na mensagem 200.  
+
| 600 || 0=100:1=100:2=100:3=100:4=100:5=100:6=50 || Enviada pelo servidor para cada um dos clientes no início da batalha. Serve para os clientes iniciarem em sua tela as informações sobre seus pokemons e também do pokemon do adversário que está na arena. O conteúdo da mensagem é formado pelo código do pokemon seguido pelo seu nível de vida, que são separados pelo símbolo = . A separação dos pokemons também é feita pelo símbolo :, assim como na mensagem 200. O último bloco (separado por :) representa o pokemon do adversário.
 
|-
 
|-
 
| 500 || (0):0=100:0=100 || Enviada pelo servidor para os clientes no final de cada rodada para informar qual jogador realizou a ação primeiro (0 para o jogador1 e 1 para o jogador2), qual a vida do pokemon que está na arena de cada jogador, sendo que o primeiro pokemon apresentado é do jogador1 e o último é do jogador2. A lógica da separação do código dos pokemons e da vida é a mesma da mensagem 600.
 
| 500 || (0):0=100:0=100 || Enviada pelo servidor para os clientes no final de cada rodada para informar qual jogador realizou a ação primeiro (0 para o jogador1 e 1 para o jogador2), qual a vida do pokemon que está na arena de cada jogador, sendo que o primeiro pokemon apresentado é do jogador1 e o último é do jogador2. A lógica da separação do código dos pokemons e da vida é a mesma da mensagem 600.
Linha 126: Linha 150:
  
 
|}
 
|}
 +
 +
==Diagramas UML==
 +
 +
===Diagrama de classes===
 +
 +
Abaixo uma sugestão para organização das classes no projeto
 +
 +
[[Arquivo:Javamon-diagrama-de-classe.png|800px]]
 +
 +
===Diagrama de sequência===
 +
 +
Abaixo um diagrama de sequência para ilustrar as trocas de mensagens entre clientes e servidor
 +
 +
[[Arquivo:Javamon-diagrama-de-sequencia.png|800px]]
 +
 +
==Códigos de referência==
 +
 +
===Exemplo de como desenhar com API do Java2D e para fazer animações===
 +
*[[Media:Javamon-AnimacaoJ2D.zip| Projeto Netbeans Animação J2D]]
 +
 +
===Exemplo de bate-papo para atender mais de um cliente===
 +
*[[Media:JavaRede-Multithread.zip| Projeto Netbeans Bate-papo para vários clientes]]
 +
 +
  
 
==Soluções dos alunos==
 
==Soluções dos alunos==

Edição atual tal como às 10h11min de 15 de dezembro de 2013

O projeto final da disciplina Programação Orientada a Objetos poderá ser desenvolvido em dupla e deverá ser apresentado em sala no dia 16 de dezembro de 2013.

Javamon - Clone do Jogo Pokemon

Desenvolver um jogo em Java usando somente as APIs do Java 2D. O jogo requer 2 jogadores interagindo através da rede de computadores. Trata-se de uma batalha por rodada. A cada rodada cada jogador escolhe a ação desejada para seu pokemon e o vencedor da rodada dependerá da análise dos golpes, movimentos, etc que foram executados por cada pokemon.

Regras do jogo

  • O jogo deverá oferecer 10 tipos de pokemons
  • Cada jogador deverá ter 6 pokemons, escolhidos dentre os 10 possíveis
  • O jogo termina quando todos os pokemons de um jogador forem derrotados
  • Um jogador poderá escolher um pokemon por vez para participar de uma batalha. Quando um pokemon é derrotado, o jogador poderá escolher outro para colocar em seu lugar, desde que ainda tenha pokemons disponíveis.
  • Cada pokemon possui 4 golpes de luta (2 fracos e 2 fortes), sendo que cada golpe possui o dano que causa e a probabilidade de acerto.
    • Golpes fortes possuem uma probabilidade menor de acerto (40%)
      • Envenenamento - Faz com que o adversário perca 30 pontos de sua vida ao final da rodada em que foi usada.
      • Queimadura - Faz com que o adversário perca 30 pontos de sua vida ao final da rodada em que foi usada.
    • Golpes fracos possuem uma probabilidade maior de acerto (80%)
      • Paralisia - Faz com que o adversário tenha sua velocidade de ataque reduzida em 20% a cada que for usada. Se usado diversas vezes contra o mesmo pokemon, este terá sua velocidade reduzida em no máximo em 80%.
      • Soco - Faz com que o adversário perca 10 pontos de sua vida ao final da rodada em que foi usada.
  • Cada pokemon possui um único item especial e que só pode ser usado uma única vez durante a batalha
    • Recuperar vida - Faz com que o nível de vida do pokemon selecionado fique novamente cheio
    • Curar - Remove o efeito do golpe Paralisia que tenha sido aplicado anteriormente, ou seja, a velocidade do pokemon volta ao seu nível original
  • Todo pokemon possui um nível de vida que inicia no nível máximo que é 100
  • Todo pokemon possui um nível de ataque que vai de 0 a 50
  • Todo pokemon possui um nível de defesa que vai de 0 a 50
  • Todo pokemon possui um nível de velocidade que vai de 0 a 50. A velocidade determina quem irá atacar primeiro.
    • Se o nível de velocidade for o mesmo para os dois pokemons em uma batalha, então é feito um sorteio para determinar quem inicia primeiro

A tabela abaixo indica os valores de ataque, defesa e velocidade de cada pokemon. Também indica qual tipo de pokemon tem vantagem e desvantagem sobre outros tipos.

  • A vantagem significa: Se o pokemon do tipo Fogo atacar um pokemon do tipo Gelo, então a força do seu ataque será aumentada em 50%. Supondo que tenha usado um golpe forte, que tem um dano de 30, então este ataque será de 45.
  • A desvantagem significa: Se o pokemon do tipo Fogo atacar um pokemon do tipo Água, então a força do seu ataque será reduzida em 50%. Supondo que tenha usado um golpe forte, que tem um dano de 30, então este ataque será de 15.
  • O resultado de um ataque é calculado da seguinte forma:

sendo, a força do ataque, o nível de ataque do atacante, o nível de defesa do pokemon que está sendo atacado, para indicar o multiplicador de vantagem para o ataque ou para indicar o multiplicador de desvantagem para o ataque. Se ficar negativo, então deve-se deixá-lo com o valor .


Lista dos pokemons

Tipo Pokemon Ataque Defesa Velocidade Vantagens Desvantagens
Fogo Ponyta 37 24 39 Gelo/Inseto Água/Terrestre
Gelo Shellder 32 49 19 Planta/Voador Fogo/Pedra
Planta Bulbasaur 34 34 32 Água/Terrestre Inseto/Gelo
Água Goldeen 35 31 34 Fogo/Pedra Planta/Elétrico
Pedra Geodude 40 50 10 Gelo/Elétrico Água/Lutador
Voador Hoothoot 27 27 46 Planta/Lutador Gelo/Elétrico
Inseto Caterpie 35 45 20 Terrestre/Planta Fogo/Lutador
Terrestre Sandshrew 38 43 19 Fogo/Elétrico Planta/Inseto
Elétrico Pikachu 31 19 50 Água/Voador Terrestre/Pedra
Lutador Mankey 43 19 38 Pedra/Inseto Voador

Requisitos do jogo

  • Todo pokemon deverá possui 2 imagens para sua representação gráfica. Uma imagem para quando este estiver de frente e outra quando este estiver de costas.
    • Todas imagens deverão ter obrigatoriamente a dimensão de 80x80 pixels
  • Ao término do jogo, ou seja, quando um jogador teve todos seus pokemons derrotados, deve-se perguntar aos jogadores se desejam iniciar uma nova partida
  • Todos os métodos deverão ser comentados, de acordo com o padrão do JavaDOC, e dentro dos métodos é necessário comentar cada parte de seu funcionamento chave
  • Todo o código estará sob a licença de software livre GPL

Códigos das mensagens usadas no protocolo de comunicação

package poo;
public class Mensagem{
   public int codigo;
   public String corpo;
   public Mensagem(int cod, String co){
      this.codigo = cod;
      this.corpo = corpo;
   }
}


Código Corpo Descrição da mensagem
100 Nome do Jogador Mensagem para enviar os nomes dos jogadores. Cada jogador ao conectar no servidor deve inicialmente fornecer seu nome. O servidor também envia esta mensagem para os clientes para informar os nomes dos adversários.
102 Aguarde Mensagem enviada pelo servidor para o primeiro jogador que se conectou. É usada para informar que o adversário ainda não entrou na sala
110 Bate papo Mensagem enviada do cliente para o servidor e vice-versa para trocar mensagens no bate papo
120 Desconectar Cliente envia para o servidor indicando que irá sair. Servidor envia para cliente para informar que o outro Cliente saiu
200 0:1:2:3:4:5 Cliente envia para o servidor os códigos dos pokemons que selecionou. Cada código é separado por : e os códigos iniciam de 0 a vão até 9
301 ataque forte 1 Enviada pelo cliente para indicar que escolheu o ataque forte 1
311 ataque forte 2 Enviada pelo cliente para indicar que escolheu o ataque forte 2
312 ataque fraco 1 Enviada pelo cliente para indicar que escolheu o ataque fraco 1
313 ataque fraco 2 Enviada pelo cliente para indicar que escolheu o ataque fraco 2
320 item 1 Enviada pelo cliente para indicar que escolheu o item 1
321 item 2 Enviada pelo cliente para indicar que escolheu o item 2
330 pokemon 0 Enviada pelo cliente para indicar que escolheu o pokemon de código 0
331 pokemon 1 Enviada pelo cliente para indicar que escolheu o pokemon de código 1
332 pokemon 2 Enviada pelo cliente para indicar que escolheu o pokemon de código 2
333 pokemon 3 Enviada pelo cliente para indicar que escolheu o pokemon de código 3
334 pokemon 4 Enviada pelo cliente para indicar que escolheu o pokemon de código 4
335 pokemon 5 Enviada pelo cliente para indicar que escolheu o pokemon de código 5
336 pokemon 6 Enviada pelo cliente para indicar que escolheu o pokemon de código 6
337 pokemon 7 Enviada pelo cliente para indicar que escolheu o pokemon de código 7
338 pokemon 8 Enviada pelo cliente para indicar que escolheu o pokemon de código 8
339 pokemon 9 Enviada pelo cliente para indicar que escolheu o pokemon de código 9
600 0=100:1=100:2=100:3=100:4=100:5=100:6=50 Enviada pelo servidor para cada um dos clientes no início da batalha. Serve para os clientes iniciarem em sua tela as informações sobre seus pokemons e também do pokemon do adversário que está na arena. O conteúdo da mensagem é formado pelo código do pokemon seguido pelo seu nível de vida, que são separados pelo símbolo = . A separação dos pokemons também é feita pelo símbolo :, assim como na mensagem 200. O último bloco (separado por :) representa o pokemon do adversário.
500 (0):0=100:0=100 Enviada pelo servidor para os clientes no final de cada rodada para informar qual jogador realizou a ação primeiro (0 para o jogador1 e 1 para o jogador2), qual a vida do pokemon que está na arena de cada jogador, sendo que o primeiro pokemon apresentado é do jogador1 e o último é do jogador2. A lógica da separação do código dos pokemons e da vida é a mesma da mensagem 600.

Diagramas UML

Diagrama de classes

Abaixo uma sugestão para organização das classes no projeto

Javamon-diagrama-de-classe.png

Diagrama de sequência

Abaixo um diagrama de sequência para ilustrar as trocas de mensagens entre clientes e servidor

Javamon-diagrama-de-sequencia.png

Códigos de referência

Exemplo de como desenhar com API do Java2D e para fazer animações

Exemplo de bate-papo para atender mais de um cliente


Soluções dos alunos

Grupo Licença Código Fonte