Skip to content

Commit

Permalink
fix #19 e fix #20
Browse files Browse the repository at this point in the history
  • Loading branch information
brunoabdon committed May 6, 2017
1 parent 9dd1784 commit 64bfeb0
Show file tree
Hide file tree
Showing 9 changed files with 126 additions and 194 deletions.
71 changes: 1 addition & 70 deletions src/main/java/com/github/abdonia/domino/app/DominoApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@

import com.github.abdonia.domino.Jogador;
import com.github.abdonia.domino.eventos.DominoEventListener;
import com.github.abdonia.domino.motor.JogadorWrapper;
import com.github.abdonia.domino.motor.Jogo;

public class DominoApp {
Expand All @@ -46,7 +45,7 @@ public static void main(final String[] args) {
final DominoConfig dominoConfig = carregaConfiguracao();

//criando o jogo com essas configurações
final Jogo jogo = criaJogo(dominoConfig);
final Jogo jogo = new Jogo(dominoConfig);

//jogando
jogo.jogar();
Expand Down Expand Up @@ -133,76 +132,8 @@ private static void tentarExibirAvisoConfiguracaoDefault() {
}
}

/**
* Cria um {@link Jogo} de dominó a partir das configurações passadas.
* @param dominoConfig As configurações do jogo a ser criado.
* @return Um {@link Jogo} de dominó pronto pra ser jogado.
* @throws DominoAppException Caso não consiga instanciar alguma classe
* mencionada nas configurações.
*/
private static Jogo criaJogo(
final DominoConfig dominoConfig)
throws DominoAppException {

//criando os jogadores
final JogadorWrapper jogador1dupla1 =
criaJogador(
dominoConfig.getNomeJogador1Dupla1(),
dominoConfig.getClasseJogador1Dupla1());
final JogadorWrapper jogador2dupla1 =
criaJogador(
dominoConfig.getNomeJogador2Dupla1(),
dominoConfig.getClasseJogador2Dupla1());
final JogadorWrapper jogador1dupla2 =
criaJogador(
dominoConfig.getNomeJogador1Dupla2(),
dominoConfig.getClasseJogador1Dupla2());
final JogadorWrapper jogador2dupla2 =
criaJogador(
dominoConfig.getNomeJogador2Dupla2(),
dominoConfig.getClasseJogador2Dupla2());

//criando o jogo com os jogadores
final Jogo jogo =
new Jogo(
jogador1dupla1,
jogador1dupla2,
jogador2dupla1,
jogador2dupla2);

//adicionando os eventListeners ao jogo
for(final String klass : dominoConfig.getEventListeners()){
final DominoEventListener eventListener =
DominoUtils.instancia(DominoEventListener.class, klass);
jogo.addEventListener(eventListener);
}
return jogo;
}

private static void log(final Level l, final String msg, final Exception e){
System.err.printf("%s: %s\n",msg, e.getMessage());
Logger.getLogger(DominoApp.class.getName()).log(l, msg, e);
}

/**
* Cria um {@link JogadorWrapper jogador} dado seu nome e o nome de sua
* classe.
* @param nomeJogador O nome do jogador.
* @param nomeClasse O nome completo da classe do jogador.
* @return Um {@link JogadorWrapper jogador} pronto pra jogar.
* @throws DominoAppException Caso não consiga instanciar o jogador.
*/
private static JogadorWrapper criaJogador(
final String nomeJogador,
final String nomeClasse)
throws DominoAppException {

final Jogador jogador =
DominoUtils
.instancia(
Jogador.class,
nomeClasse);

return new JogadorWrapper(jogador, nomeJogador);
}
}
16 changes: 13 additions & 3 deletions src/main/java/com/github/abdonia/domino/app/DominoConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.ArrayList;
import java.util.List;


