Está en la página 1de 11

TRABAJO DE PATRONES ORIENTADO A OBJETOS

“DISEÑO ORIENTADO DE UN TABLERO DE AJEDREZ”

ESTUDIANTE:

NAHUM ISAAC GAMERO ACOSTA

PROFESOR:

ING. LUIS GENARO PEREZ

FECHA:16-ABRIL-2020

UNIVERSIDAD COOPERATIVA DE COLOMBIA

MONTERIA
Diseño de un tablero de ajedrez
Sabemos que hay distintos tipos de piezas
Y que cada jugador tiene:
• 8 peones,
• 2 torres,
• 2 caballos,
• 2 alfiles,
• 1 reina,
• 1 rey.

• ¿Cómo podríamos modelar el tablero y las piezas?

La operación mover tan solonecesita la posición destino, ya que la ficha conoce


al tablero en el que esta ubicada.
La solución esta bien…pero son 32 instancias por partida.
Si suponemos que vamos a usar un servidor con múltiples partidas…
¿Cómo podríamos modelarlo para disminuir el número de objetos en
memoria?

FLYWEIG
HT

PesoMosca
PesoMosca
Concreto

Peso Mosca

1. El tablero conoce sólo a 1 instancia de cada tipo de pieza.


2. Pasamos de 32 instancias por partida a 6 (1 por pieza), o
incluso a 6 para todas las partidas.
3. Estado intrínseco: pertenencia a un tipo de pieza y
conocimiento del tablero al que pertenece.
4. Estado extrínseco: ahora a “mover()” le pasamos también el
origen y color de la pieza.
5. Con esto conseguimos menos memoria pero a cambio de tiempo de
cómputo
Este puede ser un código para construir el diseño de la interfaz
visual en el lenguaje c++ usando codeblocks:
#include <vcl.h>
#pragma hdrstop

#include "UntCuadro.h"
#include "UntPrincipal.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFrmCuadro *FrmCuadro;
TImage* Tablero[8][8]; //La imagen del la matriz de imagenes para el ajedrez
//Es mejor que las imagenes de las piezas
sean transparentes
//Estas 3 matrices podrian haberse metido en una clase y luego seleccionar un dato
char MatrizTipo[8][8]; //Esto fue para saber el tipo de matriz si estaba Con pieza
o no
int Matrizcolor[8][8]; //Esto es para saber el color de la pieza
int MatrizSeleccion[8][8]; //esto es para saber cual de todas las piezas esta
seleccionada

int blanco=1;
int negro=2;
int selec=1;
int noselec=0;
int nocolor=0;
int turno=blanco;

