random.c (1404B)
1 #include "hexes.h" 2 3 bool 4 agent_random_init(struct agent_random *self, struct board const *board) 5 { 6 assert(self); 7 assert(board); 8 9 self->len = board->size * board->size; 10 11 if (!(self->moves = malloc(self->len * sizeof *self->moves))) return false; 12 13 for (u32 j = 0; j < board->size; j++) { 14 for (u32 i = 0; i < board->size; i++) { 15 size_t idx = j * board->size + i; 16 17 self->moves[idx].x = i; 18 self->moves[idx].y = j; 19 } 20 } 21 22 shuffle(self->moves, sizeof *self->moves, self->len); 23 24 return true; 25 } 26 27 void 28 agent_random_free(struct agent_random *self) 29 { 30 assert(self); 31 32 free(self->moves); 33 } 34 35 void 36 agent_random_play(struct agent_random *self, enum hex_player player, u32 x, u32 y) 37 { 38 assert(self); 39 40 (void) player; 41 42 for (size_t i = 0; i < self->len; i++) { 43 if (self->moves[i].x == x && self->moves[i].y == y) { 44 swap(&self->moves[i], &self->moves[--self->len], sizeof *self->moves); 45 break; 46 } 47 } 48 } 49 50 void 51 agent_random_swap(struct agent_random *self) 52 { 53 assert(self); 54 55 /* NOTE: this would affect nothing, as we remove moves made by both players 56 */ 57 (void) self; 58 } 59 60 bool 61 agent_random_next(struct agent_random *self, struct timespec timeout, 62 u32 *restrict out_x, u32 *restrict out_y) 63 { 64 assert(self); 65 assert(out_x); 66 assert(out_y); 67 68 (void) timeout; 69 70 if (!self->len) return false; 71 72 size_t idx = --self->len; 73 *out_x = self->moves[idx].x; 74 *out_y = self->moves[idx].y; 75 76 return true; 77 }