Mudanças entre as edições de "Projeto POO - 2013.2"
(22 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 | + | *** 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 | + | *** 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 | + | *** 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 | * 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 fique novamente cheio | + | ** Recuperar vida - Faz com que o nível de vida do pokemon selecionado fique novamente cheio |
− | ** Curar - Remove o efeito | + | ** 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 | + | * Todo pokemon possui um nível de ataque que vai de 0 a 50 |
− | * Todo pokemon possui um nível de velocidade | + | * 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=== | ||
+ | |||
+ | {| border="1" cellpadding="2" | ||
+ | !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== | ==Requisitos do jogo== | ||
Linha 32: | 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.
- Golpes fortes possuem uma probabilidade menor de acerto (40%)
- 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
Diagrama de sequência
Abaixo um diagrama de sequência para ilustrar as trocas de mensagens entre clientes e servidor
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
|
---|