Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package predojo.vo; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.joda.time.DateTime; import org.joda.time.Duration; /** * * @author Tony */ public class JogadorVO implements Comparable { private final String nome; private Integer quantidadeMortes = 0; private final List<AssassinatoVO> assassinatos; private Integer maiorQuantidadeAssassinatosAteMorte = 0; private Integer quantidadeAssassinatosAteMorte = 0; private Boolean possuiTrofeuCincoAssassinatosEmUmMinuto = false; public JogadorVO(String nome) { this.nome = nome; this.assassinatos = new ArrayList<>(); } public String getNome() { return nome; } public Integer getQuantidadeAssassinatos() { return this.assassinatos.size(); } public Integer getQuantidadeMortes() { return quantidadeMortes; } public Integer getMaiorQuantidadeAssassinatosAteMorte() { return maiorQuantidadeAssassinatosAteMorte; } private void morrer() { this.quantidadeMortes++; // Identificar a maior sequencia de assassinatos efetuadas por um jogador sem morrer dentro da partida if (this.quantidadeAssassinatosAteMorte > this.maiorQuantidadeAssassinatosAteMorte) { this.maiorQuantidadeAssassinatosAteMorte = this.quantidadeAssassinatosAteMorte; } this.quantidadeAssassinatosAteMorte = 0; } public void assassinar(JogadorVO jogadorMorto, ArmaVO armaUtilizada, Date dataHoraAssassinato) { if (jogadorMorto == null) return; if (armaUtilizada == null) return; if (dataHoraAssassinato == null) return; jogadorMorto.morrer(); if (this.nome.equalsIgnoreCase("<WORLD>")) return; AssassinatoVO assassinato = new AssassinatoVO(jogadorMorto, armaUtilizada, dataHoraAssassinato); this.assassinatos.add(assassinato); this.quantidadeAssassinatosAteMorte++; // Contabilizar numero assassinatos ultimo minuto if (!possuiTrofeuCincoAssassinatosEmUmMinuto && this.assassinatos.size() >= 5) { // Repupera data e hora do quinto ultimo assassinato DateTime dataHoraQuintoUltimoAssassinato = new DateTime( this.assassinatos.get(this.assassinatos.size() - 5).getDataHoraAssassinato().getTime()); // Repupera data e hora do ultimo assassinato DateTime dataHoraUltimoAssassinato = new DateTime( this.assassinatos.get(this.assassinatos.size() - 1).getDataHoraAssassinato().getTime()); // Calcula o intervalo de tempo entre a ultima morte e a quinta ultima morte utilizando JodaTime Duration duracao = new Duration(dataHoraQuintoUltimoAssassinato, dataHoraUltimoAssassinato); Long diferencaEmSegundos = duracao.getStandardSeconds(); if (diferencaEmSegundos <= 60) possuiTrofeuCincoAssassinatosEmUmMinuto = true; } } public ArmaVO getArmaPreferida() { ArmaVO armaPreferida = null; Integer numeroVezesUtilizadaArmaPreferida = 0; for (int i = 0; i < assassinatos.size(); i++) { ArmaVO armaUtilizadaVO = assassinatos.get(i).getArmaUtilizada(); Integer numeroVezesUtilizada = 1; for (int i2 = (i + 1); i2 < assassinatos.size(); i2++) { if (i == i2) continue; ArmaVO armaUtilizadaLista = assassinatos.get(i2).getArmaUtilizada(); if (armaUtilizadaLista.equals(armaUtilizadaVO)) { numeroVezesUtilizada++; } } if (numeroVezesUtilizada > numeroVezesUtilizadaArmaPreferida) { armaPreferida = armaUtilizadaVO; numeroVezesUtilizadaArmaPreferida = numeroVezesUtilizada; } } return armaPreferida; } /** * Retorna se jogador ganhou um trofeu por cometer 5 assassinatos dentro * de um minuto. * @return */ public Boolean getPossuiTrofeuCincoAssassinatosEmUmMinuto() { return possuiTrofeuCincoAssassinatosEmUmMinuto; } @Override public int compareTo(Object o) { if (o == null) return 0; JogadorVO outroVO = (JogadorVO) o; Integer resultado = this.getQuantidadeAssassinatos().compareTo(outroVO.getQuantidadeAssassinatos()); if (resultado > 0) { return -1; } else if (resultado < 0) { return 1; } return 1; } @Override public boolean equals(Object o) { if (o == null) return false; JogadorVO outroVO = (JogadorVO) o; return this.nome.equalsIgnoreCase(outroVO.getNome()); } }