Compare commits

..

2 Commits

Author SHA1 Message Date
d49e1971e1 fixes 2024-03-18 22:35:48 +01:00
93d3c6f648 gitignore 2024-03-18 21:08:38 +01:00
6 changed files with 38 additions and 15 deletions

11
.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
/*
!/src
/include/chess/generated/*
!/CMakeLists.txt
!/README.md
!/LICENSE
!/pieces
!/lib
!.gitkeep
!/include
!/.gitignore

View File

@ -11,8 +11,12 @@ void printerull(FILE *file, unsigned long long num) {
fprintf(file, "%lluu", num); fprintf(file, "%lluu", num);
} }
// for debugging
void printPieceMask(uint_least64_t mask) { void printPieceMask(uint_least64_t mask) {
for(uint_least8_t i = 0; i < CHAR_BIT * sizeof mask; ++i) { for(uint_least8_t i = 0; i < sizeof mask; ++i, mask >>= CHAR_BIT) {
printf("%d", bitsetGet(mask, i); for(uint_least8_t j = 0; j < CHAR_BIT; ++j) {
printf("%d ", bitsetGet(mask, j));
}
printf("\n");
} }
} }

View File

@ -261,6 +261,7 @@ static void app_activate(GApplication *app, gpointer data) {
int main(int argc, char **argv) { int main(int argc, char **argv) {
GtkApplication *app; GtkApplication *app;
int stat; int stat;
initMagicTable();
app = gtk_application_new("org.zinkel.chess", G_APPLICATION_DEFAULT_FLAGS); app = gtk_application_new("org.zinkel.chess", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK (app_activate), NULL); g_signal_connect(app, "activate", G_CALLBACK (app_activate), NULL);

View File

@ -37,24 +37,30 @@ static size_t getTotalMagicSize(const struct magic_t *magic) {
return size; 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() { 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); uint_least64_t *attackTable = malloc(size * sizeof *attackTable);
if(attackTable == NULL) { if(attackTable == NULL) {
perror("failed to allocate memory: "); perror("failed to allocate memory: ");
exit(1); exit(1);
} }
for(uint_least8_t field = 0; field < TOTAL_BOARD_SIZE; ++field) { initMagicHelper(attackTable, rookMagic, ROOK_DIRECTION, LENGTH(ROOK_DIRECTION));
struct magic_t *magic = rookMagic + field; initMagicHelper(attackTable + rookMagicSize, bishopMagic, BISHOP_DIRECTION, LENGTH(BISHOP_DIRECTION));
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);
}
} }
static uint_least8_t getCapturePos(uint_least8_t src, uint_least8_t dst, uint_least8_t spezialMove) { static uint_least8_t getCapturePos(uint_least8_t src, uint_least8_t dst, uint_least8_t spezialMove) {

View File

@ -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 makeMove(struct gameState_t gameState, struct move_t move);
struct gameState_t computerMove(struct gameState_t gameState); struct gameState_t computerMove(struct gameState_t gameState);
void initMagicTable();
#endif #endif

View File

@ -20,7 +20,7 @@ static void genCheckMask(const struct moveDst_t *moveDst, uint_least64_t *checkM
uint_least64_t mask = 0; uint_least64_t mask = 0;
const uint_least8_t *dst = moveDst[i].dst; const uint_least8_t *dst = moveDst[i].dst;
for(uint_least8_t j = 0; j < moveDst[i].length; ++j) { for(uint_least8_t j = 0; j < moveDst[i].length; ++j) {
mask = bitsetSet(mask, j); mask = bitsetSet(mask, dst[j]);
} }
checkMask[i] = mask; checkMask[i] = mask;
} }