//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 tablero.cpp*/
/**
@file tablero.cpp
@author Alvaro Diaz Sanchez
@brief Fichero con definiciones de la clase Tablero asociado a la biblioteca libconectan.a
*/
#include
#include
#include
#include
/*****************************************************/
#include "tablero.h"
#include "graficos.h"
/****************************************************/
using namespace std;
Tablero :: Tablero (int f, int c)
{
int f_iterador;
bool error = false;
//Crear la matriz mediante memoria dinamica
tablero = new (nothrow) int * [f];
//Comprobar que se ha reservado con exito
if(!tablero){
cerr << "Error en la reserva" << endl;
tablero = 0;
exit(1);
}
else{
for (f_iterador=0; f_iterador < f && !error; f_iterador++){
tablero[f_iterador] = new (nothrow) int [c];
if(!tablero[f_iterador]){
cerr << "Error en la reserva" << endl;
error = true;
}
}
}
//Asignar las filas y las columnas
filas = f;
columnas = c;
//Crear mediante memoria dinamica el vector filas_restantes
filas_restantes = new (nothrow) int [c];
if(!filas_restantes){
cerr << "Error en la reserva" << endl;
filas_restantes = 0;
exit(1);
}
x_cabecera = 0;
y_cabecera = 0;
x_ficha = 0;
y_ficha = 0;
}
Tablero :: ~Tablero (void)
{
int f_iterador;
//Liberar los recursos de matriz y filas_restantes despues de su uso
for (f_iterador = 0; f_iterador < filas; f_iterador++)
delete [] tablero[f_iterador];
delete [] tablero;
delete [] filas_restantes;
}
void Tablero :: ColocarExtension (const char *extension, char recursos[], char apariencia[])
{
const char *terminador = "/";
//Elabora la ruta hacia las imagenes
strcpy (fichero, recursos);
strcat (fichero, terminador);
strcat (fichero, apariencia);
strcat (fichero, extension);
}
void Tablero :: TableroQuitaFila (unsigned int columna)
{
filas_restantes[columna]--;
}
void Tablero :: SetTablero (int fila, unsigned int columna, int valor)
{
//Insertar un valor en la posicion [fila, columna]
tablero[fila][columna] = valor;
}
int Tablero :: GetTablero (int fila, int columna) const
{
//Devolver el valor de la ficha que hay en la celda [fila, columna]
return (tablero[fila][columna]);
}
int Tablero :: GetAlturaFicha (void) const
{
return (y_ficha);
}
int Tablero :: GetAnchoFicha (void) const
{
return (x_ficha);
}
int Tablero :: GetAlturaCabecera (void) const
{
return (y_cabecera);
}
int Tablero :: GetAnchoCabecera (void) const
{
return (x_cabecera);
}
int Tablero :: FilasTablero (void) const
{
//Devolver el numero de filas del tablero virtual
return (filas);
}
int Tablero :: ColumnasTablero (void) const
{
//Devolver el numero de columnas del tablero virtual
return (columnas);
}
void Tablero :: SetFilasRestantes (unsigned int columna, int valor)
{
filas_restantes[columna] = valor;
}
int Tablero :: GetFilasRestantes (unsigned int columna) const
{
//Devolver cuantas filas quedan en la columna antes de que se agote el espacio
return (filas_restantes[columna]);
}
void Tablero :: TableroInsertaFicha (int fila, unsigned int columna, int valor)
{
//Quita una fila
TableroQuitaFila (columna);
//Inserta el valor de la casilla en [fila, columna]
SetTablero (fila, columna, valor);
}
bool Tablero :: TableroCompleto (void) const
{
int c_iterador;
bool completo = true;
//Comprueba si el tablero virtual esta lleno de fichas
for (c_iterador = 0; c_iterador < columnas && completo; c_iterador++){
if (filas_restantes[c_iterador] != -1)
completo = false;
}
return completo;
}
void Tablero :: PintarPieTablero (void)
{
int filas_ventana, columnas_ventana;
filas_ventana = FilasVentana();
columnas_ventana = ColumnasVentana();
//Dibujar el pie de ventana
RectanguloR (5, filas_ventana - 34, columnas_ventana - 6, filas_ventana - 3, 0, 0 ,0);
}
void Tablero :: PintaTablero (char recursos[], char apariencia[], int linea)
{
int casillas_x, casillas_y, centrado_cab, centrado_v;
int coordenada_x = 0 , coordenada_y = 0, fila, columna, filas_ventana, columnas_ventana ;
SDL_Surface *cab, *v;
const char *cabecera = ".cab.bmp";
const char *vacia = ".v.bmp";
char titulo[15] = "Conecta ";
char linea_n[linea];
//Colocar el titulo de la ventana
sprintf (linea_n, "%d", linea);
strcat (titulo, linea_n);
//Cargar imagenes
ColocarExtension (cabecera, recursos, apariencia);
DimensionesBMP (fichero, x_cabecera, y_cabecera);
cab = LeerImagenBMP (fichero);
ColocarExtension (vacia, recursos, apariencia);
DimensionesBMP (fichero, x_ficha, y_ficha);
v = LeerImagenBMP (fichero);
casillas_x = x_ficha * columnas;
casillas_y = y_ficha * filas;
coordenada_y = y_cabecera;
//Pintar el tablero
if (casillas_x >= x_cabecera){
CrearVentana (casillas_x, y_cabecera + 40 + casillas_y, titulo);
filas_ventana = FilasVentana();
columnas_ventana = ColumnasVentana();
RectanguloR (0,0, columnas_ventana - 1, filas_ventana - 1, 255, 255, 255);
centrado_cab = (casillas_x - x_cabecera) / 2;
DibujarImagenBMP (cab, centrado_cab, 0);
for (fila = 0; fila < filas; fila++){
for (columna = 0; columna < columnas; columna++){
DibujarImagenBMP (v, coordenada_x, coordenada_y);
coordenada_x += x_ficha;
}
coordenada_x = 0;
coordenada_y += y_ficha;
}
}
else{
CrearVentana (x_cabecera, y_cabecera + 40 + casillas_y, titulo);
filas_ventana = FilasVentana();
columnas_ventana = ColumnasVentana();
RectanguloR (0,0, columnas_ventana - 1, filas_ventana - 1, 255, 255, 255);
DibujarImagenBMP (cab, 0, 0);
centrado_v = (x_cabecera - casillas_x) / 2;
coordenada_x = centrado_v;
for (fila = 0; fila < filas; fila++){
for (columna = 0; columna < columnas; columna++){
DibujarImagenBMP (v, coordenada_x, coordenada_y);
coordenada_x += x_ficha;
}
coordenada_x = centrado_v;
coordenada_y += y_ficha;
}
}
PintarPieTablero();
LiberarImagenBMP (cab);
LiberarImagenBMP (v);
}
void Tablero :: TableroPintaFichaJugador (char recursos[], char apariencia[], int valor, int fila, unsigned int columna)
{
int coordenada_x, coordenada_y, casillas_x, casilla_centrada;
SDL_Surface *ficha_color;
const char *primer_color = ".b.bmp", *segundo_color = ".n.bmp";
//Cargar imagenes dependiendo del color
if (valor == 1){
ColocarExtension (primer_color, recursos, apariencia);
ficha_color = LeerImagenBMP (fichero);
}
else{
ColocarExtension (segundo_color, recursos, apariencia);
ficha_color = LeerImagenBMP (fichero);
}
casillas_x = columnas * x_ficha;
coordenada_y = y_cabecera + (fila * y_ficha);
//Pintar la ficha en la casilla
if (casillas_x >= x_cabecera){
coordenada_x = columna * x_ficha ;
DibujarImagenBMP (ficha_color, coordenada_x, coordenada_y);
}
else{
casilla_centrada = (x_cabecera - casillas_x) / 2;
coordenada_x = casilla_centrada + (columna * x_ficha);
DibujarImagenBMP (ficha_color, coordenada_x, coordenada_y);
}
LiberarImagenBMP (ficha_color);
}