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.