hex

hex.git
git clone git://git.lenczewski.org/hex.git
Log | Files | Refs

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 }