/**
* As configurações de um {@link com.github.abdonia.domino.motor.Jogo Jogo de
* dominó}, ou seja, quais jogadores vão participar (quais são seus nomes e suas
Expand All @@ -33,6 +34,8 @@ public class DominoConfig {
private final String[] nomes = new String[4];
private final String[] classes = new String[4];

private String nomeRandomizadora;

private List<String> eventListeners = new ArrayList<>();

public String getNomeJogador1Dupla1() {
Expand Down Expand Up @@ -112,15 +115,13 @@ public void setNomeEClasse(
final int dupla,
final int jogador){

//nao tenho certeza se deveria validar nesse ponto....
this.validaParametros(nome, classe, dupla, jogador);

final int index = (dupla-1)*2 + (jogador-1);

nomes[index] = nome;
classes[index] = classe;

System.out.printf("[%d]: Jogador %d da dupla %d.\n", index, jogador, dupla);

}

private void validaParametros(
Expand Down Expand Up @@ -158,4 +159,13 @@ public void setEventListeners(final List<String> eventListeners) {
public void addEventListener(final String eventListener) {
this.eventListeners.add(eventListener);
}

public String getNomeRandomizadora() {
return nomeRandomizadora;
}

public void setNomeRandomizadora(String nomeRandomizadora) {
this.nomeRandomizadora = nomeRandomizadora;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.abdonia.domino.app;
package com.github.abdonia.domino.motor;

/**
*
Expand All @@ -24,8 +24,7 @@ class DominoUtils {

public static <K> K instancia(
final Class<K> superKlass,
final String className)
throws DominoAppException {
final String className) {

final K instance;

Expand All @@ -36,21 +35,20 @@ public static <K> K instancia(
instance = klass.newInstance();

} catch (InstantiationException e) {
throw new DominoAppException(
e,"Não consegui inicializar: " + className);
throw new IllegalArgumentException(
"Não consegui inicializar: " + className, e);
} catch (IllegalAccessException e) {
throw new DominoAppException(
e,"Preciso de um construtor: " + className);
throw new IllegalArgumentException(
"Preciso de um construtor: " + className, e);
} catch (ClassNotFoundException e) {
throw new DominoAppException(
e, "Classe não encontrada: " + className);
throw new IllegalArgumentException(
"Classe não encontrada: " + className, e);
} catch (ClassCastException e) {
throw new DominoAppException(
e,
throw new IllegalArgumentException(
"A classe "
+ className
+ " não implementa "
+ superKlass.getName());
+ superKlass.getName(),e);
}
return instance;
}
Expand Down
27 changes: 25 additions & 2 deletions src/main/java/com/github/abdonia/domino/motor/JogadorWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@
import com.github.abdonia.domino.Jogador;
import com.github.abdonia.domino.Mesa;
import com.github.abdonia.domino.Pedra;
import com.github.abdonia.domino.app.DominoAppException;

public final class JogadorWrapper implements Jogador {
class JogadorWrapper implements Jogador {

private final String nome;
private int cadeira;
private Collection<Pedra> mao;

private final Jogador wrapped;

public JogadorWrapper(final Jogador wrapped, final String nome) {
private JogadorWrapper(final Jogador wrapped, final String nome) {

if(nome == null) throw new IllegalArgumentException("João SemNome não joga.");
if(wrapped == null) throw new IllegalArgumentException("bug");
Expand All @@ -42,6 +43,28 @@ public JogadorWrapper(final Jogador wrapped, final String nome) {
this.nome = nome;
}

/**
* Cria um {@link JogadorWrapper jogador} dado seu nome e o nome de sua
* classe.
* @param nomeJogador O nome do jogador.
* @param nomeClasse O nome completo da classe do jogador.
* @return Um {@link JogadorWrapper jogador} pronto pra jogar.
* @throws DominoAppException Caso não consiga instanciar o jogador.
*/
static JogadorWrapper criaJogador(
final String nomeJogador,
final String nomeClasse) {

final Jogador jogador =
DominoUtils
.instancia(
Jogador.class,
nomeClasse);

return new JogadorWrapper(jogador, nomeJogador);
}


