Repository navigation
Expand file tree
/
Copy pathutils.c
More file actions
139 lines (111 loc) · 3.4 KB
/
Copy pathutils.c
File metadata and controls
139 lines (111 loc) · 3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <stdio.h>
#include "utils.h"
#include "logic.h"
/* ---------------------*/
/* ----Bitboards----*/
/* ---------------------*/
int get_bit(unsigned long long bitboard, int square){
return (bitboard & (1ULL << square)) != 0; //returns 1 if square is occupied
}
void set_bit(unsigned long long *bitboard, int target){
*bitboard |= (1ULL << target);
}
void pop_bit(unsigned long long *bitboard, int target){
if(*bitboard & (1ULL << target))
*bitboard &= ~(1ULL << target);
else
printf("Error: Nothing to Pop, my lord\n");
}
void init_bitboard(unsigned long long *bitboard){
//init white pieces
for(int i=63; i >=48; i--){
set_bit(bitboard, i);
}
//init black pieces
for(int i=0; i<16;i++){
set_bit(bitboard, i);
}
}
void print_bitboard(unsigned long long bitboard){
printf("\n//// Printing Bitboard %c%c%c%c \n\n", 92, 92, 92, 92);
for(int rank = 0; rank <8; rank++){
for(int file = 0; file < 8; file++){
//convert file and rank into square index 0-63
int square = rank * 8 + file;
//print ranks
if(!file){
printf("%d ", 8 - rank);
}
printf("%d ", get_bit(bitboard,square));
}
printf("\n");
}
printf("\n %c %c %c %c %c %c %c %c \n", 65,66,67,68,69,70,71,72);
printf("Bitboard: 0x%llx\n", bitboard);
}
void print_chessboard(){
printf("\n//// Printing Chessboard %c%c%c%c \n\n", 92, 92, 92, 92);
for(int rank = 8; rank > 0; rank--){
printf("\n a%d, b%d, c%d, d%d, e%d, f%d, g%d, h%d,", rank, rank, rank, rank, rank, rank, rank, rank);
}
//future use
//for(int rank = 8; rank > 0; rank--){
// printf("\n \" a%d\", \"b%d\", \"c%d\", \"d%d\", \"e%d\", \"f%d\", \"g%d\", \"h%d\",", rank, rank, rank, rank, rank, rank, rank, rank);
//}
printf("\n");
}
int count_bits(unsigned long long bb){
int count = 0;
while(bb != 0){
bb &= (bb-1);
count+=1;
}
return count;
}
int get_least_significant_bit(unsigned long long bb){
if(bb){
return count_bits((bb & -bb) - 1);
}else{
return -1;
}
}
/* ---------------------*/
/* ----Randomization----*/
/* ---------------------*/
unsigned int random_state = 1804289383;
//generate 32 bit pseudo random nums
//helper function for getting random 64 bit nums
unsigned int generate_pseudo_rand_number(){
unsigned int num = random_state;
num ^= num << 13;
num ^= num >> 17;
num ^= num << 5;
random_state = num;
return num;
}
unsigned long long random_64bit_num(){
unsigned long long u1, u2, u3, u4;
u1 = (unsigned long long)(generate_pseudo_rand_number()) & 0xFFFF;
u2 = (unsigned long long)(generate_pseudo_rand_number()) & 0xFFFF;
u3 = (unsigned long long)(generate_pseudo_rand_number()) & 0xFFFF;
u4 = (unsigned long long)(generate_pseudo_rand_number()) & 0xFFFF;
return u1 | (u2 << 16ULL) | (u3 << 32ULL) | (u4 << 48ULL);
}
unsigned long long generate_magic_number(){
return random_64bit_num() & random_64bit_num() & random_64bit_num();
}
/* ---------------------*/
/* ----Magic BBs----*/
/* ---------------------*/
unsigned long long find_magic_num(int square, int relevant_bits, int bishop){
unsigned long long occupancies[4096];
unsigned long long attacks[4096];
unsigned long long used_attacks[4096];
unsigned long long attack_mask = bishop ? bishop_attacks_mask(square) : rook_attacks_mask(square);
int occupancy_indices = 1 << relevant_bits;
//loop over indices
for(int i =0; i < occupancy_indices; i++){
occupancies(i) = generate_relevant_blocker_mask(i, relevent_bits, attack_mask);
//TODO:: Finish this
}
}