aboutsummaryrefslogtreecommitdiff
path: root/include/actions.h
diff options
context:
space:
mode:
authortslil clingman <tslil@posteo.de>2023-01-15 21:31:00 +0100
committertslil <tslil@posteo.de>2026-08-28 19:37:41 +0100
commit0223a9bec5535fced1a7698b55fd42155d9b0446 (patch)
treee7a980454e65d88b56194eed733cabec29ef51b5 /include/actions.h
parentee216c008a188a9436fedb85c70ee5d1719733b1 (diff)
switch to explicit game state & important bug fix & clang format
Previously the code base assumed that there was a single, global game state which was the implicit target of all actions taken. Looking ahead at architectural improvements, this has now been (almost entirely) made explicit and functions take tak_state_p where necessary (and also where unnecessary). Two important fixes to actions.c were made: - Previously when generating the possible stack moves, stack height overflows (> 15) were not taken into account and this resulted in the tree search corrupting the board state. Now action search does not list all legal actions, rather the subset of these encodeable by the implementation. - The check for crushing on a stack move was incorrect (too strict), and this resulted in many legitimate moves being igonored. Finally, in other changes, weights have also been improved by training all games instead of some subset for chosen players, and clang-format was run on the codebase.
Diffstat (limited to 'include/actions.h')
-rw-r--r--include/actions.h29
1 files changed, 14 insertions, 15 deletions
diff --git a/include/actions.h b/include/actions.h
index 8df9392..1550cce 100644
--- a/include/actions.h
+++ b/include/actions.h
@@ -18,8 +18,8 @@
#ifndef ACTIONS_H
#define ACTIONS_H
-#include <stdlib.h>
#include <stdint.h>
+#include <stdlib.h>
#include <tak.h>
@@ -33,16 +33,15 @@ typedef uint32_t action_t;
#define A_DATA1_SHIFT 24
#define A_DATA0_SHIFT 16
-#define A_LOC_SHIFT 8
+#define A_LOC_SHIFT 8
-#define A_GET_DATA1(a) (enum A_TYPE)((a)>>A_DATA1_SHIFT)
-#define A_GET_DATA0(a) (int8_t)(((a)>>A_DATA0_SHIFT) & 0xFF)
-#define A_GET_LOC(a) (uint8_t)(((a)>>A_LOC_SHIFT) & 0xFF)
-#define A_GET_TYPE(a) (uint8_t)((a) & 0xFF)
-#define A_BUILD(type,loc,data0,data1) ((type) \
- | (loc) << A_LOC_SHIFT \
- | (data0) << A_DATA0_SHIFT \
- | (data1) << A_DATA1_SHIFT)
+#define A_GET_DATA1(a) (enum A_TYPE)((a) >> A_DATA1_SHIFT)
+#define A_GET_DATA0(a) (int8_t)(((a) >> A_DATA0_SHIFT) & 0xFF)
+#define A_GET_LOC(a) (uint8_t)(((a) >> A_LOC_SHIFT) & 0xFF)
+#define A_GET_TYPE(a) (uint8_t)((a)&0xFF)
+#define A_BUILD(type, loc, data0, data1) \
+ ((type) | (loc) << A_LOC_SHIFT | (data0) << A_DATA0_SHIFT | \
+ (data1) << A_DATA1_SHIFT)
typedef struct action_node_s {
struct action_node_s *next;
@@ -64,15 +63,15 @@ extern int8_t move_deltas[4];
// Methods
// ===================================================================
-void action_list_init(void);
+void action_list_init(const uint8_t board_size);
void action_list_free(action_list_t *list);
-action_list_t *action_list_generate(void);
+action_list_t *action_list_generate(tak_state_p state);
int action_move_to_front(const action_t action, action_list_t *list);
-void action_take(const action_t action);
-void action_undo(const action_t action);
+void action_take(tak_state_p state, const action_t action);
+void action_undo(tak_state_p state, const action_t action);
-void action_to_ptn(const action_t action, char* out_ptn);
+void action_to_ptn(const action_t action, char *out_ptn);
#endif