diff options
author | Frederick Yin <fkfd@fkfd.me> | 2022-06-01 13:23:02 +0800 |
---|---|---|
committer | Frederick Yin <fkfd@fkfd.me> | 2022-06-01 13:23:02 +0800 |
commit | 81666e3ae565ccd6de49877a5436e1b3154c6f32 (patch) | |
tree | 820548c1d1542753a812a5cfe9f2357eb54cee6b /pieces.c | |
parent | 90bff8fb828c99d8b1ef00fe783dd50887c81f70 (diff) |
Move piece-map operations to piece.c
Diffstat (limited to 'pieces.c')
-rw-r--r-- | pieces.c | 39 |
1 files changed, 38 insertions, 1 deletions
@@ -1,5 +1,5 @@ #include <stdlib.h> -#include <stdio.h> +#include <stdbool.h> #include <string.h> #include "pieces.h" @@ -73,3 +73,40 @@ struct piece* randpiece() { return pc; } +void refillpieces(struct piece** hand, int nhand) { + // randomly select `nhand` pieces to `hand` + for (int i = 0; i < nhand; i++) { + hand[i] = randpiece(); + } +} + +bool placeable(char** map, struct piece* pc, int row, int col, int mapH, int mapW) { + // boundary check + if (row < 0 || row + (pc->h) > mapH || col < 0 || col + (pc->w) > mapW) + return false; + + // check if blocks to be taken by `pc` are vacant + for (int r = 0; r < pc->h; r++) { + for (int c = 0; c < pc->w; c++) { + if (map[row + r][col + c] == '+' && pc->blocks[r * pc->w + c] == '+') + return false; + } + } + + return true; +} + +void place(char** map, struct piece* pc, int row, int col) { + for (int r = 0; r < pc->h; r++) { + for (int c = 0; c < pc->w; c++) { + if (pc->blocks[r * (pc->w) + c] == '+') + map[row + r][col + c] = '+'; + } + } +} + +void freepiece(struct piece* pc) { + free(pc->blocks); + free(pc); +} + |