void fichas(int i, int j, int color, char tipo, int seleccion,TImage*


nuevoimagen){
Tablero[i][j]=nuevoimagen;
MatrizTipo[i][j]=tipo;
Matrizcolor[i][j]= color;
MatrizSeleccion[i][j]=seleccion;
if( MatrizTipo[i][j]=='V')
{
Tablero[i][j]->Picture-
>LoadFromFile("fondotablero.jpg"); //carga los cuadros vacios
Tablero[i][j]->Visible=false;
}
}
void fichas2(int i, int j, int color, char tipo, int seleccion){

MatrizTipo[i][j]=tipo;
Matrizcolor[i][j]= color;
MatrizSeleccion[i][j]=seleccion;
if( MatrizTipo[i][j]=='V')
{
Tablero[i][j]->Picture->LoadFromFile("fondotablero.jpg");
Tablero[i][j]->Visible=false;
}
}
int marcarPieza(int f, int c,int color)
{
if(f>-1&&f<8&&c>-1&&c<8)
{
if(color!=Matrizcolor[f][c])
{
if('V'==MatrizTipo[f][c])
{
Tablero[f][c]->Visible=true;

}
MatrizSeleccion [f][c]=3;
if('V'!=MatrizTipo[f][c])
{
return 0;
}
return 1;
}

}
return 0;

}
int ValidarPieza(int f, int c,int color)
{
if(f>-1&&f<8&&c>-1&&c<8)
{
if(color!=Matrizcolor[f][c])
{
return 1;
}

}
return 0;

int marcarPieza_peon(int f, int c,int color)


{
if(f>-1&&f<8&&c>-1&&c<8)
{
if(color!=Matrizcolor[f][c])
{
if('V'==MatrizTipo[f][c])
{
Tablero[f][c]->Visible=true;

}
MatrizSeleccion [f][c]=4;
return 1;
}

}
return 0;

}
//los movimientos del caballo que es posible que haga
void marcarCaballo(int f,int c,int color)
{
marcarPieza( f-2, c-1,color);
marcarPieza( f-1, c-2,color);

marcarPieza( f+1, c+1,color);


marcarPieza( f+2, c+2,color);

marcarPieza( f-2, c+1,color);


marcarPieza( f-1, c+2,color);

marcarPieza( f+1, c-2,color);


marcarPieza( f+2, c-1,color);

}
//la torre son 4 for por las lineas rectas
void marcartorre(int f,int c,int color)
{
//Arriba y abajo
for(int i=f-1; i>=0;i--)
{
if(1!=marcarPieza(i, c,color))
{i=0;}
}
for(int i=f+1; i<8;i++)
{
if(1!=marcarPieza(i, c,color))
{i=8;}
}
//Izquierda y derecha i es igual a j
for(int i=c-1; i>=0;i--)
{
if(1!=marcarPieza(f, i,color))
{i=0;}
}
for(int i=c+1; i<8;i++)
{
if(1!=marcarPieza(f, i,color))
{i=8;}
}

}
//el alfil son diagonales
void marcarAlfil(int f,int c,int color)
{

//Arriba y abajo
int j=c-1;
for(int i=f-1; i>=0;i--,j--)
{
if(1!=marcarPieza(i,j,color))
{i=0;}
}
j=c+1;
for(int i=f+1; i<8;i++,j++)
{
if(1!=marcarPieza(i, j,color))
{i=8;}
}
//Izquierda y derecha
j=c+1;
for(int i=f-1; i>=0;i--,j++)
{
if(1!=marcarPieza(i, j,color))
{i=0;}
}
j=c-1;
for(int i=f+1; i<8;i++,j--)
{
if(1!=marcarPieza(i, j,color))
{i=8;}
}

}
//la dama es una torre con un alfil
void marcarDama(int f,int c,int color)
{
marcartorre(f,c,color);
marcarAlfil(f,c,color);
}
//el pion lleva condiciones especiales
void marcar_pion_mueve(int f,int c,int color)
{ if(color==negro)
{marcarPieza_peon(f+1, c,color);
if( MatrizTipo[f+1][ c-1]!='V') marcarPieza(f+1, c-1,color);
if( MatrizTipo[f+1][ c+1]!='V') marcarPieza(f+1, c+1,color);
if(f==1)
{marcarPieza_peon(f+2, c,color);
}
}
if(color==blanco)
{marcarPieza_peon(f-1, c,color);

if( MatrizTipo[f-1][ c-1]!='V') marcarPieza(f-1, c-1,color);


if( MatrizTipo[f-1][ c+1]!='V') marcarPieza(f-1, c+1,color);
if(f==6)
{ marcarPieza_peon(f-2, c,color);
}}
}
//al rey le faltan las condiciones de jake y retriciones
void marcarRey(int f,int c,int color)
{
for (int i = f-1; i < f+2; i++) {
for (int j = c-1; j < c+2; j++) {
if(i!=f&&c!=j)
marcarPieza(i, j,color);

}}

}
//Aqui se llene el cuadro
__fastcall TFrmCuadro::TFrmCuadro(TComponent* Owner)
: TForm(Owner)
{
//negras
fichas(0,0,negro,'T',noselec,this->TorreNegraB);
fichas(0,1,negro,'C',noselec,this->CaballoNegroN);
fichas(0,2,negro,'A',noselec,this->AlfilNegroB);
fichas(0,3,negro,'D',noselec,this->DamaNegraN);
fichas(0,4,negro,'R',noselec,this->ReyNegroB);
fichas(0,5,negro,'A',noselec,this->AlfilNegroN);
fichas(0,6,negro,'C',noselec,this->CaballoNegroB);
fichas(0,7,negro,'T',noselec,this->TorreNegraN);

fichas(1,0,negro,'P',noselec,this->PeonNegroN1);
fichas(1,1,negro,'P',noselec,this->PeonNegroB1);
fichas(1,2,negro,'P',noselec,this->PeonNegroN2);
fichas(1,3,negro,'P',noselec,this->PeonNegroB2);
fichas(1,4,negro,'P',noselec,this->PeonNegroN3);
fichas(1,5,negro,'P',noselec,this->PeonNegroB3);
fichas(1,6,negro,'P',noselec,this->PeonNegroN4);
fichas(1,7,negro,'P',noselec,this->PeonNegroB4);

//blancas

fichas(7,0,blanco,'T',noselec,this->TorreBlancaN);
fichas(7,1,blanco,'C',noselec,this->CaballoBlancoB);
fichas(7,2,blanco,'A',noselec,this->AlfilBlancoN);
fichas(7,3,blanco,'D',noselec,this->DamaBlancaB);
fichas(7,4,blanco,'R',noselec,this->ReyBlancoN);
fichas(7,5,blanco,'A',noselec,this->AlfilBlancoB);
fichas(7,6,blanco,'C',noselec,this->CaballoBlancoN);
fichas(7,7,blanco,'T',noselec,this->TorreBlancaB);

fichas(6,0,blanco,'P',noselec,this->PeonBlancoB1);
fichas(6,1,blanco,'P',noselec,this->PeonBlancoN1);
fichas(6,2,blanco,'P',noselec,this->PeonBlancoB2);
fichas(6,3,blanco,'P',noselec,this->PeonBlancoN2);
fichas(6,4,blanco,'P',noselec,this->PeonBlancoB3);
fichas(6,5,blanco,'P',noselec,this->PeonBlancoN3);
fichas(6,6,blanco,'P',noselec,this->PeonBlancoB4);
fichas(6,7,blanco,'P',noselec,this->PeonBlancoN4);

//vacíos

fichas(2,0,nocolor,'V',noselec,this->VacioB1);
fichas(2,1,nocolor,'V',noselec,this->VacioN1);
fichas(2,2,nocolor,'V',noselec,this->VacioB2);
fichas(2,3,nocolor,'V',noselec,this->VacioN2);
fichas(2,4,nocolor,'V',noselec,this->VacioB3);
fichas(2,5,nocolor,'V',noselec,this->VacioN3);
fichas(2,6,nocolor,'V',noselec,this->VacioB4);
fichas(2,7,nocolor,'V',noselec,this->VacioN4);

fichas(3,0,nocolor,'V',noselec,this->VacioN5);
fichas(3,1,nocolor,'V',noselec,this->VacioB5);
fichas(3,2,nocolor,'V',noselec,this->VacioN6);
fichas(3,3,nocolor,'V',noselec,this->VacioB6);
fichas(3,4,nocolor,'V',noselec,this->VacioN7);
fichas(3,5,nocolor,'V',noselec,this->VacioB7);
fichas(3,6,nocolor,'V',noselec,this->VacioN8);
fichas(3,7,nocolor,'V',noselec,this->VacioB8);

fichas(4,0,nocolor,'V',noselec,this->VacioB9);
fichas(4,1,nocolor,'V',noselec,this->VacioN9);
fichas(4,2,nocolor,'V',noselec,this->VacioB10);
fichas(4,3,nocolor,'V',noselec,this->VacioN10);
fichas(4,4,nocolor,'V',noselec,this->VacioB11);
fichas(4,5,nocolor,'V',noselec,this->VacioN11);
fichas(4,6,nocolor,'V',noselec,this->VacioB12);
fichas(4,7,nocolor,'V',noselec,this->VacioN12);

fichas(5,0,nocolor,'V',noselec,this->VacioN13);
fichas(5,1,nocolor,'V',noselec,this->VacioB13);
fichas(5,2,nocolor,'V',noselec,this->VacioN14);
fichas(5,3,nocolor,'V',noselec,this->VacioB14);
fichas(5,4,nocolor,'V',noselec,this->VacioN15);
fichas(5,5,nocolor,'V',noselec,this->VacioB15);
fichas(5,6,nocolor,'V',noselec,this->VacioN16);
fichas(5,7,nocolor,'V',noselec,this->VacioB16);
}
//---------------------------------------------------------------------------

void __fastcall TFrmCuadro::SBTSalirClick(TObject *Sender)


{
Close();
}
//---------------------------------------------------------------------------
int seleccion()
{ for (int i = 0; i < 8; i++) {
for (int j =0; j < 8; j++) {
if( MatrizSeleccion[i][j]==selec)
{
return 1;
}

}
}
return 0;
}
//para saber que toco
void pregunta(int i, int j,int color)
{
if( MatrizTipo[i][j]=='P')
{
marcar_pion_mueve(i,j,color);
}
if( MatrizTipo[i][j]=='T')
{
marcartorre(i,j,color);
}
if( MatrizTipo[i][j]=='C')
{
marcarCaballo(i,j,color);
}
if( MatrizTipo[i][j]=='A')
{
marcarAlfil(i,j,color);
}
if( MatrizTipo[i][j]=='D')
{
marcarDama(i,j,color);
}
if( MatrizTipo[i][j]=='R')
{
marcarRey(i,j,color);
}

}
//lleva los turnos de los jugadores.
void piezatipo(int i, int j){

if( seleccion()==1)
{
int j_origianl =0;
int i_origianl=0;
for (int
ie = 0; ie < 8; ie++) {
for (int je =0; je < 8; je++) {

if( MatrizSeleccion[ie][je]==1)

{ j_origianl=je;

i_origianl=ie; }
}}

if( MatrizSeleccion[i][j]==3)
{

Tablero[i][j]-
>Picture=Tablero[i_origianl][j_origianl]->Picture;
fichas2(i,j,Ma
trizcolor[i_origianl][j_origianl],MatrizTipo[i_origianl][j_origianl],noselec);
fichas2(i_
origianl,j_origianl,nocolor,'V',noselec);

if(turno== blan
co)
{ turno=negro; }else
{ turno=blanco;}

}else
{
if( MatrizSeleccion[i][j]==4)
{
if(
MatrizTipo[i][j]=='V')
{
Tab
lero[i][j]->Picture=Tablero[i_origianl][j_origianl]->Picture;
fichas2(i,j,Ma
trizcolor[i_origianl][j_origianl],MatrizTipo[i_origianl][j_origianl],noselec);
fichas2(i_
origianl,j_origianl,nocolor,'V',noselec);
if(turno=
= blanco)
{ turno=negro; }else
{ turno=blanco;}
}

}
}
for (int ie = 0; ie < 8; ie++) {
for (int je =0; je < 8; je++) {

MatrizSeleccion[ie][je]=0;
if(
MatrizTipo[ie][je]=='V')
{
Tablero[ie
][je]->Visible=false;
}
}
}

}
else
{
if(turno== Matrizcolor[i][j])
{ if( MatrizTipo[i][j]!='V')
{
MatrizSeleccion[i][j]=1;
pregunta( i, j,Matrizcolor[i][j]) ;

}
}

También podría gustarte