Code: Select all
#include <stdio.h>
#define MKSQ(r,f) ((r*8)+f)
#define END(idx) MoveTable[idx] = 64, idx++
unsigned int MoveTable[1968];
unsigned int MoveTableLookup[2][64][4]; // [Rook?][Square][Direction]
int FillMoveTable(int rank, int file, int rankinc, int fileinc, int idx)
{
int destrank, destfile;
for (destrank = rank + rankinc, destfile = file + fileinc;
destrank >= 0 && destrank <= 7 &&
destfile >= 0 && destfile <= 7;
destrank += rankinc, destfile += fileinc) {
MoveTable[idx] = MKSQ(destrank, destfile);
idx++;
}
return idx;
}
void InitialiseMoveTable()
{
int idx, rank, file;
idx = 0;
for (rank = 0; rank < 8; rank++) {
for (file = 0; file < 8; file++) {
MoveTableLookup[0][MKSQ(rank, file)][0] = idx;
idx = FillMoveTable(rank, file, +1, +1, idx);
END(idx);
MoveTableLookup[0][MKSQ(rank, file)][1] = idx;
idx = FillMoveTable(rank, file, +1, -1, idx);
END(idx);
MoveTableLookup[0][MKSQ(rank, file)][2] = idx;
idx = FillMoveTable(rank, file, -1, +1, idx);
END(idx);
MoveTableLookup[0][MKSQ(rank, file)][3] = idx;
idx = FillMoveTable(rank, file, -1, -1, idx);
END(idx);
}
}
for (rank = 0; rank < 8; rank++) {
for (file = 0; file < 8; file++) {
MoveTableLookup[1][MKSQ(rank, file)][0] = idx;
idx = FillMoveTable(rank, file, +1, 0, idx);
END(idx);
MoveTableLookup[1][MKSQ(rank, file)][1] = idx;
idx = FillMoveTable(rank, file, -1, 0, idx);
END(idx);
MoveTableLookup[1][MKSQ(rank, file)][2] = idx;
idx = FillMoveTable(rank, file, 0, +1, idx);
END(idx);
MoveTableLookup[1][MKSQ(rank, file)][3] = idx;
idx = FillMoveTable(rank, file, 0, -1, idx);
END(idx);
}
}
}
int main()
{
InitialiseMoveTable();
int i, j;
for (i = 0; i < 4; i++) {
j = MoveTableLookup[1][31][i];
while (MoveTable[j] != 64) {
printf("%d\n", MoveTable[j]);
j++;
}
}
return 0;
}