- Those that use the Table to lookup to squares directly - Gerd Isenberg's CLL, Bruce Moreland's approach.
- Those that use the Table to lookup to squares indirectly - Vincent Diepeveen's vector of squares (from what I can tell).
Vincent's generator skeleton is rather vague - so I can't quite tell what all the arrays do. (I initially thought that ipiecepos[][] was a vector of piece moves - and then it appeared in pawn generation)
So, could someone at least show me how a correct generator would look like for either of those methods?
FWIW, here's my move table initialization routine (called twice)
Code: Select all
int init_move_table()
{
int i, j, k, l;
for (i = 0; i < 64; i++) board_main[i] = NP;
i = 0;
for (j = 0; j < 64; j++) {
mt_head[0][j] = (mt_node *)mt_table[i];
k = j + 7;
while (k < 64 && k >= 0 && (k&7) != 7) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = *mt_table[move_dirs[NW][j]];
k += 7;
i++;
}
move_dirs[NW][i] = i;
k = j + 9;
while (k < 64 && k >= 0 && (k&7) != 0) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = *mt_table[move_dirs[NE][j]];
k += 9;
i++;
}
move_dirs[NE][i] = i;
k = j - 7;
while (k < 64 && k >= 0 && (k&7) != 7) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = *mt_table[move_dirs[SW][j]];
k -= 7;
i++;
}
move_dirs[SW][i] = i;
k = j - 9;
while (k < 64 && k >= 0 && (k&7) != 0) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = NULL;
k -= 9;
i++;
}
move_dirs[SE][i] = i;
move_head[1][j] = i;
l = j - (j>>3);
k = j + 8;
while (k < 64 && k >= 0 && k >= l) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = *mt_table[move_dirs[N][j]];
k += 8;
i++;
}
move_dirs[N][i] = i;
k = j + 1;
while (k < 64 && k >= 0 && k <= l) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = *mt_table[move_dirs[W][j]];
k += 1;
i++;
}
move_dirs[W][i] = i;
k = j - 8;
while (k < 64 && k >= 0) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = *mt_table[move_dirs[S][j]];
k -= 8;
i++;
}
move_dirs[S][i] = i;
k = j - 1;
while (k < 64 && k >= 0 && (k >> 3) < 7) {
mt_table[i].sq = k;
mt_table[i].next[0] = *mt_table[i + 1];
mt_table[i].next[1] = NULL;
k -= 1;
i++;
}
move_dirs[E][i] = i;
}
return i;
}
(I won't be convinced to try bitboards or an array type)
Matthew:out