[TDD] Desafio básico de design: Modelagem de "batalha" em um jogo de RPG  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
dreampeppers99
Virtual Machine Man
[Avatar]

Membro desde: 29/08/2006 21:50:17
Mensagens: 523
Offline

O desafio é bem simples, há um cenário e os testes para que vocês façam e demonstrem e/ou expliquem suas decisões de projeto.

Produto: Um jogo RPG chamado Breath of Fantasy
Estória: O esquema de batalha -> Criar o esquema de batalha para o jogo.

Descrição:
A batalha é baseada em turnos, a cada momento um personagem ataca e o outro recebe o ataque. O personagem tem pontos de energia e pontos de poder. Essas duas propriedades contém números inteiros. Por exemplo, se o herói (pontos de energia:60, pontos de poder:45) ataca um inimigo (pontos de energia:60, pontos de poder:45) o inimigo terá seus pontos de energia diminuídos. O dano sofrido, ou seja, os pontos de energia perdidos pelo inimigo, dependem do fator sorte. O fator sorte é um número randômico de 0 a 100 que é dado a cada turno da batalha.
Há quatro tipos de ataques que dependem logicamente do fator sorte:
  • Quando a sorte está em 0-3 então o ataque é Perdido -> não causa dano;

  • Quando a sorte está em 4-70 então o ataque é Normal -> causa 1/3 de seus pontos de poder de danos;

  • Quando a sorte está em 71-96 então o ataque é Sorte -> causa 1/3 de seus pontos de poder mais 20% desses 1/3;

  • E quando a sorte está em 97-100 então o ataque é Crítico -> causa o dobro de um ataque normal.



  • Crie testes que provem que com os personagens acima (herói e inimigo) :
    Quando houver um ataque Perdido não há dano;
    Quando houver um ataque Normal haverá um dano de 1/3 dos pontos de poder;
    Quando houver um ataque Sorte haverá um dano de 1/3 + 20% de 1/3;
    E quando houver um ataque Crítico haverá um dano de duas vezes o dano de um ataque normal.


    Minha solução foi:


    Poste a sua solução!
    Post original : TDD em prática desenvolvendo um jogo

    This message was edited 3 times. Last update was at 27/04/2011 10:05:54


    - Não respondo dúvida por PM!
    - Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
    - Blog - Desenvolvimento de software - Java
    [WWW]
    RafaelViana
    GUJ Master

    Membro desde: 23/03/2008 18:56:02
    Mensagens: 1257
    Localização: Venâncio Aires/RS
    Offline

    Legal esse desafio. Já está favoritado para eu fazer quando sobrar um tempo. Achou em algum site ou você mesmo que criou?

    Observação: Muito bom o seu código.

    Rafael Rodrigues Viana
    Estudando Java e Flex
    Blog: http://www.cauirs.com.br/rafael/

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
    [Email] [MSN]
    dreampeppers99
    Virtual Machine Man
    [Avatar]

    Membro desde: 29/08/2006 21:50:17
    Mensagens: 523
    Offline

    RafaelViana wrote:Legal esse desafio. Já está favoritado para eu fazer quando sobrar um tempo. Achou em algum site ou você mesmo que criou?

    Observação: Muito bom o seu código.

    Obrigado pelos elogios. Eu mesmo criei, reduzi bastante minha ideia original. Sou fã de games, juntei a série Breath of Fire com Final Fantasy para nomear o "jogo" bem simples mesmo, bom pra exercitar o TDD! rsrsrsr

    - Não respondo dúvida por PM!
    - Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
    - Blog - Desenvolvimento de software - Java
    [WWW]
    Two_
    JavaGuru

    Membro desde: 03/12/2009 18:01:53
    Mensagens: 240
    Localização: Belo Horizonte, MG
    Offline

    meus jogos preferidos hehehehe FF e BOF
    [Email]
    dreampeppers99
    Virtual Machine Man
    [Avatar]

    Membro desde: 29/08/2006 21:50:17
    Mensagens: 523
    Offline

    Two_ wrote:meus jogos preferidos hehehehe FF e BOF

    O triste é saber que o Breath of Fire está fora dos planos da Capcom para lançar nova versão.

    - Não respondo dúvida por PM!
    - Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
    - Blog - Desenvolvimento de software - Java
    [WWW]
    Two_
    JavaGuru

    Membro desde: 03/12/2009 18:01:53
    Mensagens: 240
    Localização: Belo Horizonte, MG
    Offline

    dreampeppers99 wrote:
    Two_ wrote:meus jogos preferidos hehehehe FF e BOF

    O triste é saber que o Breath of Fire está fora dos planos da Capcom para lançar nova versão.

    Triste mesmo. Final Fantasy já está uma *** nessa ultima versão.
    Só acho que a chance de errar um ataque deve ser baseado em outros atributos, como por exemplo o "AGI" x "EVASION" do herói - inimigo.
    [Email]
    dreampeppers99
    Virtual Machine Man
    [Avatar]

    Membro desde: 29/08/2006 21:50:17
    Mensagens: 523
    Offline

    Two_ wrote:
    dreampeppers99 wrote:
    Two_ wrote:meus jogos preferidos hehehehe FF e BOF

    O triste é saber que o Breath of Fire está fora dos planos da Capcom para lançar nova versão.

    Triste mesmo. Final Fantasy já está uma *** nessa ultima versão.
    Só acho que a chance de errar um ataque deve ser baseado em outros atributos, como por exemplo o "AGI" x "EVASION" do herói - inimigo.

    Concordo com você sobre o Final Fantasy e sobre "errar o ataque também", porém pensei em deixar o mais simples possível

    - Não respondo dúvida por PM!
    - Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
    - Blog - Desenvolvimento de software - Java
    [WWW]
    Two_
    JavaGuru

    Membro desde: 03/12/2009 18:01:53
    Mensagens: 240
    Localização: Belo Horizonte, MG
    Offline

    Uns 2 ou 3 anos atrás eu fiz um joguinho bem simples parecido com Final Fantasy Tactics, pena que foi em C/C++. Caso queira tenho o código em algum CD/DVD em algum local na minha casa hehehehe
    [Email]
    Marky.Vasconcelos
    Moderador
    [Avatar]

    Membro desde: 11/04/2007 18:18:20
    Mensagens: 5932
    Localização: São Paulo/SP
    Offline

    Opa, amanhã eu penso melhor nisso. Gostei do desafio.

    Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

    Projects:
    Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
    Towel ( ObjectTableModel & Swing & Utils )
    Tower Defense Game - Java2D [Open-Source] [How-to-play]
    EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

    DefaultTableModel?! PARE! Não faça isso! Faça melhor!

    Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

    Develop games is fantastic, with words you can make worlds!!!

    DON'T PANIC!
    MarkyHitchhiker's Blog!
    [WWW] [MSN]
    dreampeppers99
    Virtual Machine Man
    [Avatar]

    Membro desde: 29/08/2006 21:50:17
    Mensagens: 523
    Offline

    Two_ wrote:Uns 2 ou 3 anos atrás eu fiz um joguinho bem simples parecido com Final Fantasy Tactics, pena que foi em C/C++. Caso queira tenho o código em algum CD/DVD em algum local na minha casa hehehehe

    Então isso vai facilitar você no desafio.

    - Não respondo dúvida por PM!
    - Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
    - Blog - Desenvolvimento de software - Java
    [WWW]
    Daniels
    JavaGuru

    Membro desde: 25/07/2008 14:19:39
    Mensagens: 218
    Offline

    Achei legal o desafio.

    Fiz minha versão aqui, rapidamente. Não gostei de algumas coisas(os ifs da AttackFactory, por exemplo. Cheguei a usar o else porque um if embaixo do outro estava me dando agonia hehe). Usei TDD conforme descrito(sim, vi todos os testes falharem antes de começar a implementar), acho válido citar porque muita gente pode acabar fazendo o teste por último.


    Enfim, abaixo minha solução:

    Testes:



    Implementação:

















    Daniels
    JavaGuru

    Membro desde: 25/07/2008 14:19:39
    Mensagens: 218
    Offline

    Pensando aqui, eu mudaria os testes para iterar por todo o intervalo e não testar apenas as extremidades. É um pouco mais custoso, mas é o mais correto.
    dreampeppers99
    Virtual Machine Man
    [Avatar]

    Membro desde: 29/08/2006 21:50:17
    Mensagens: 523
    Offline

    Daniels wrote:Pensando aqui, eu mudaria os testes para iterar por todo o intervalo e não testar apenas as extremidades. É um pouco mais custoso, mas é o mais correto.

    Gostei da sua solução.
    Você, antes, falava que não gostou do uso dos if's para devolver a instância correta para o Attack.
    Há muito tempo atrás eu estava tentando implementar um emulador de NES em java (JNesBR) e lá eu resolvi um problema parecido com esse de um modo "dispatch".



    Dai quando fosse executar a instrução dado o opcode era simplesmente ir no array e pegar a instância relacionada com aquele código.



    Claro no caso dos ataques, que contém intervalos, sei lá talvez um map e repetindo a chave para o valor daria certo e evitaria os if's. Mais uma vez sua solução foi muito boa.

    - Não respondo dúvida por PM!
    - Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
    - Blog - Desenvolvimento de software - Java
    [WWW]
    ViniGodoy
    Moderador
    [Avatar]

    Membro desde: 11/12/2006 08:22:01
    Mensagens: 20580
    Localização: Curitiba/PR
    Offline

    Eu criaria um mock do gerador de números aleatórios, que só gerasse os números que eu quisesse. Como vc está testando o sistema de ataque, e não a classe random, isso tornaria os testes extremamente simples. Você poderia gerar números sequenciais e ver o que aconteceu em cada caso, garantindo assim o seu sistema com 100% de certeza.

    Mas claro, para facilitar seria bom alterar um pouquinho as classes para que os randoms pudessem ser fornecidos, ou fossem criados por injeção de dependências. Caso contrário, vc seria obrigado a altera-los por reflexão.

    This message was edited 1 time. Last update was at 27/04/2011 08:30:15


    @ViniGodoy - Lattes

    Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

    Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
    Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

    Ei... você está usando DefaultTableModel no seu projeto??
    Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
    [WWW]
    dreampeppers99
    Virtual Machine Man
    [Avatar]

    Membro desde: 29/08/2006 21:50:17
    Mensagens: 523
    Offline

    ViniGodoy wrote:Eu criaria um mock do gerador de números aleatórios, que só gerasse os números que eu quisesse. Como vc está testando o sistema de ataque, e não a classe random, isso tornaria os testes extremamente simples. Você poderia gerar números sequenciais e ver o que aconteceu em cada caso, garantindo assim o seu sistema com 100% de certeza.

    Mas claro, para facilitar seria bom alterar um pouquinho as classes para que os randoms pudessem ser fornecidos, ou fossem criados por injeção de dependências. Caso contrário, vc seria obrigado a altera-los por reflexão.


    Eu (tentei) fiz foi isso mesmo o mock para o fator sorte!


    - Não respondo dúvida por PM!
    - Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
    - Blog - Desenvolvimento de software - Java
    [WWW]
     
    Índice dos Fóruns » Java Básico
    Ir para:   
    Powered by JForum 2.1.8 © JForum Team