Author: Nicolas Carrasco
Date: 15:51:07 08/30/99
I am 15 years old and I am starting my own chess program. I am inspirated by
"TSCP" and I have taken all unoriginal ideas of that program.
I am Visual C++ 6.0 compiler (Win 32s), but I am copiling it as an console
application and isn´t dependent of any operating system. I am not worried about
the interface. Now I am working at the move_generator and search algorim. Later
position evaluations.
I am actually using 2 arrays of 64 elements save the pieces positions and color.
And a Mail_box[120] array.
My "chess engine" doesn´t has name and have some bugs to copile it after putting
a move_generation function.
Questions: Is my move generator funtion fast?
Can you help me fixing the move_generator?
Can you put a Mix-Max search Algorim and/or explain me how to?
NOTE: I am sorry because the variables are in Spanish but the next time I will
relase the in English. Acutually it can´t compile because I changed the
move_generator function.
If you answer me please send me also an e-mail to me.
Thanks.
// MAIN.CPP
#include <stdio.h>
#include "definiciones.h"
/*
*************************************************************/
void restablecer_piezas(void);
void imprimir_tablero (void);
void generar_movimientos (BOOL side);
//void grabar_movimiento (char destino);
/*
*************************************************************/
void main (void)
{
restablecer_piezas();
printf("Fuego 0.1\n\n");
imprimir_tablero();
generar_movimientos(WHITE);
printf("%d",lista.movimiento[1]);
}
/*
*************************************************************/
void restablecer_piezas (void)
{
char cont;
for (cont = 0; cont < 64; cont++)
{
color[cont] = init_color[cont];
piece[cont] = init_piece[cont];
}
}
/* Función void imprimir_tablero (void): Imprime posción actual
*************************************************************/
void imprimir_tablero (void)
{
char i;
for(i=0;i<64;i++)
{
switch(color[i])
{
case EMPTY: printf(" ."); break;
case WHITE: printf(" %c",piece_char[piece[i]]); break;
case BLACK: printf(" %c",piece_char[piece[i]]+('a'-'A')); break;
}
if((i+1)%8==0)
putchar('\n');
}
}
/*
*************************************************************/
void generar_movimientos (BOOL side)
{
char pos;
char cont; // pos buffer
BOOL xside = ~side;
for (pos = 0; pos < 64; pos++)
{
//////////////////////////////////////////////////////////
switch(piece[pos])
{
//////////////////////////////////////////////////////////
case PAWN:
if (color[pos] == WHITE)
{
if (mailbox[mailbox64[pos]-11] != -1 && color[pos-9] == xside) //Captura
Diagolnal IZQUIERDA
grabar_movimiento(pos-9);
if (mailbox[mailbox64[pos]-9] != -1 && color[pos-7] == xside) //Captura
Diagolnal DERECHA
grabar_movimiento(pos-7);
if (mailbox[mailbox64[pos]-10] != -1 && color[pos-8] == EMPTY) //Adelante
{
grabar_movimiento(pos-8);
if (mailbox[mailbox64[pos]-20] != -1 && pos >= 48 && color[pos-16] == EMPTY)
grabar_movimiento(pos-16);
}
}
else
{
if (mailbox[mailbox64[pos]+11] != -1 && color[pos+9] == xside) //Captura
Diagolnal IZQUIERDA
grabar_movimiento(pos+9);
if (mailbox[mailbox64[pos]+9] != -1 && color[pos+7] == xside) //Captura
Diagolnal DERECHA
grabar_movimiento(pos+7);
if (mailbox[mailbox64[pos]+10] != -1 && color[pos+8] == EMPTY) //Adelante
{
grabar_movimiento(pos+8);
if (mailbox[mailbox64[pos]+20] != -1 && pos <= 15 && color[pos+16] == EMPTY)
grabar_movimiento(pos+16);
}
}
break;
//////////////////////////////////////////////////////////
case KNIGHT:
if (mailbox[mailbox64[pos]-21] != -1 && color[pos-17] != side)
grabar_movimiento(pos-17);
if (mailbox[mailbox64[pos]-19] != -1 && color[pos-15] != side)
grabar_movimiento(pos-15);
if (mailbox[mailbox64[pos]+21] != -1 && color[pos+17] != side)
grabar_movimiento(pos+17);
if (mailbox[mailbox64[pos]+19] != -1 && color[pos+15] != side)
grabar_movimiento(pos+15);
if (mailbox[mailbox64[pos]-12] != -1 && color[pos-10] != side)
grabar_movimiento(pos-10);
if (mailbox[mailbox64[pos]+8] != -1 && color[pos+6] != side)
grabar_movimiento(pos+6);
if (mailbox[mailbox64[pos]+12] != -1 && color[pos+10] != side)
grabar_movimiento(pos+10);
if (mailbox[mailbox64[pos]-8] != -1 && color[pos-6] != side)
grabar_movimiento(pos-6);
break;
//////////////////////////////////////////////////////////
case BISHOP:
for (cont = 1; mailbox[mailbox64[pos]-11*cont] != -1 && color[pos-9*cont] !=
side; cont++)
{
if (color[pos-9*cont] == xside)
{
grabar_movimiento(pos-9*cont);
break;
}
else
grabar_movimiento(pos-9*cont);
}
for (cont = 1; mailbox[mailbox64[pos]+11*cont] != -1 && color[pos+9*cont] !=
side; cont++)
{
if (color[pos+9*cont] == xside)
{
grabar_movimiento(pos+9*cont);
break;
}
else
grabar_movimiento(pos+9*cont);
}
// OTRA DIAGONAL
for (cont = 1; mailbox[mailbox64[pos]+9*cont] != -1 && color[pos+7*cont] !=
side; cont++)
{
if (color[pos+7*cont] == xside)
{
grabar_movimiento(pos+7*cont);
break;
}
else
grabar_movimiento(pos+7*cont);
}
for (cont = 1; mailbox[mailbox64[pos]-9*cont] != -1 && color[pos-7*cont] !=
side; cont++)
{
if (color[pos-7*cont] == xside)
{
grabar_movimiento(pos-7*cont);
break;
}
else
grabar_movimiento(pos-7*cont);
}
break;
//////////////////////////////////////////////////////////
case ROOK:
// HORIZONTAL
for (cont = 1; mailbox[mailbox64[pos]-1*cont] != -1 && color[pos-1*cont] !=
side; cont++)
{
if (color[pos-1*cont] == xside)
{
grabar_movimiento(pos-1*cont);
break;
}
else
grabar_movimiento(pos-1*cont);
}
for (cont = 1; mailbox[mailbox64[pos]+1*cont] != -1 && color[pos+1*cont] !=
side; cont++)
{
if (color[pos+1*cont] == xside)
{
grabar_movimiento(pos+1*cont);
break;
}
else
grabar_movimiento(pos+1*cont);
}
// VERTICAL
for (cont = 1; mailbox[mailbox64[pos]+10*cont] != -1 && color[pos+8*cont] !=
side; cont++)
{
if (color[pos+8*cont] == xside)
{
grabar_movimiento(pos+8*cont);
break;
}
else
grabar_movimiento(pos+8*cont);
}
for (cont = 1; mailbox[mailbox64[pos]-10*cont] != -1 && color[pos-8*cont] !=
side; cont++)
{
if (color[pos-8*cont] == xside)
{
grabar_movimiento(pos-8*cont);
break;
}
else
grabar_movimiento(pos-8*cont);
}
break;
//////////////////////////////////////////////////////////
case QUEEN:
// MOVIMIENTOS ROOK
// HORIZONTAL
for (cont = 1; mailbox[mailbox64[pos]-1*cont] != -1 && color[pos-1*cont] !=
side; cont++)
{
if (color[pos-1*cont] == xside)
{
grabar_movimiento(pos-1*cont);
break;
}
else
grabar_movimiento(pos-1*cont);
}
for (cont = 1; mailbox[mailbox64[pos]+1*cont] != -1 && color[pos+1*cont] !=
side; cont++)
{
if (color[pos+1*cont] == xside)
{
grabar_movimiento(pos+1*cont);
break;
}
else
grabar_movimiento(pos+1*cont);
}
// VERTICAL
for (cont = 1; mailbox[mailbox64[pos]+10*cont] != -1 && color[pos+8*cont] !=
side; cont++)
{
if (color[pos+8*cont] == xside)
{
grabar_movimiento(pos+8*cont);
break;
}
else
grabar_movimiento(pos+8*cont);
}
for (cont = 1; mailbox[mailbox64[pos]-10*cont] != -1 && color[pos-8*cont] !=
side; cont++)
{
if (color[pos-8*cont] == xside)
{
grabar_movimiento(pos-8*cont);
break;
}
else
grabar_movimiento(pos-8*cont);
}
// MOVIMIENTOS DE BISHOP
for (cont = 1; mailbox[mailbox64[pos]-11*cont] != -1 && color[pos-9*cont] !=
side; cont++)
{
if (color[pos-9*cont] == xside)
{
grabar_movimiento(pos-9*cont);
break;
}
else
grabar_movimiento(pos-9*cont);
}
for (cont = 1; mailbox[mailbox64[pos]+11*cont] != -1 && color[pos+9*cont] !=
side; cont++)
{
if (color[pos+9*cont] == xside)
{
grabar_movimiento(pos+9*cont);
break;
}
else
grabar_movimiento(pos+9*cont);
}
// OTRA DIAGONAL
for (cont = 1; mailbox[mailbox64[pos]+9*cont] != -1 && color[pos+7*cont] !=
side; cont++)
{
if (color[pos+7*cont] == xside)
{
grabar_movimiento(pos+7*cont);
break;
}
else
grabar_movimiento(pos+7*cont);
}
for (cont = 1; mailbox[mailbox64[pos]-9*cont] != -1 && color[pos-7*cont] !=
side; cont++)
{
if (color[pos-7*cont] == xside)
{
grabar_movimiento(pos-7*cont);
break;
}
else
grabar_movimiento(pos-7*cont);
}
break;
//////////////////////////////////////////////////////////
/*
case KING:
;
//////////////////////////////////////////////////////////
*/
}
}
}
// DEFINICIONES.H
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define PAWN 0
#define KNIGHT 1
#define BISHOP 2
#define ROOK 3
#define QUEEN 4
#define KING 5
#define WHITE 0
#define BLACK 1
#define EMPTY 6
#define BOOL char
#define FILE(x) (x&7)
#define RANK(x) (x>>3)
/*
*************************************************************/
char color[64]; /* WHITE, BLACK, or EMPTY */
char piece[64]; /* PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING, or EMPTY */
/*
*************************************************************/
//char side = WHITE; /* the side to move */
//char xside = BLACK; /* the side not to move */
/*
*************************************************************/
char mailbox[120]= {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, -1,
-1, 8, 9, 10, 11, 12, 13, 14, 15, -1,
-1, 16, 17, 18, 19, 20, 21, 22, 23, -1,
-1, 24, 25, 26, 27, 28, 29, 30, 31, -1,
-1, 32, 33, 34, 35, 36, 37, 38, 39, -1,
-1, 40, 41, 42, 43, 44, 45, 46, 47, -1,
-1, 48, 49, 50, 51, 52, 53, 54, 55, -1,
-1, 56, 57, 58, 59, 60, 61, 62, 63, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
char mailbox64[64]= {
21, 22, 23, 24, 25, 26, 27, 28,
31, 32, 33, 34, 35, 36, 37, 38,
41, 42, 43, 44, 45, 46, 47, 48,
51, 52, 53, 54, 55, 56, 57, 58,
61, 62, 63, 64, 65, 66, 67, 68,
71, 72, 73, 74, 75, 76, 77, 78,
81, 82, 83, 84, 85, 86, 87, 88,
91, 92, 93, 94, 95, 96, 97, 98
};
/* Posciciones iniciales
*************************************************************/
char init_color[64]= {
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
char init_piece[64]= {
3, 1, 2, 4, 5, 2, 1, 3,
0, 0, 0, 0, 0, 0, 0, 0,
6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6,
6, 0, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6,
0, 0, 0, 0, 0, 0, 0, 0,
3, 1, 2, 4, 5, 2, 1, 3
};
/*
*************************************************************/
char notation [64][3]= {
"a8","b8","c8","d8","e8","f8","g8","h8",
"a7","b7","c7","d7","e7","f7","g7","h7",
"a6","b6","c6","d6","e6","f6","g6","h6",
"a5","b5","c5","d5","e5","f5","g5","h5",
"a4","b4","c4","d4","e4","f4","g4","h4",
"a3","b3","c3","d3","e3","f3","g3","h3",
"a2","b2","c2","d2","e2","f2","g2","h2",
"a1","b1","c1","d1","e1","f1","g1","h1"
};
/*
*************************************************************/
char piece_char[6]= {
'P', 'N', 'B', 'R', 'Q', 'K'
};
/*
*************************************************************/
struct lista_movimientos
{
unsigned char num;
char movimiento[160];
};
lista_movimientos lista;
void grabar_movimiento (char destino)
{
lista.num++;
lista.movimiento[lista.num] = destino;
printf("%d ",lista.movimiento[lista.num]);
}
This page took 0.01 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.