khetai 0.2.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|