From d49e1971e121d60d72ffab246d985ea65542554f Mon Sep 17 00:00:00 2001 From: MrGeorgen Date: Mon, 18 Mar 2024 22:35:48 +0100 Subject: [PATCH] fixes --- lib/chess/print.c | 8 ++++++-- src/chess/main.c | 1 + src/chess/move.c | 30 ++++++++++++++++++------------ src/chess/move.h | 1 + src/generateCode/moveConsts.c | 2 +- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/lib/chess/print.c b/lib/chess/print.c index aa58923..084e287 100644 --- a/lib/chess/print.c +++ b/lib/chess/print.c @@ -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"); } } diff --git a/src/chess/main.c b/src/chess/main.c index bd7b576..7346f61 100644 --- a/src/chess/main.c +++ b/src/chess/main.c @@ -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); diff --git a/src/chess/move.c b/src/chess/move.c index dc35f21..e0a84d5 100644 --- a/src/chess/move.c +++ b/src/chess/move.c @@ -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) { diff --git a/src/chess/move.h b/src/chess/move.h index d7edd0b..38d8c99 100644 --- a/src/chess/move.h +++ b/src/chess/move.h @@ -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 diff --git a/src/generateCode/moveConsts.c b/src/generateCode/moveConsts.c index 56b252d..5659b3b 100644 --- a/src/generateCode/moveConsts.c +++ b/src/generateCode/moveConsts.c @@ -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; }