From e754e3133fb5d197443a092b2accfbb126c0a7f9 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Mon, 27 May 2024 11:56:05 +0200 Subject: [PATCH] move letter on board --- board.c | 32 +++++++++++++++++++++++------- board.h | 15 +++++++++++++- scrabble.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 89 insertions(+), 15 deletions(-) diff --git a/board.c b/board.c index 7db5f00..7a843b4 100644 --- a/board.c +++ b/board.c @@ -44,7 +44,6 @@ int contains (char *list, char *str) return 0; } - typedef enum { white = 1, red, @@ -75,14 +74,33 @@ void set_color (color_t color) attrset (COLOR_PAIR(color)); } -char *initboard (void) +play_t *initplay (void) +{ + play_t *play = (play_t *) malloc (sizeof (play_t)); + play->tab = (char *) malloc (board->xsize * board->ysize); + memset (play->tab, ' ', board->xsize * board->ysize); + play->xsize = board->xsize; + play->ysize = board->ysize; + return play; +} + +int putletter (play_t *play, char letter, int x, int y) +{ + int ret = (play->tab[x + play->xsize * y] == ' '); + if (ret) { + play->tab[x + play->xsize * y] = letter; + } + return ret; +} + +void showletter (char letter, int x, int y) { - char *tab = (char *) malloc (board->xsize * board->ysize); - memset (tab, ' ', board->xsize * board->ysize); - return tab; + set_color (black); + mvaddch(y, x, letter); + set_color (white); } -void showboard (char *tab, int xoffset, int yoffset, int full) +void showboard (play_t *play, int xoffset, int yoffset, int full) { int x, y; for (x = -1; x <= board->xsize; x++) { @@ -109,7 +127,7 @@ void showboard (char *tab, int xoffset, int yoffset, int full) c = ACS_HLINE; set_color (black); } else { - c = tab[x + y * board->xsize]; + c = play->tab[x + y * board->xsize]; if (c == ' ') { if (contains (board->TW, pos)) { c = 'T'; diff --git a/board.h b/board.h index 935b411..546b59d 100644 --- a/board.h +++ b/board.h @@ -1,8 +1,21 @@ #ifndef __BOARD_H__ #define __BOARD_H__ +typedef struct { + int xsize; + int ysize; + char *tab; +} play_t; + char *initboard (void); -void showboard (char *tab, int xoffset, int yoffset, int full); + +play_t *initplay (); + +int putletter (play_t *play, char letter, int x, int y); + +void showletter (char letter, int x, int y); + +void showboard (play_t *play, int xoffset, int yoffset, int full); #endif /* __BOARD_H__ */ diff --git a/scrabble.c b/scrabble.c index 33a9d73..69c0cc2 100644 --- a/scrabble.c +++ b/scrabble.c @@ -10,6 +10,8 @@ #include "board.h" #include "debug.h" +#define KEY_ESC 0x1b + /* static variables */ char *progname = NULL; char *version = "0.1"; @@ -97,29 +99,70 @@ int main (int argc, char *argv[]) noecho(); cbreak(); nonl(); + curs_set (0); start_color (); help_window (50, 1, 30); - char *tab = initboard (); + play_t *play = initplay (); + + int mode = 0; + int xoffset = 3; + int yoffset = 3; + showboard (play, xoffset, yoffset, mode); - int c = 0; - int stop = 0, mode = 0; + int x = (play->xsize + 1)/ 2 - 1; + int y = (play->ysize + 1)/ 2 - 1; + + char letter = 'A' + (rand () % 26); + int stop = 0; while (!stop) { - showboard (tab, 3, 3, mode); + showletter (letter, x + xoffset, y + yoffset); - c = getch (); - switch (c) { + switch (getch ()) { + case KEY_ESC: + case ':': + break; + case KEY_UP: + case 'i': + if (y > 0) { + y--; + } + break; + case KEY_LEFT: + case 'j': + if (x > 0) { + x--; + } + break; + case KEY_DOWN: + case 'k': + if (y < play->ysize - 1) { + y++; + } + break; + case KEY_RIGHT: + case 'l': + if (x < play->xsize - 1) { + x++; + } + break; case 'q': stop = 1; break; case 't': - mode = mode^1; + mode ^= 1; + break; + case 's': + if (putletter (play, letter, x, y)) { + letter = 'A' + (rand () % 26); + } break; case ERR: default: } + showboard (play, xoffset, yoffset, mode); } endwin (); -- 2.30.2