fixes
This commit is contained in:
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user