/****************************************************************************
* Funcion CharJugador
* Devuelve el caracter utilizado por el jugador
*
* Parametros:
*  jugador      E
*
* Valor devuelto:
*      char
****************************************************************************/
char CharJugador(bool jugador)
{
    char ficha;

    if(! jugador)
        ficha = 'O';
    else
        ficha = 'X';

    return ficha;
}

/****************************************************************************
* Funcion CambiaFichas
* Voltea las fichas siguiendo las reglas del Othello. Si no consigue voltear
* ninguna ficha deja el tablero igual que estaba.
*
* Parametros:
*  t            E y S tablero del juego
*  fila         E
*  col          E     coordenadas donde se va a colocar la ficha
*  jugador      E     jugador que coloca la ficha
*
* Valor devuelto:
*      cierto si consigue voltear alguna ficha, falso en caso contrario
****************************************************************************/
bool CambiaFichas(Tablero & t, int fila, int col, bool jugador)
{
    int i,j;
    bool cambiado = false;

    for(i = -1; i <= 1; i++)
        for(j = -1; j <= 1; j++)
            if(i != 0 || j != 0)
                cambiado = CambiaLinea(t, fila, col, i, j, jugador) || cambiado;

    return cambiado;
}

/****************************************************************************
* Funcion EnTablero
* Indica si las coordenadas estan dentro del tablero
*
* Parametros:
*  tam          E     tamanyo del tablero
*  x            E     coordenadas donde se va a colocar la ficha
*  y            E
*
* Valor devuelto:
*   Cierto si las coordenadas estan dentro del tablero, falso en caso contrario
****************************************************************************/
bool EnTablero(int tam, int x, int y)
{
    bool dentro;
    
    if(x >= 0 && y >= 0 && x < tam && y < tam)
        dentro = true;
    else
        dentro = false;

    return dentro;
}

/****************************************************************************
* Funcion CambiaLinea
* Función para cambiar toda una fila, columna o diagonal
* Si fila_inc y col_inc son cero se produce un bucle infinito
*
* Parametros:
*  t            E y S tablero
*  fila         E     coordenadas donde se va a colocar la ficha
*  col          E
*  fila_inc     E     incremento a realizar en las filas (+1, 0 o -1)
*  col_inc      E     incremento a realizar en las columnas (+1, 0 o -1)
*  jugador      E     jugador que coloca la ficha
*
* Valor devuelto:
*      cierto si consigue voltear alguna ficha, falso en caso contrario
****************************************************************************/
bool CambiaLinea(Tablero & t, int fila, int col, int fila_inc, int col_inc, bool jugador)
{
    int i, j;
    char ficha, ficha_opo;
    bool cambiado = false;

    ficha = CharJugador(jugador);
    ficha_opo = CharJugador(! jugador);

    i = fila + fila_inc;
    j = col + col_inc;
    while(EnTablero(t.tam, i, j) && t.tab[i][j] == ficha_opo)
    {
        i += fila_inc;
        j += col_inc;
    }
    if(EnTablero(t.tam, i, j) && (abs(i - fila) > 1 || abs(j - col) > 1) && t.tab[i][j] == ficha)
    {
        cambiado = true;
        while(abs(i - fila) > 0 || abs(j - col) > 0)
        {
            i -= fila_inc;
            j -= col_inc;
            t.tab[i][j] = ficha;
        }
    }
    
    return cambiado;
}

