Skip to content

Instantly share code, notes, and snippets.

@rodrigovilar
Created June 16, 2014 14:30
Show Gist options
  • Save rodrigovilar/ff7ff925ed4e1e60c96d to your computer and use it in GitHub Desktop.
Save rodrigovilar/ff7ff925ed4e1e60c96d to your computer and use it in GitHub Desktop.
package com.jogodavelha;
public class ExcecaoJogoDaVelha extends RuntimeException {
public ExcecaoJogoDaVelha(String msg) {
super(msg);
}
}
package com.jogodavelha;
public class Jogo {
private Boolean[][] tabuleiro = new Boolean[3][3];
private Boolean proximaJogadaX;
private boolean jogoComecou = false;
public boolean acabou() {
return verificarColunas() || verificarLinhas() || verificarDiagonais();
}
private boolean verificarDiagonais() {
if ((tabuleiro[0][0] == tabuleiro[1][1])
&& (tabuleiro[1][1] == tabuleiro[2][2])
&& (tabuleiro[0][0] != null)) {
return true;
}
if ((tabuleiro[0][2] == tabuleiro[1][1])
&& (tabuleiro[1][1] == tabuleiro[2][0])
&& (tabuleiro[0][2] != null)) {
return true;
}
return false;
}
private boolean verificarLinhas() {
for (int i = 0; i < 3; i++) {
if ((tabuleiro[i][0] == tabuleiro[i][1])
&& (tabuleiro[i][1] == tabuleiro[i][2])
&& (tabuleiro[i][0] != null)) {
return true;
}
}
return false;
}
private boolean verificarColunas() {
for (int i = 0; i < 3; i++) {
if ((tabuleiro[0][i] == tabuleiro[1][i])
&& (tabuleiro[1][i] == tabuleiro[2][i])
&& (tabuleiro[0][i] != null)) {
return true;
}
}
return false;
}
public void setMarcaPrimeiroJogadorX(boolean marcaPrimeiroJogadorX) {
if (jogoComecou) {
throw new ExcecaoJogoDaVelha(
"Nao pode trocar marcar apos inicio do jogo");
}
this.proximaJogadaX = marcaPrimeiroJogadorX;
}
public boolean isMarcaPrimeiroJogadorX() {
return proximaJogadaX;
}
public void desenharMarca(int linha, int coluna) {
if (acabou()) {
throw new ExcecaoJogoDaVelha("O jogo já acabou");
}
verificarLimites(linha, coluna);
if (tabuleiro[linha][coluna] != null) {
throw new ExcecaoJogoDaVelha("Celula ocupada");
}
if (proximaJogadaX == null) {
throw new ExcecaoJogoDaVelha("Primeiro jogador nao definido");
}
tabuleiro[linha][coluna] = proximaJogadaX;
proximaJogadaX = !proximaJogadaX;
jogoComecou = true;
}
private void verificarLimites(int linha, int coluna) {
if (linha > 2 || linha < 0) {
throw new ExcecaoJogoDaVelha("Linha errada");
}
if (coluna > 2 || coluna < 0) {
throw new ExcecaoJogoDaVelha("Coluna errada");
}
}
public boolean isMarcaXNaPosicao(int linha, int coluna) {
verificarLimites(linha, coluna);
if (tabuleiro[linha][coluna] == null) {
throw new ExcecaoJogoDaVelha("Celula vazia");
}
return tabuleiro[linha][coluna];
}
}
package com.jogodavelha;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class JogoTest {
private Jogo jogo;
@Before
public void inicializa() {
jogo = new Jogo();
}
@Test
public void criarJogo() {
Assert.assertFalse("O jogo iniciou finalizado", jogo.acabou());
}
@Test
public void definirJogador() {
jogo.setMarcaPrimeiroJogadorX(true);
Assert.assertTrue(jogo.isMarcaPrimeiroJogadorX());
}
@Test
public void definirJogadorDeNovo() {
jogo.setMarcaPrimeiroJogadorX(true);
jogo.setMarcaPrimeiroJogadorX(false);
Assert.assertFalse(jogo.isMarcaPrimeiroJogadorX());
}
@Test
public void jogadaInicial() {
jogo.setMarcaPrimeiroJogadorX(true);
jogo.desenharMarca(2, 1);
Assert.assertTrue(jogo.isMarcaXNaPosicao(2, 1));
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void desenharMarcaEmUmaCelulaOcupada() {
jogo.setMarcaPrimeiroJogadorX(true);
desenharMarcas(0, 1, 0, 1);
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void linhaErrada() {
jogo.setMarcaPrimeiroJogadorX(true);
jogo.desenharMarca(3, 2);
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void colunaErrada() {
jogo.setMarcaPrimeiroJogadorX(true);
jogo.desenharMarca(2, -1);
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void lerCelulaDesocupada() {
jogo.isMarcaXNaPosicao(2, 1);
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void lerMarcaDeUmaColunaErrada() {
jogo.isMarcaXNaPosicao(1, 3);
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void lerMarcaDeUmaLinhaErrada() {
jogo.isMarcaXNaPosicao(-1, 1);
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void definirPrimeiroJogadorAposInicioDoJogo() {
jogo.setMarcaPrimeiroJogadorX(true);
jogo.desenharMarca(2, 1);
jogo.setMarcaPrimeiroJogadorX(false);
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void desenharMarcaAntesDeDefinirPrimeiroJogador() {
jogo.desenharMarca(2, 1);
}
@Test
public void segundaJogada() {
jogo.setMarcaPrimeiroJogadorX(true);
desenharMarcas(2, 2, 2, 1);
Assert.assertFalse(jogo.isMarcaXNaPosicao(2, 1));
}
@Test
public void jogoGanhoAtravesDeColuna() {
jogo.setMarcaPrimeiroJogadorX(false);
desenharMarcas(0, 0, 1, 2, 1, 0, 2, 2, 2, 0);
Assert.assertTrue("Esperava que o jogo tivesse acabado", jogo.acabou());
}
@Test
public void jogoGanhoAtravesDeLinha() {
jogo.setMarcaPrimeiroJogadorX(true);
desenharMarcas(1, 0, 0, 2, 1, 2, 2, 0, 1, 1);
Assert.assertTrue("Esperava que o jogo tivesse acabado", jogo.acabou());
}
@Test
public void jogoGanhoAtravesDeDiagonal() {
jogo.setMarcaPrimeiroJogadorX(true);
desenharMarcas(0, 2, 0, 0, 1, 1, 2, 2, 2, 0);
Assert.assertTrue("Esperava que o jogo tivesse acabado", jogo.acabou());
}
@Test(expected = ExcecaoJogoDaVelha.class)
public void desenharMarcaAposJogoGanho() {
jogo.setMarcaPrimeiroJogadorX(true);
desenharMarcas(0, 2, 0, 0, 1, 1, 2, 2, 2, 0, 2, 1);
}
private void desenharMarcas(int... posicao) {
for (int i = 0; i < posicao.length; i += 2) {
jogo.desenharMarca(posicao[i], posicao[i + 1]);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment