Author: Will Singleton
Date: 16:14:43 09/21/01
Go up one level in this thread
On September 21, 2001 at 18:26:14, Carlos del Cacho wrote:
>On September 21, 2001 at 16:51:05, Alvaro Jose Povoa Cardoso wrote:
>
>>This question is for Bruce Moreland, since he is the only one who can answer (I
>>think).
>>Does Ferret and Gerbil share the same board representation (128 squares)?
>>
>>Thank you,
>>Alvaro Cardoso
>
>Ferret doesn't use 0x88, AFAIK.
>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>New move Generation algoritm:
>
>Revision: 1989-09-06
>
>Author: Hans Eric Sandstroem.
>
>This algortim is the result of an attempt to make an hardware move
>generator, but since I newer had the time and resources to build
>the hardware I wrote a software version and incorporated that one
>into gnuchess. This was the best way I could think of sharing this
>algorithm with the computer chess community.
>
>If there is anybody out there with the time and rescources to build
>a hardware move generator I will be glad to assist.
>
>The general idea behind this algoritm is to pre calculate
>a lot of data. The data that is pre calculated is every possible move
>for every piece from every square disregarding any other pieces on the
>board. This pre calculated data is stored in an array that looks like
>this:
>
>struct sqdata {
> short nextpos;
> short nextdir;
>};
>struct sqdata posdata[8][64][64];
>/* posdata[piecetype][fromsquare][destinationsquare] */
>example:
> the first move for a queen at e8 is stored at;
> posdata[queen][e8][e8].nextpos
> suppose this is e7 and e7 is occupied then the next move
> will be found in;
> posdata[queen][e8][e7].nextdir
>
>To handle the differeces between white and black pawns (they move in
>opposite directions) an array ptype has been introduced:
>
>static const short ptype[2][8] = {
> no_piece,pawn,knight,bishop,rook,queen,king,no_piece,
> no_piece,bpawn,knight,bishop,rook,queen,king,no_piece};
> ^^^^^
>And it is used like this:
> piecetype = ptype[side][piece]
>When generating moves for pieces that are not black pawns, piece
>can be used directly in posdata. As in the example above.
>
>Thus the only thing one has to do when generating the moves
>is to check for collisions with other pieces.
>the move generation to do this looks like this: (for non pawns)
> p = posdata[piece][sq];
> u = p[sq].nextpos;
> do {
> if (color[u] == neutral) {
> LinkMove(ply,sq,u,xside);
> u = p[u].nextpos;
> }
> else {
> if (color[u] == xside) LinkMove(ply,sq,u,xside);
> u = p[u].nextdir;
> }
> } while (u != sq);
>
> - I`nt this just beautiful!
>
>The array posdata is initialized in the routine Initialize_moves.
>This routine is called just once and it works so no time has been spent
>on the structure of this code. GenMoves and CaptureList generates the
>moves but the routines ataks, BRscan, Sqatakd, KingScan and trapped
>also relies on the move generation algoritm so they have also been
>rewritten.
My movegen, as well as other routines, works the same way. So does Ferret's,
and probably many others.
Will
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.