fixes
This commit is contained in:
@ -11,8 +11,12 @@ void printerull(FILE *file, unsigned long long num) {
|
||||
fprintf(file, "%lluu", num);
|
||||
}
|
||||
|
||||
// for debugging
|
||||
void printPieceMask(uint_least64_t mask) {
|
||||
for(uint_least8_t i = 0; i < CHAR_BIT * sizeof mask; ++i) {
|
||||
printf("%d", bitsetGet(mask, i);
|
||||
for(uint_least8_t i = 0; i < sizeof mask; ++i, mask >>= CHAR_BIT) {
|
||||
for(uint_least8_t j = 0; j < CHAR_BIT; ++j) {
|
||||
printf("%d ", bitsetGet(mask, j));
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
@ -261,6 +261,7 @@ static void app_activate(GApplication *app, gpointer data) {
|
||||
int main(int argc, char **argv) {
|
||||
GtkApplication *app;
|
||||
int stat;
|
||||
initMagicTable();
|
||||
|
||||
app = gtk_application_new("org.zinkel.chess", G_APPLICATION_DEFAULT_FLAGS);
|
||||
g_signal_connect(app, "activate", G_CALLBACK (app_activate), NULL);
|
||||
|
||||
@ -37,24 +37,30 @@ static size_t getTotalMagicSize(const struct magic_t *magic) {
|
||||
return size;
|
||||
}
|
||||
|
||||
static void initMagicHelper(uint_least64_t *attackTable, struct magic_t *magic,
|
||||
const uint_least8_t *direction, const uint_least8_t directionLength) {
|
||||
for(uint_least8_t field = 0; field < TOTAL_BOARD_SIZE; ++field, ++magic) {
|
||||
attackTable += getMagicSize(*magic);
|
||||
magic->attackTable = attackTable;
|
||||
uint_least64_t pieceArangement = 0;
|
||||
do { // https://stackoverflow.com/questions/7277554/what-is-a-good-way-to-iterate-a-number-through-all-the-possible-values-of-a-mask
|
||||
const uint_least64_t attackMask = slidingMovementMask(direction, directionLength, field, pieceArangement);
|
||||
*getMagicAttackPtr(pieceArangement, *magic) = attackMask;
|
||||
pieceArangement = (pieceArangement - magic->mask) & magic->mask;
|
||||
} while(pieceArangement != 0);
|
||||
}
|
||||
}
|
||||
|
||||
void initMagicTable() {
|
||||
size_t size = getTotalMagicSize(rookMagic) + getTotalMagicSize(bishopMagic);
|
||||
const size_t rookMagicSize = getTotalMagicSize(rookMagic);
|
||||
const size_t size = rookMagicSize + getTotalMagicSize(bishopMagic);
|
||||
uint_least64_t *attackTable = malloc(size * sizeof *attackTable);
|
||||
if(attackTable == NULL) {
|
||||
perror("failed to allocate memory: ");
|
||||
exit(1);
|
||||
}
|
||||
for(uint_least8_t field = 0; field < TOTAL_BOARD_SIZE; ++field) {
|
||||
struct magic_t *magic = rookMagic + field;
|
||||
attackTable += getMagicSize(*magic);
|
||||
magic->attackTable = attackTable;
|
||||
uint_least64_t pieceArangement = 0;
|
||||
do { // https://stackoverflow.com/questions/7277554/what-is-a-good-way-to-iterate-a-number-through-all-the-possible-values-of-a-mask
|
||||
const uint_least64_t attackMask = slidingMovementMask(ROOK_DIRECTION, LENGTH(ROOK_DIRECTION), field, pieceArangement);
|
||||
*getMagicAttackPtr(pieceArangement, *magic) = attackMask;
|
||||
pieceArangement = (pieceArangement - magic->mask) & magic->mask;
|
||||
} while(pieceArangement != 0);
|
||||
}
|
||||
initMagicHelper(attackTable, rookMagic, ROOK_DIRECTION, LENGTH(ROOK_DIRECTION));
|
||||
initMagicHelper(attackTable + rookMagicSize, bishopMagic, BISHOP_DIRECTION, LENGTH(BISHOP_DIRECTION));
|
||||
}
|
||||
|
||||
static uint_least8_t getCapturePos(uint_least8_t src, uint_least8_t dst, uint_least8_t spezialMove) {
|
||||
|
||||
@ -40,5 +40,6 @@ uint_least8_t pieceValidMoves(struct gameState_t gameState, struct piece_t piece
|
||||
|
||||
struct gameState_t makeMove(struct gameState_t gameState, struct move_t move);
|
||||
struct gameState_t computerMove(struct gameState_t gameState);
|
||||
void initMagicTable();
|
||||
|
||||
#endif
|
||||
|
||||
@ -20,7 +20,7 @@ static void genCheckMask(const struct moveDst_t *moveDst, uint_least64_t *checkM
|
||||
uint_least64_t mask = 0;
|
||||
const uint_least8_t *dst = moveDst[i].dst;
|
||||
for(uint_least8_t j = 0; j < moveDst[i].length; ++j) {
|
||||
mask = bitsetSet(mask, j);
|
||||
mask = bitsetSet(mask, dst[j]);
|
||||
}
|
||||
checkMask[i] = mask;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user