khetai 0.2.1 → 0.2.3
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/Gemfile.lock +1 -1
- data/README.md +6 -2
- data/ext/khetai/dev/fltk-ui/ai_loader.cpp +5 -0
- data/ext/khetai/dev/fltk-ui/ai_loader.h +1 -0
- data/ext/khetai/dev/fltk-ui/game_board_util.cpp +2 -0
- data/ext/khetai/khetai.c +2 -2
- data/ext/khetai/khetai_lib.c +13 -8
- data/ext/khetai/khetai_lib.h +2 -1
- data/lib/khetai/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d169f4a004e24dd36c20cc0483e97089288c37d9a883102902e57ad90b9da52c
|
4
|
+
data.tar.gz: 4220a784bde8231944b7cd856839f651c7b7d0491748e6597a1d6a94c58c468d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74a55ef185db9d73c58e9e148a3e124f5850da6304be611d7466d8951e43b6d3165e9fbf5ae98654c12861a49e3281bf6a299f03f0b55e9d63ee51c6b76d2793
|
7
|
+
data.tar.gz: 6409ac627699d0daa5a7cacb4ce1da174be6f433228466b7cd0ffd04e7c47d9830f11de41e629313b38b776dd7a41647aa82e405f49dc18d69e03f23a14a8f65
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -51,16 +51,20 @@ The internals of the gem are written in C, located in `ext/khetai`.
|
|
51
51
|
$ bundle exec rake build
|
52
52
|
$ gem install pkg/khetai-<version>.gem
|
53
53
|
|
54
|
+
Once tested and verified, bump the version number in `lib/khetai/version.rb` and commit changes.
|
54
55
|
|
55
56
|
To release and push to rubygems.org:
|
56
57
|
|
57
58
|
$ bundle exec rake release
|
59
|
+
|
60
|
+
To push a pre-built gem manually:
|
61
|
+
|
58
62
|
$ gem push pkg/<gem>
|
59
63
|
|
60
64
|
## Manual Testing
|
61
65
|
|
62
|
-
There is a GUI test harness written in C++ using FLTK available in the
|
66
|
+
There is a GUI test harness written in C++ using FLTK available in the [ext/khetai/dev/fltk-ui](/ext/khetai/dev/fltk-ui) directory.
|
63
67
|
|
64
68
|
### Why does this exist?
|
65
69
|
|
66
|
-
|
70
|
+
As something to work on and learn from.
|
@@ -52,6 +52,11 @@ void (*AILoader::get_init_zobrist())()
|
|
52
52
|
return reinterpret_cast<void (*)()>(get_symbol("init_zobrist"));
|
53
53
|
}
|
54
54
|
|
55
|
+
void (*AILoader::get_reset_undo())()
|
56
|
+
{
|
57
|
+
return reinterpret_cast<void (*)()>(get_symbol("reset_undo"));
|
58
|
+
}
|
59
|
+
|
55
60
|
void (*AILoader::get_setup_board())(char **)
|
56
61
|
{
|
57
62
|
return reinterpret_cast<void (*)(char **)>(get_symbol("setup_board"));
|
@@ -54,6 +54,7 @@ void free_c_array(char **c_array, size_t size)
|
|
54
54
|
Move call_ai_move(AILoader &ai_loader, const std::vector<std::vector<std::string>> &board_pieces, Player player, int max_depth, int max_time)
|
55
55
|
{
|
56
56
|
auto init_zobrist = ai_loader.get_init_zobrist();
|
57
|
+
auto reset_undo = ai_loader.get_reset_undo();
|
57
58
|
auto setup_board = ai_loader.get_setup_board();
|
58
59
|
auto print_board = ai_loader.get_print_board();
|
59
60
|
auto set_time_parameters = ai_loader.get_set_time_parameters();
|
@@ -65,6 +66,7 @@ Move call_ai_move(AILoader &ai_loader, const std::vector<std::vector<std::string
|
|
65
66
|
|
66
67
|
char **c_board = vector_to_c_array(flatten_2d_vector_with_buffer(board_pieces));
|
67
68
|
|
69
|
+
reset_undo();
|
68
70
|
init_zobrist();
|
69
71
|
srand((unsigned)time(NULL));
|
70
72
|
|
data/ext/khetai/khetai.c
CHANGED
@@ -40,7 +40,7 @@ VALUE move(VALUE self, VALUE board_array, VALUE _player, VALUE _max_depth, VALUE
|
|
40
40
|
VALUE element = rb_ary_entry(board_array, i);
|
41
41
|
if (!RB_TYPE_P(element, T_STRING) || RSTRING_LEN(element) != 2)
|
42
42
|
{
|
43
|
-
rb_raise(rb_eArgError, "each element in
|
43
|
+
rb_raise(rb_eArgError, "each element in board_array must be 2 characters");
|
44
44
|
}
|
45
45
|
|
46
46
|
// check if element in board_array is a valid string
|
@@ -56,7 +56,7 @@ VALUE move(VALUE self, VALUE board_array, VALUE _player, VALUE _max_depth, VALUE
|
|
56
56
|
}
|
57
57
|
if (!is_valid)
|
58
58
|
{
|
59
|
-
rb_raise(rb_eArgError, "each element in
|
59
|
+
rb_raise(rb_eArgError, "each element in board_array must be a valid piece (example: 'p1') or empty ('--')");
|
60
60
|
}
|
61
61
|
}
|
62
62
|
|
data/ext/khetai/khetai_lib.c
CHANGED
@@ -11,6 +11,7 @@ Square board[120] = {0};
|
|
11
11
|
int pharaoh_loc[2] = {0};
|
12
12
|
enum Player whose_turn;
|
13
13
|
enum Player starter;
|
14
|
+
int initial_depth = 0;
|
14
15
|
|
15
16
|
Move undo_moves[MAX_DEPTH] = {0};
|
16
17
|
int undo_capture_indices[MAX_DEPTH] = {0};
|
@@ -29,6 +30,7 @@ Move alphabeta_root(int depth, enum Player player)
|
|
29
30
|
{
|
30
31
|
whose_turn = player;
|
31
32
|
starter = player;
|
33
|
+
initial_depth = depth;
|
32
34
|
int best_score = -MAX_SCORE;
|
33
35
|
Move best_move = (Move)0;
|
34
36
|
int alpha = -MAX_SCORE;
|
@@ -71,8 +73,10 @@ int alphabeta(int depth, enum Player player, int alpha, int beta)
|
|
71
73
|
int alpha_orig = alpha;
|
72
74
|
Move valid_moves[NUM_VALID_MOVES] = {0};
|
73
75
|
int vi = 0;
|
76
|
+
|
77
|
+
int table_depth = initial_depth - depth;
|
74
78
|
HashEntry *entry = search_table(hashes[move_num]);
|
75
|
-
if (entry->key == hashes[move_num] && entry->depth
|
79
|
+
if (entry->key == hashes[move_num] && entry->depth > table_depth)
|
76
80
|
{
|
77
81
|
if (entry->flag == EXACT)
|
78
82
|
return entry->score;
|
@@ -123,19 +127,19 @@ int alphabeta(int depth, enum Player player, int alpha, int beta)
|
|
123
127
|
else if (best_score >= beta)
|
124
128
|
flag = ALPHA;
|
125
129
|
|
126
|
-
|
130
|
+
|
131
|
+
insert_table(entry, hashes[move_num], table_depth, flag, best_score, best_move);
|
127
132
|
return best_score;
|
128
133
|
}
|
129
134
|
|
130
|
-
void insert_table(uint64_t key, int
|
135
|
+
void insert_table(HashEntry *entry, uint64_t key, int table_depth, int flag, int score, Move move)
|
131
136
|
{
|
132
|
-
HashEntry *entry = search_table(key);
|
133
137
|
if (entry->key != 0)
|
134
138
|
{
|
135
|
-
if (
|
139
|
+
if (table_depth > entry->depth)
|
136
140
|
{
|
137
141
|
entry->key = key;
|
138
|
-
entry->depth =
|
142
|
+
entry->depth = table_depth;
|
139
143
|
entry->flag = flag;
|
140
144
|
entry->score = score;
|
141
145
|
entry->move = move;
|
@@ -144,7 +148,7 @@ void insert_table(uint64_t key, int depth, int flag, int score, Move move)
|
|
144
148
|
else
|
145
149
|
{
|
146
150
|
entry->key = key;
|
147
|
-
entry->depth =
|
151
|
+
entry->depth = table_depth;
|
148
152
|
entry->flag = flag;
|
149
153
|
entry->score = score;
|
150
154
|
entry->move = move;
|
@@ -154,7 +158,7 @@ void insert_table(uint64_t key, int depth, int flag, int score, Move move)
|
|
154
158
|
int calculate_score()
|
155
159
|
{
|
156
160
|
int score = 0;
|
157
|
-
int anubis_score =
|
161
|
+
int anubis_score = 800;
|
158
162
|
int pyramid_score = 1000;
|
159
163
|
int pharaoh_score = 100000;
|
160
164
|
for (int i = 0; i < 120; i++)
|
@@ -467,6 +471,7 @@ void reset_undo()
|
|
467
471
|
|
468
472
|
void setup_board(char *init_board[120])
|
469
473
|
{
|
474
|
+
move_num = 0;
|
470
475
|
uint64_t hash = 0;
|
471
476
|
for (int i = 0; i < 120; i++)
|
472
477
|
{
|
data/ext/khetai/khetai_lib.h
CHANGED
@@ -38,6 +38,7 @@ enum Orientation
|
|
38
38
|
|
39
39
|
extern enum Player whose_turn;
|
40
40
|
extern enum Player starter;
|
41
|
+
extern int initial_depth;
|
41
42
|
|
42
43
|
// north, east, south, west, diagonals
|
43
44
|
static const int directions[8] = {-12, 1, 12, -1, (12 + 1), (12 - 1), (-12 + 1), (-12 - 1)};
|
@@ -223,6 +224,6 @@ typedef struct HashEntry
|
|
223
224
|
|
224
225
|
extern HashEntry table[TABLE_SIZE];
|
225
226
|
static inline HashEntry *search_table(uint64_t key) { return &table[key % TABLE_SIZE]; };
|
226
|
-
void insert_table(uint64_t key, int depth, int flag, int score, Move move);
|
227
|
+
void insert_table(HashEntry *entry, uint64_t key, int depth, int flag, int score, Move move);
|
227
228
|
|
228
229
|
#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.2.
|
4
|
+
version: 0.2.3
|
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-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|