Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Programming piece table

Author: Robert Hyatt

Date: 21:10:14 04/17/98

Go up one level in this thread


On April 17, 1998 at 15:46:23, Dan Newman wrote:

>On April 17, 1998 at 07:30:51, Inmann Werner wrote:
>
>>Piece table question
>>
>>Can anybody help me?
>>
>>When generating moves in my chess programm, until now I search the whole
>>boad for pieces. I want to speed this up and use a figure list like
>>this:
>>
>>Typedef struct{
>>	Char where	      /*Position on Table*/
>>	Char what             /*which piece (0=nothing;1=pawn ...*/
>>	}TYPFIGLI;
>>
>>TYPFIGLI FIGLI[2][16];       (FIGLI[0].. is white, FIGLI[1].. is black)
>>
>>Char FIGBR[125(A board table with a 'pointer' to FIGLI (10*12 board))
>>
>>In the move Generator and the evaluation function, everything works
>>fine.
>>In the routine 'DO_MOVE' it is a little bit tricky, but it works.
>>	FIGLI[color][FIGBR[from]].where=tomove
>>        FIGBR[tomove]=FIGBR[from]
>>        FIGBR[from]=-1
>>
>>But in the routine 'UNDO_MOVE' i have a problem, when I put back a
>>captured piece.
>>
>>There are two possibilities.
>>
>>1) search the structure FIGLI for an empty field and use it.
>>2) Increase the number of pieces in FIGLI and store the piece in the
>>last one
>>
>>If I use 1), I possibly have to search up to 16 times to find an emty
>>location.
>>If I use 2), I have to increase the structure of FIGLI and more and more
>>'pieces' are in it. In 'Generate moves'	everything slows down. (maybe I
>>get even an overflow).
>>
>>Which possibility is better?(I think the first one)
>>Does anybody know anything much better and faster!!!.
>>
>>Thank you very much,
>>
>>INMANN WERNER
>>
>>PS: I am from Germany, and my English is rather poor. Excuse me!!
>
>Here are two tricks I've used for this.
>
>1) When a piece is captured (and removed from the piece list (figure
>list))
>   move the piece at the end of the list into the now empty location.
>   When undoing the capture just put the un-captured piece at the end of
>   the list.  You would of course maintain a count of the pieces in each
>   list to make it easy to find the ends of the lists and for iteration
>   through the lists.
>
>2) Use one of the bits in the piece to mark the piece as captured but do
>   not remove the piece from the list.  Use this bit to skip over this
>   piece when doing move generation, etc.  When undoing the capture,
>just
>   clear this bit.  (You could use the high order bit in the 'what'
>   member of the piece.)
>



here's something we did in Cray Blitz:  on the normal board, put a
pointer
to the piece "record" you defined above.  then you can always find out
which piece record to "fix" since after making a move "to" points to
board[to] which points to the piece record for the piece on that
square...








>There are advantages and disadvantages to each of these.  With 1) the
>piece
>list grows shorter as the game progresses.  This helps with move
>generation
>in the endgame--it gets quite fast.  But the order of the pieces in the
>list becomes scrambled and thus the order in which moves are generated
>may
>suffer.
>
>In 2) (the one I currently use--mainly because of its simplicity) the
>order
>of the pieces is fixed.  This allows you to generate moves in order of
>piece type (which may help with move ordering).  The main disadvantage
>is
>that the length is always 16 so that move generation has some overhead
>(especially noticeable in the endgame).



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.