summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2022-06-01 10:00:50 +0800
committerFrederick Yin <fkfd@fkfd.me>2022-06-01 10:00:50 +0800
commitd94bf01fdd4b8e9f307463ea04454c8db4824859 (patch)
treef5762b4084e00a89b27cd2a1a50a3f5a28d89084
parent5ae9641cbd6def9126bc039bf29384f8fed98de6 (diff)
Select and place piece
-rw-r--r--sirtet.c89
-rw-r--r--ui.c31
-rw-r--r--ui.h3
3 files changed, 103 insertions, 20 deletions
diff --git a/sirtet.c b/sirtet.c
index 204dae7..4347fc3 100644
--- a/sirtet.c
+++ b/sirtet.c
@@ -111,23 +111,94 @@ void sirtet() {
// initialize ncurses
setlocale(LC_ALL, "");
initscr();
+ clear();
noecho();
+ cbreak();
keypad(stdscr, true);
curs_set(0); // set cursor invisible
- printrect(0, 0, H, W);
+ start_color();
+ init_pair(1, COLOR_GREEN, COLOR_BLACK);
+ init_pair(2, COLOR_RED, COLOR_BLACK);
// begin game loop
while (!over) {
+ clear();
+ printrect(0, 0, H, W);
printmap(map, 1, 1, H, W);
- printpieces(hand, H + 2, 0, P);
- // await user input
+
+ // select piece
+ bool piece_confirmed = false;
int pc_idx;
- int row;
- int col;
- refresh();
- while(1);
- place(map, hand[pc_idx], row, col);
- freepiece(hand[pc_idx]);
+ for (int i = 0; i < P; i++) {
+ if (hand[i] != NULL) {
+ pc_idx = i;
+ break;
+ }
+ }
+
+ while (!piece_confirmed) {
+ printpieces(hand, H + 2, 0, P, pc_idx);
+ refresh();
+ // await user input
+ int ch = getch();
+ switch (ch) {
+ case 10: // enter
+ piece_confirmed = true;
+ break;
+ case KEY_LEFT:
+ for (int i = 0; i < P; i++) {
+ // find previous non-null piece
+ pc_idx = (pc_idx + P - 1) % P;
+ if (hand[pc_idx] != NULL)
+ break;
+ }
+ break;
+ case KEY_RIGHT:
+ for (int i = 0; i < P; i++) {
+ // find next non-null piece
+ pc_idx = (pc_idx + 1) % P;
+ if (hand[pc_idx] != NULL)
+ break;
+ }
+ break;
+ }
+ }
+
+ struct piece* pc = hand[pc_idx];
+
+ // select position
+ bool pos_confirmed = false;
+ int row = 0;
+ int col = 0;
+ while (!pos_confirmed) {
+ printmap(map, 1, 1, H, W);
+
+ bool pos_placeable = placeable(map, pc, row, col, H, W);
+ printpiece(pc, row + 1, col * 2 + 1, (pos_placeable ? 1 : 2));
+
+ int ch = getch();
+ switch (ch) {
+ case 10: // enter
+ if (pos_placeable)
+ pos_confirmed = true;
+ break;
+ case KEY_LEFT:
+ if (col > 0) col--;
+ break;
+ case KEY_RIGHT:
+ if (col + pc->w < W) col++;
+ break;
+ case KEY_UP:
+ if (row > 0) row--;
+ break;
+ case KEY_DOWN:
+ if (row + pc->h < H) row++;
+ break;
+ }
+ }
+
+ place(map, pc, row, col);
+ freepiece(pc);
hand[pc_idx] = NULL;
// clear full rows and columns
diff --git a/ui.c b/ui.c
index b6d38be..8693119 100644
--- a/ui.c
+++ b/ui.c
@@ -29,31 +29,42 @@ void printmap(char** map, int y, int x, int mapH, int mapW) {
for (int r = 0; r < mapH; r++) {
for (int c = 0; c < mapW; c++) {
if (map[r][c] == '+') {
- mvaddch(y + r + 1, x + 2 * c + 1, (' ' | A_REVERSE));
+ mvaddch(y + r, x + 2 * c, (' ' | A_REVERSE));
addch(' ' | A_REVERSE);
+ } else {
+ mvaddch(y + r, x + 2 * c, (' '));
+ addch(' ');
}
}
}
refresh();
}
-void printpieces(struct piece** hand, int y, int x, int nhand) {
+void printpiece(struct piece* pc, int y, int x, int color_pair) {
+ attron(COLOR_PAIR(color_pair));
+ for (int r = 0; r < pc->h; r++) {
+ for (int c = 0; c < pc->w; c++) {
+ if (pc->blocks[r * pc->w + c] == '+') {
+ mvaddch(y + r, x + 2 * c, (' ' | A_REVERSE));
+ addch(' ' | A_REVERSE);
+ }
+ }
+ }
+ attroff(COLOR_PAIR(color_pair));
+}
+
+void printpieces(struct piece** hand, int y, int x, int nhand, int highlight) {
for (int i = 0; i < nhand; i++) {
if (hand[i] == NULL)
continue;
struct piece* pc = hand[i];
move(y, x);
+
printw("%d", i);
printrect(y + 1, x, pc->h + 2, pc->w + 2);
- for (int r = 0; r < pc->h; r++) {
- for (int c = 0; c < pc->w; c++) {
- if (pc->blocks[r * pc->w + c] == '+') {
- mvaddch(y + r + 3, x + 2 * c + 3, (' '| A_REVERSE));
- addch(' ' | A_REVERSE);
- }
- }
- }
+ printpiece(pc, y + 3, x + 3, (i == highlight ? 1 : 0));
+
x += 2 * pc->w + 8;
}
refresh();
diff --git a/ui.h b/ui.h
index 37df329..09bed98 100644
--- a/ui.h
+++ b/ui.h
@@ -2,6 +2,7 @@
#define UI_H
void printrect(int y, int x, int h, int w);
void printmap(char** map, int y, int x, int mapH, int mapW);
-void printpieces(struct piece** hand, int y, int x, int nhand);
+void printpiece(struct piece* pc, int y, int x, int color_pair);
+void printpieces(struct piece** hand, int y, int x, int nhand, int highlight);
#endif