Computer Chess Club Archives


Search

Terms

Messages

Subject: New chess programer ask you HELP:

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.