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
 
(17 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
 
** Curar - Remove o efeito do golpe Paralisia que tenha sido aplicado anteriormente, ou seja, a velocidade do pokemon volta ao seu nível original  
 
** 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 vida que inicia no nível máximo que é 100
* Todo pokemon possui um nível de ataque, que vai de 0 a 50 e que deve ser inversamente proporcional ao seu nível de defesa, que também vai de 0 a 50. Ou seja, quanto maior o nível de ataque, menor será o nível de defesa
+
* Todo pokemon possui um nível de ataque que vai de 0 a 50
* Todo pokemon possui um nível de velocidade, que durante o início de uma rodada determina quem irá atacar primeiro. Este nível é de 1 a 5
+
* 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
 
** 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:
 +
 +
<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 53: Linha 68:
 
| Terrestre || Sandshrew ||38 ||43 ||19  || Fogo/Elétrico || Planta/Inseto
 
| Terrestre || Sandshrew ||38 ||43 ||19  || Fogo/Elétrico || Planta/Inseto
 
|-
 
|-
| Elétrico  || Pikachu ||31 ||18 ||51 || Água/Voador || Terrestre/Pedra
+
| Elétrico  || Pikachu ||31 ||19 ||50 || Água/Voador || Terrestre/Pedra
 
|-
 
|-
 
| Lutador  || Mankey ||43 ||19 ||38  || Pedra/Inseto || Voador
 
| Lutador  || Mankey ||43 ||19 ||38  || Pedra/Inseto || Voador
Linha 68: Linha 83:
 
* Todos os métodos deverão ser comentados, de acordo com o padrão do [http://pt.wikipedia.org/wiki/Javadoc JavaDOC], e dentro dos métodos é necessário comentar cada parte de seu funcionamento chave
 
* Todos os métodos deverão ser comentados, de acordo com o padrão do [http://pt.wikipedia.org/wiki/Javadoc 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 [http://pt.wikipedia.org/wiki/GNU_General_Public_License GPL]
 
* Todo o código estará sob a licença de software livre [http://pt.wikipedia.org/wiki/GNU_General_Public_License 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;
 +
    }
 +
}
 +
 +
 +
{| border="1" cellpadding="2"
 +
!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
 +
 +
[[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]]
 +
  
  

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