Computer Chess Club Archives


Search

Terms

Messages

Subject: My progress...

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.