//Copyright 2010 Alvaro Diaz Sanchez
/*This program is free software: you can redistribute it and/or modify it under the terms of the GNU
General Public License as published by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see
*/
/*Fichero jugador.cpp*/
/**
@file jugador.cpp
@author Alvaro Diaz Sanchez
@brief Fichero con definiciones de la clase Jugador asociado a la biblioteca libconectan.a
*/
#include
#include
/*******************************************************/
#include "jugador.h"
#include "graficos.h"
/******************************************************/
using namespace std;
bool Jugador :: EsTablero (const Tablero &juego, int x_pixel, int y_pixel)
{
int filas_ventana, casillas_x, x_tablero_inicio = 0, x_tablero_final, y_tablero_inicio, y_tablero_final, casilla_centrada, alto_ficha, ancho_ficha, t_columnas, alto_cabecera, ancho_cabecera;
bool es_tablero = false;
alto_ficha = juego.GetAlturaFicha();
ancho_ficha = juego.GetAnchoFicha();
alto_cabecera = juego.GetAlturaCabecera();
ancho_cabecera = juego.GetAnchoCabecera();
t_columnas = juego.ColumnasTablero();
filas_ventana = FilasVentana ();
casillas_x = t_columnas * ancho_ficha;
y_tablero_inicio = alto_cabecera;
y_tablero_final = filas_ventana - 40;
//Comprueba que se encuentre entre las casillas del tablero
if (casillas_x >= ancho_cabecera)
x_tablero_final = casillas_x;
else{
casilla_centrada = (ancho_cabecera - casillas_x) / 2;
x_tablero_inicio = casilla_centrada;
x_tablero_final = ancho_cabecera - casilla_centrada;
}
if (x_tablero_inicio <= x_pixel && x_pixel < x_tablero_final)
es_tablero = true;
if (y_tablero_inicio <= y_pixel && y_pixel < y_tablero_final && es_tablero)
es_tablero = true;
else
es_tablero = false;
return es_tablero;
}
void Jugador :: LocalizarPosicion (const Tablero &juego, int casillas_x, int pixel_x, unsigned int &columna_x)
{
int filas_ventana, pos_ficha, casilla_centrada, ancho_ficha, alto_cabecera, ancho_cabecera;
bool acabar = false;
ancho_ficha = juego.GetAnchoFicha();
alto_cabecera = juego.GetAlturaCabecera();
ancho_cabecera = juego.GetAnchoCabecera();
casilla_centrada = (ancho_cabecera - casillas_x) / 2;
//Transformar las dimensiones en la columna
if (casillas_x >= ancho_cabecera){
for (columna_x = 0; !acabar; columna_x++){
pos_ficha = columna_x * ancho_ficha;
if (pos_ficha <= pixel_x && pixel_x < pos_ficha + ancho_ficha)
acabar = true;
}
}
else{
for (columna_x = 0; !acabar; columna_x++){
pos_ficha = (columna_x * ancho_ficha) + casilla_centrada;
if (pos_ficha <= pixel_x && pixel_x < pos_ficha + ancho_ficha)
acabar = true;
}
}
columna_x--;
}
unsigned int Jugador :: JugadorAleatorio (const Tablero &juego) const
{
unsigned int columna;
//Devolver al azar una columna entre 0 y ColumnasConectan(i)
srand ( time(0) );
columna = (0 + (rand() % juego.ColumnasTablero()));
return (columna);
}
unsigned int Jugador :: JugadorInteligente (const Tablero &juego, int linea, int valor) const
{
int fila, columna, iterador, l_iterador, filas = juego.FilasTablero(), columnas = juego.ColumnasTablero();
unsigned int columna_echar;
int cadena[columnas];
bool parar = false;
for (l_iterador = linea - 1; l_iterador >= 1 && !parar; l_iterador--){
iterador = l_iterador - 1;
//Elaborar la secuencia de fichas a buscar
for (columna = 0; columna < l_iterador; columna++)
cadena[columna] = valor;
//Buscar esa secuencia
for (fila = 0; fila < filas && !parar; fila++){
for (columna = columnas - 1; columna >= 0 && !parar; columna--){
if (juego.GetTablero (fila, columna) == cadena[iterador] && juego.GetTablero (fila, (columna - l_iterador)) == 0)
iterador--;
else
iterador = l_iterador - 1;
//Si la encuentra devuelve la columna
if (iterador < 0){
columna_echar = columna - 1;
parar = true;
}
}
iterador = l_iterador - 1 ;
}
}
//Si no encuentra nada echa la ficha al azar
if (!parar){
srand ( time(0) );
columna_echar = (0 + (rand() % columnas));
}
return (columna_echar);
}
void Jugador :: JugadorManual (const Tablero &juego, unsigned int &columna_tablero)
{
int boton, coordenada_x, coordenada_y, casillas_x, t_columnas, ancho_ficha;
bool tablero;
t_columnas = juego.ColumnasTablero();
ancho_ficha = juego.GetAnchoFicha();
casillas_x = t_columnas * ancho_ficha;
//Obtener las coordenadas donde se ha pulsado
do{
boton = ObtenerClick (coordenada_x, coordenada_y);
//Comprobar que sea el tablero
tablero = EsTablero (juego, coordenada_x, coordenada_y);
Esperar (200);
}while (boton !=1 || !tablero);
//Transforma la coordenada en la columna
LocalizarPosicion (juego, casillas_x, coordenada_x, columna_tablero);
}