@Override
public void recebeMao(final Pedra[] pedras) {
this.mao = new ArrayList<>(Arrays.asList(pedras));
Expand Down
110 changes: 62 additions & 48 deletions src/main/java/com/github/abdonia/domino/motor/Jogo.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,78 +16,66 @@
*/
package com.github.abdonia.domino.motor;

import java.util.function.Consumer;
import java.util.function.Function;

import com.github.abdonia.domino.Jogador;
import com.github.abdonia.domino.Pedra;
import com.github.abdonia.domino.Vitoria;
import com.github.abdonia.domino.eventos.DominoEventListener;
import java.util.Random;


import com.github.abdonia.domino.app.DominoConfig;

public class Jogo {

private final MesaImpl mesa;
private final DominoEventBroadcaster eventBroadcaster;
private final RandomGoddess fortuna;

/**
* Cria um jogo de dominó com os jogadores passados sentados em ordem na
* mesa (duplas 0 e 2 contra 1 e 3), onde a classe {@link Random} é usada
* pra gerar a aleatóriedade (embaralhar as pedreas e decidir quem da dupla
* começa uma partida, se empatarem na {@link Jogador#vontadeDeComecar()
* vontade demonstrada para começar a jogar}.
*
* @param jogador1dupla1 O primeiro jogador da primeira dupla.
* @param jogador1dupla2 O primeiro jogador da segunda dupla.
* @param jogador2dupla1 O segundo jogador da primeira dupla.
* @param jogador2dupla2 O segundo jogador da segunda dupla.
*/
public Jogo(
final JogadorWrapper jogador1dupla1,
final JogadorWrapper jogador1dupla2,
final JogadorWrapper jogador2dupla1,
final JogadorWrapper jogador2dupla2) {
this(
jogador1dupla1,
jogador1dupla2,
jogador2dupla1,
jogador2dupla2,
new DefaultRandomGoddess());
}

private static final Function<String,DominoEventListener> EVT_LIST_INSTANC =
s-> DominoUtils.instancia(DominoEventListener.class, s);

/**
* Cria um jogo de dominó com os jogadores passados sentados em ordem na
* mesa (duplas 0 e 2 contra 1 e 3), onde a aleatóriedade é gerada pelo
* gerador randômico passado.
*
* Aa {@link RandomGoddess#embaralha() lista embaralhada de pedras retornada
* A {@link RandomGoddess#embaralha() lista embaralhada de pedras retornada
* pelo gerador randômico} será distribuida entre os jogadores {@link
* Jogador#sentaNaMesa(com.github.abdonia.domino.Mesa, int) sentados na
* mesa}, onde o jogador na candeira <pre>x</pre> receberá as pedras do
* índices <pre>x*6</pre> até <pre>x*6 + 5</pre>. As pedras nos últimos
* quatro indices vão para o dorme.
*
* @param jogador1dupla1 O primeiro jogador da primeira dupla.
* @param jogador1dupla2 O primeiro jogador da segunda dupla.
* @param jogador2dupla1 O segundo jogador da primeira dupla.
* @param jogador2dupla2 O segundo jogador da segunda dupla.
* @param fortuna O gerador de aleatóriedade a ser usado para
* embaralhar as cartas e para decidir quem na dupla deve começar uma
* partida em caso de empate na {@link Jogador#vontadeDeComecar() vontade
* demonstrada para começar a jogar}.
* @param configuracao A configuração do jogo.
*
*/
public Jogo(
final JogadorWrapper jogador1dupla1,
final JogadorWrapper jogador1dupla2,
final JogadorWrapper jogador2dupla1,
final JogadorWrapper jogador2dupla2,
final RandomGoddess fortuna) {

if(jogador1dupla1 == null
|| jogador2dupla1 == null
|| jogador1dupla2 == null
|| jogador2dupla2 == null)
throw new IllegalArgumentException("W.O.!!!");
public Jogo(final DominoConfig configuracao){

this.fortuna = fortuna;
final JogadorWrapper jogador1dupla1 =
JogadorWrapper
.criaJogador(
configuracao.getNomeJogador1Dupla1(),
configuracao.getClasseJogador1Dupla1());

final JogadorWrapper jogador1dupla2 =
JogadorWrapper
.criaJogador(
configuracao.getNomeJogador1Dupla2(),
configuracao.getClasseJogador1Dupla2());

final JogadorWrapper jogador2dupla1 =
JogadorWrapper
.criaJogador(
configuracao.getNomeJogador2Dupla1(),
configuracao.getClasseJogador2Dupla1());

final JogadorWrapper jogador2dupla2 =
JogadorWrapper
.criaJogador(
configuracao.getNomeJogador2Dupla2(),
configuracao.getClasseJogador2Dupla2());

this.eventBroadcaster =
configuraEventListners(
Expand All @@ -96,6 +84,31 @@ public Jogo(
jogador2dupla1,
jogador2dupla2);

final Consumer<DominoEventListener> addLisntener =
(eventListener) -> {
this.eventBroadcaster
.addEventListener(
eventListener,
true);
};

//adicionando os eventListeners ao jogo
configuracao
.getEventListeners()
.stream()
.map(EVT_LIST_INSTANC)
.forEach(addLisntener);

final String nomeDeusaRandomizacao =
configuracao.getNomeRandomizadora();

this.fortuna =
nomeDeusaRandomizacao == null
? new DefaultRandomGoddess()
: DominoUtils.instancia(
RandomGoddess.class,
nomeDeusaRandomizacao);

this.mesa =
new MesaImpl(
jogador1dupla1,
Expand Down Expand Up @@ -228,4 +241,5 @@ private boolean alguemVenceu() {
public void addEventListener(final DominoEventListener eventListener) {
this.eventBroadcaster.addEventListener(eventListener,true);
}

}
Loading

0 comments on commit 64bfeb0

Please sign in to comment.