Author: Maurizio Di Vitto
Date: 09:56:19 02/06/04
Hi again,
in these last days I work a lot on my chess program. I tried to write a UnMake
function. At the first I created a new class called history that looks like:
class History
{
public:
Move *m;
unsigned char castle_state,epfile_state;
}his[MAXPLIES];
The purpose of this class is to keep the move, castle and the epfile variables
for each ply. Until here is it correct?
So I used it in this lines
bool Board::MakeMove(Move *m)
{
register unsigned int from=m->From();
register unsigned int to=m->To();
register unsigned int sntm=stm^1;
register BitBoard bb_from=SetBit(from);
register BitBoard bb_to=SetBit(to);
his[ply].m=m;
his[ply].castle_state=castle;
his[ply].epfile_state=epfile;
epfile=0;
switch(m->Action())
{...........
Is It correct?
Then in my UnMakeMove I used it again to take the old value:
void Board::UnMakeMove()
{
Move *move;
register unsigned int sntm=stm;
stm^=1;
--ply;
move=his[ply].m;
castle=his[ply].castle_state;
epfile=his[ply].epfile_state;
register unsigned int from=move->From();
register unsigned int to=move->To();
register unsigned int captured=move->Capture();
register BitBoard bb_from=SetBit(from);
register BitBoard bb_to=SetBit(to);
switch(move->Action())
{
case PAWN:
pawns^=bb_to;
pawns^=bb_from;
piece[from]=PAWN;
break;
case KNIGHT:
knights^=bb_to;
knights^=bb_from;
piece[from]=KNIGHT;
break;
case BISHOP:
bishops^=bb_to;
bishops^=bb_from;
piece[from]=BISHOP;
break;
case ROOK:
rooks^=bb_to;
rooks^=bb_from;
piece[from]=ROOK;
break;
case QUEEN:
queens^=bb_to;
queens^=bb_from;
piece[from]=QUEEN;
break;
case KING:
kings^=bb_to;
kings^=bb_from;
ksq[stm]=from;
piece[from]=KING;
break;
case CASTLE:
unsigned int rook_from,rook_to;
kings^=bb_to;
kings^=bb_from;
ksq[stm]=from;
piece[from]=KING;
switch(from)
{
case g1: rook_from=f1; rook_to=h1; break;
case c1: rook_from=d1; rook_to=a1; break;
case g8: rook_from=f8; rook_to=h8; break;
case c8: rook_from=d8; rook_to=a8; break;
}
piece[rook_from]=EMPTY;
piece[rook_to]=ROOK;
rooks^=SetBit(rook_from);
rooks^=SetBit(rook_to);
occupied_co[stm] ^= SetBit(rook_from)^SetBit(rook_to);
occupied_l90 ^= SetBitL90(rook_from)^SetBitL90(rook_to);
occupied_l45 ^= SetBitL45(rook_from)^SetBitL45(rook_to);
occupied_r45 ^= SetBitR45(rook_from)^SetBitR45(rook_to);
break;
case TWOFORWARD:
pawns^=bb_to;
pawns^=bb_from;
piece[from]=PAWN;
break;
case PROMOTE:
pawns^=bb_from;
piece[from]=PAWN;
switch(move->Promote())
{
case KNIGHT: knights^=bb_to; break;
case BISHOP: bishops^=bb_to; break;
case ROOK: rooks^=bb_to; break;
case QUEEN: queens^=bb_to; break;
}
break;
}
switch(move->Removal())
{
case EMPTY:
occupied_l90 ^= SetBitL90(to);
occupied_l45 ^= SetBitL45(to);
occupied_r45 ^= SetBitR45(to);
break;
case PAWN:
pawns^=bb_to;
occupied_co[sntm]^=bb_to;
break;
case KNIGHT:
knights^=bb_to;
occupied_co[sntm]^=bb_to;
break;
case BISHOP:
bishops^=bb_to;
occupied_co[sntm]^=bb_to;
break;
case ROOK:
rooks^=bb_to;
occupied_co[sntm]^=bb_to;
break;
case QUEEN:
queens^=bb_to;
occupied_co[sntm]^=bb_to;
break;
case ENPASSANT:
pawns^=bb_to;
occupied_co[sntm]^=bb_to;
break;
}
piece[to]=EMPTY;
occupied_co[stm] ^= bb_from^bb_to;
occupied_l90 ^= SetBitL90(from);
occupied_l45 ^= SetBitL45(from);
occupied_r45 ^= SetBitR45(from);
}
Is it all correct. I think that shoul be somethig wrong because it would
impossible that I wrote without made mistakes.
Thank you again.
Maurizio Di Vitto
This page took 0 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.