khetai 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.clang-format +14 -0
- data/Gemfile.lock +1 -1
- data/README.md +5 -2
- data/ext/khetai/dev/fltk-ui/ai_loader.cpp +23 -38
- data/ext/khetai/dev/fltk-ui/ai_loader.h +5 -5
- data/ext/khetai/dev/fltk-ui/game_board.cpp +98 -204
- data/ext/khetai/dev/fltk-ui/game_board.h +12 -19
- data/ext/khetai/dev/fltk-ui/game_board_util.cpp +15 -25
- data/ext/khetai/dev/fltk-ui/game_board_util.h +1 -1
- data/ext/khetai/dev/fltk-ui/khet.cpp +9 -14
- data/ext/khetai/dev/main.c +4 -6
- data/ext/khetai/khetai.c +16 -31
- data/ext/khetai/khetai_lib.c +220 -256
- data/ext/khetai/khetai_lib.h +88 -67
- data/lib/khetai/version.rb +1 -1
- metadata +3 -2
data/ext/khetai/khetai_lib.h
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
#ifndef KHET_LIB_H_INCLUDED
|
2
2
|
#define KHET_LIB_H_INCLUDED
|
3
3
|
|
4
|
-
#include <stdint.h>
|
5
4
|
#include <stdbool.h>
|
5
|
+
#include <stdint.h>
|
6
|
+
#include <time.h>
|
6
7
|
|
7
8
|
#ifdef __cplusplus
|
8
9
|
#include <ctime>
|
@@ -15,25 +16,22 @@ typedef uint32_t Move;
|
|
15
16
|
#define MAX_SCORE 9999999
|
16
17
|
#define MAX_DEPTH 25
|
17
18
|
|
18
|
-
enum Player
|
19
|
-
|
20
|
-
|
21
|
-
Red
|
19
|
+
enum Player {
|
20
|
+
SILVER,
|
21
|
+
RED
|
22
22
|
};
|
23
|
-
enum Piece
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
Sphinx = 5
|
23
|
+
enum Piece {
|
24
|
+
ANUBIS = 1,
|
25
|
+
PYRAMID = 2,
|
26
|
+
SCARAB = 3,
|
27
|
+
PHARAOH = 4,
|
28
|
+
SPHINX = 5
|
30
29
|
};
|
31
|
-
enum Orientation
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
West
|
30
|
+
enum Orientation {
|
31
|
+
NORTH,
|
32
|
+
EAST,
|
33
|
+
SOUTH,
|
34
|
+
WEST
|
37
35
|
};
|
38
36
|
|
39
37
|
extern enum Player whose_turn;
|
@@ -92,17 +90,16 @@ extern time_t start_time;
|
|
92
90
|
extern int max_time;
|
93
91
|
|
94
92
|
#ifdef __cplusplus
|
95
|
-
extern "C"
|
96
|
-
{
|
93
|
+
extern "C" {
|
97
94
|
#endif
|
98
95
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
96
|
+
void set_time_parameters(int _max_time, time_t _start_time);
|
97
|
+
void reset_undo();
|
98
|
+
void init_zobrist();
|
99
|
+
void setup_board(char *board[]);
|
100
|
+
Move alphabeta_root(int depth, enum Player player);
|
101
|
+
void make_move(Move move);
|
102
|
+
void print_board();
|
106
103
|
|
107
104
|
#ifdef __cplusplus
|
108
105
|
}
|
@@ -137,18 +134,16 @@ static inline int get_end(Move m) { return m >> 8 & 0x7F; }
|
|
137
134
|
static inline int get_rotation(Move m) { return (m >> 15 & 0x3) - 2; }
|
138
135
|
|
139
136
|
#ifdef __cplusplus
|
140
|
-
extern "C"
|
141
|
-
{
|
137
|
+
extern "C" {
|
142
138
|
#endif
|
143
|
-
|
144
|
-
|
145
|
-
|
139
|
+
int get_start_wrapper(Move move);
|
140
|
+
int get_end_wrapper(Move move);
|
141
|
+
int get_rotation_wrapper(Move move);
|
146
142
|
#ifdef __cplusplus
|
147
143
|
}
|
148
144
|
#endif
|
149
145
|
|
150
|
-
static inline Square rotate(Square s, int rotation)
|
151
|
-
{
|
146
|
+
static inline Square rotate(Square s, int rotation) {
|
152
147
|
int orientation = get_orientation(s);
|
153
148
|
orientation = (orientation + rotation) % 4;
|
154
149
|
if (orientation < 0)
|
@@ -156,65 +151,62 @@ static inline Square rotate(Square s, int rotation)
|
|
156
151
|
return (s & 0x1F) + (orientation << 5);
|
157
152
|
}
|
158
153
|
|
159
|
-
static inline enum Player opposite_player(enum Player player)
|
160
|
-
|
161
|
-
return player == Red ? Silver : Red;
|
154
|
+
static inline enum Player opposite_player(enum Player player) {
|
155
|
+
return player == RED ? SILVER : RED;
|
162
156
|
}
|
163
157
|
|
164
|
-
#define
|
165
|
-
#define
|
158
|
+
#define DEAD -1
|
159
|
+
#define ABSORBED -2
|
166
160
|
|
167
161
|
// [laser direciton][piece type][piece orientation] = reflection result
|
168
162
|
// anubis, pyramid, scarab, pharaoh, sphinx
|
169
163
|
static const int reflections[4][5][4] = {
|
170
164
|
{// North
|
171
|
-
{
|
172
|
-
{
|
173
|
-
{
|
174
|
-
{
|
175
|
-
{
|
165
|
+
{DEAD, DEAD, ABSORBED, DEAD},
|
166
|
+
{DEAD, EAST, WEST, DEAD},
|
167
|
+
{WEST, EAST, WEST, EAST},
|
168
|
+
{DEAD, DEAD, DEAD, DEAD},
|
169
|
+
{ABSORBED, ABSORBED, ABSORBED, ABSORBED}},
|
176
170
|
{// East
|
177
|
-
{
|
178
|
-
{
|
179
|
-
{
|
180
|
-
{
|
181
|
-
{
|
171
|
+
{DEAD, DEAD, DEAD, ABSORBED},
|
172
|
+
{DEAD, DEAD, SOUTH, NORTH},
|
173
|
+
{SOUTH, NORTH, SOUTH, NORTH},
|
174
|
+
{DEAD, DEAD, DEAD, DEAD},
|
175
|
+
{ABSORBED, ABSORBED, ABSORBED, ABSORBED}},
|
182
176
|
{// South
|
183
|
-
{
|
184
|
-
{
|
185
|
-
{
|
186
|
-
{
|
187
|
-
{
|
177
|
+
{ABSORBED, DEAD, DEAD, DEAD},
|
178
|
+
{EAST, DEAD, DEAD, WEST},
|
179
|
+
{EAST, WEST, EAST, WEST},
|
180
|
+
{DEAD, DEAD, DEAD, DEAD},
|
181
|
+
{ABSORBED, ABSORBED, ABSORBED, ABSORBED}},
|
188
182
|
{// West
|
189
|
-
{
|
190
|
-
{
|
191
|
-
{
|
192
|
-
{
|
193
|
-
{
|
183
|
+
{DEAD, ABSORBED, DEAD, DEAD},
|
184
|
+
{NORTH, SOUTH, DEAD, DEAD},
|
185
|
+
{NORTH, SOUTH, NORTH, SOUTH},
|
186
|
+
{DEAD, DEAD, DEAD, DEAD},
|
187
|
+
{ABSORBED, ABSORBED, ABSORBED, ABSORBED}}};
|
194
188
|
|
195
189
|
extern uint64_t keys[0xFF][120];
|
196
190
|
extern uint64_t hashes[MAX_DEPTH];
|
197
191
|
extern uint64_t turn_key;
|
198
|
-
extern int
|
192
|
+
extern int hashes_index;
|
199
193
|
extern bool checkmate;
|
200
194
|
|
201
195
|
uint64_t get_board_hash();
|
202
196
|
static uint64_t seed = 1070372;
|
203
|
-
static inline uint64_t random_number()
|
204
|
-
{
|
197
|
+
static inline uint64_t random_number() {
|
205
198
|
seed ^= seed >> 12;
|
206
199
|
seed ^= seed << 25;
|
207
200
|
seed ^= seed >> 27;
|
208
201
|
return seed * 0x2545F4914F6CDD1DLL;
|
209
202
|
}
|
210
203
|
|
211
|
-
#define TABLE_SIZE
|
204
|
+
#define TABLE_SIZE 0x3FFFFF
|
212
205
|
|
213
206
|
#define EXACT 0
|
214
|
-
#define
|
215
|
-
#define
|
216
|
-
typedef struct HashEntry
|
217
|
-
{
|
207
|
+
#define LOWERBOUND 1
|
208
|
+
#define UPPERBOUND 2
|
209
|
+
typedef struct HashEntry {
|
218
210
|
uint64_t key;
|
219
211
|
int depth;
|
220
212
|
int flag;
|
@@ -226,4 +218,33 @@ extern HashEntry table[TABLE_SIZE];
|
|
226
218
|
static inline HashEntry *search_table(uint64_t key) { return &table[key % TABLE_SIZE]; };
|
227
219
|
void insert_table(HashEntry *entry, uint64_t key, int depth, int flag, int score, Move move);
|
228
220
|
|
221
|
+
#define EPT 0xFF
|
222
|
+
typedef struct PieceTracker {
|
223
|
+
uint8_t positions[13];
|
224
|
+
uint8_t board_idx_position[120];
|
225
|
+
} PieceTracker;
|
226
|
+
extern PieceTracker piece_trackers[2];
|
227
|
+
void init_piece_trackers();
|
228
|
+
|
229
|
+
static inline uint8_t get_board_index(enum Player player, uint8_t pos_idx) { return piece_trackers[player].positions[pos_idx]; }
|
230
|
+
static inline uint8_t get_position_index(enum Player player, uint8_t board_idx) { return piece_trackers[player].board_idx_position[board_idx]; }
|
231
|
+
static inline void update_piece_tracker(enum Player player, uint8_t old_board_idx, uint8_t new_board_idx) {
|
232
|
+
uint8_t pos_idx = get_position_index(player, old_board_idx);
|
233
|
+
piece_trackers[player].positions[pos_idx] = new_board_idx;
|
234
|
+
piece_trackers[player].board_idx_position[old_board_idx] = EPT;
|
235
|
+
piece_trackers[player].board_idx_position[new_board_idx] = pos_idx;
|
236
|
+
}
|
237
|
+
static inline void remove_from_piece_tracker(enum Player player, uint8_t board_idx) {
|
238
|
+
uint8_t pos_idx = get_position_index(player, board_idx);
|
239
|
+
piece_trackers[player].positions[pos_idx] = EPT;
|
240
|
+
piece_trackers[player].board_idx_position[board_idx] = EPT;
|
241
|
+
}
|
242
|
+
static inline void add_to_piece_tracker(enum Player player, uint8_t board_idx) {
|
243
|
+
uint8_t pos_idx = 0;
|
244
|
+
while (piece_trackers[player].positions[pos_idx] != EPT)
|
245
|
+
pos_idx++;
|
246
|
+
piece_trackers[player].positions[pos_idx] = board_idx;
|
247
|
+
piece_trackers[player].board_idx_position[board_idx] = pos_idx;
|
248
|
+
}
|
249
|
+
|
229
250
|
#endif // KHET_LIB_H_INCLUDED
|
data/lib/khetai/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: khetai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jkugs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -18,6 +18,7 @@ extensions:
|
|
18
18
|
- ext/khetai/extconf.rb
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
|
+
- ".clang-format"
|
21
22
|
- ".gitignore"
|
22
23
|
- Gemfile
|
23
24
|
- Gemfile.lock
|