package reversi;

import java.awt.*;
import java.util.ArrayList;

/**
 * Created by arthur on 13/03/15.
 */
public class Jogador {
    private Tabuleiro tabuleiro;
    private Color cor;

    private ArrayList<Peca> pecas;
    private ArrayList<Movimento> movimentos;

    public Jogador(Tabuleiro tabuleiro, Color cor) {
        this.tabuleiro = tabuleiro;
        this.cor = cor;
        pecas = new ArrayList<Peca>();
    }

    public Color getCor() {
        return cor;
    }

    public void addPeca(Peca peca) {
        peca.setDono(this);
        pecas.add(peca);
    }

    public void calcularMovimentos() {
        for (Peca peca: pecas) {
            gerarMovimentosNaDirecao(peca, DirecaoHorizontal.DIREITA, DirecaoVertical.NENHUMA);
            gerarMovimentosNaDirecao(peca, DirecaoHorizontal.ESQUERDA, DirecaoVertical.NENHUMA);
        }
    }

    private enum DirecaoVertical {
        BAIXO(-1),
        NENHUMA(0),
        CIMA(1);

        private int valor;

        DirecaoVertical(int valor) {
            this.valor = valor;
        }

        public int getValor() {
            return valor;
        }
    }

    private enum DirecaoHorizontal {
        ESQUERDA(-1),
        NENHUMA(0),
        DIREITA(1);

        private int valor;

        DirecaoHorizontal(int valor) {
            this.valor = valor;
        }

        public int getValor() {
            return valor;
        }
    }

    private void gerarMovimentosNaDirecao(Peca pecaInicial, DirecaoHorizontal direcaoHorizontal, DirecaoVertical direcaoVertical ) {
        System.out.println("Começando da peça:" + pecaInicial.toString());
        int linha = pecaInicial.getLinha();
        boolean candidato = false;
        for (int coluna = pecaInicial.getColuna(); ; coluna = coluna + direcaoHorizontal.getValor()) {
            Peca peca;
            try {
                System.out.println("Trying to get c=" + coluna + "; l=" + linha);
                peca = tabuleiro.getPeca(coluna, linha);
                System.out.println(peca.toString());
            } catch (ArrayIndexOutOfBoundsException e) {
                break;
            }
            if (peca == pecaInicial) {
                continue;
            }
            if (peca.getDono() != this && peca.getDono() != null) {
                candidato = true;
                continue;
            }
            if (peca.getDono() == null && candidato) {
                peca.setEnabled(true);
                break;
            }
            if (peca.getDono() == this) {
                break;
            }
        }
    }

    @Override
    public String toString() {
        return "Jogador{" +
                "cor=" + cor +
                '}';
    }
}

@@ -649,32 +649,34 @@
 ) %7B%0A            
+//
 gerarMovimentosN
@@ -755,16 +755,18 @@
         
+//
 gerarMov
@@ -834,32 +834,219 @@
 tical.NENHUMA);%0A
+            gerarMovimentosNaDirecao(peca, DirecaoHorizontal.NENHUMA, DirecaoVertical.CIMA);%0A            gerarMovimentosNaDirecao(peca, DirecaoHorizontal.NENHUMA, DirecaoVertical.BAIXO);%0A
         %7D%0A    %7D%0A
@@ -1089,21 +1089,20 @@
         
-BAIXO
+CIMA
 (-1),%0A  
@@ -1127,20 +1127,21 @@
         
-CIMA
+BAIXO
 (1);%0A%0A  
@@ -1818,52 +1818,8 @@
 ));%0A
-        int linha = pecaInicial.getLinha();%0A
     
@@ -1902,45 +1902,169 @@
 na()
-; ; coluna = coluna + direcaoHorizont
+,%0A                 linha = pecaInicial.getLinha();;%0A                coluna = coluna + direcaoHorizontal.getValor(),%0A                linha = linha + direcaoVertic
 al.g

Verifica linhas acima e abaixo