X-Git-Url: http://git.draconx.ca/gitweb/rrace.git/blobdiff_plain/2529a9651d160ab3a17118d778f5e5584d040765..b39d19918b63b80d1f3b068d158fe43415b9d1b6:/src/game.h diff --git a/src/game.h b/src/game.h index f4473a7..301dfac 100644 --- a/src/game.h +++ b/src/game.h @@ -42,11 +42,12 @@ struct board { * corresponds to position (0,0), bit 4 is position (4,0) and bit 25 * is position (4, 4). * - * game[0] - the board mask, all bits set except one indicating the - * absense of a tile at this position. - * game[1] - least significant bit of the tile's colour. - * game[2] - tile colour. - * game[3] - most significant bit of the tile's colour. + * game[0] - least significant bit of the tile's colour. + * game[1] - tile colour. + * game[2] - most significant bit of the tile's colour. + * game[3] - No internal meaning. The game_reset function will clear + * the bit at the empty position and set all others, and + * game_do_move will adjust it. */ uint_least32_t game[4]; @@ -110,6 +111,46 @@ static inline uint_fast32_t board_mask_v(int x, int y0, int y1) return (col << 5*y1) & (col >> 5*(4-y0)); } +/* + * Return the board bitmap setting locations on or above row y. + */ +static inline uint_fast32_t board_above(int y) +{ + uint_fast32_t val = board_row(y); + + return val | (val-1); +} + +/* + * Return the board bitmap setting locations on or below row y. + */ +static inline uint_fast32_t board_below(int y) +{ + uint_fast32_t val = board_row(y); + + return val | (~val + 1); +} + +/* + * Return the board bitmap setting locations on or left of column x. + */ +static inline uint_fast32_t board_left(int x) +{ + uint_fast32_t val = board_column(x); + + return val | (val - 0x108421); +} + +/* + * Return the board bitmap setting locations on or right of column x. + */ +static inline uint_fast32_t board_right(int x) +{ + uint_fast32_t val = board_column(x); + + return ~val + 0x108421; +} + /* * Move the bits in the game bitmaps according to a move at position (x, y), * and update the location of the empty position which, if the move was valid @@ -119,6 +160,11 @@ static inline uint_fast32_t board_mask_v(int x, int y0, int y1) */ int game_do_move(struct board *board, int x, int y); +/* + * Returns 1 if the game is in a winning position, or 0 otherwise. + */ +int game_check_goal(struct board *board); + /* * Initialize the game RNG such that the next call to game_reset will produce a * new board that is entirely dependent on the given seed value. @@ -130,4 +176,9 @@ void game_reseed(unsigned long long seed); */ void game_reset(struct board *board); +/* + * Disable new moves and clear all tile bits other than the 9 goal tiles. + */ +void game_finish(struct board *board); + #endif