move letter on board
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 27 May 2024 09:56:05 +0000 (11:56 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 27 May 2024 09:56:05 +0000 (11:56 +0200)
board.c
board.h
scrabble.c

diff --git a/board.c b/board.c
index 7db5f0045371e6de902370934d88e3effa586613..7a843b4a7393275c64e317fd9b0f08cfd0c3b055 100644 (file)
--- 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 935b411057c28f9132b8338e1bc695eadc609c53..546b59d4ecd8f2e0ce49c48b229c7bded2ecfea9 100644 (file)
--- 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__ */
 
index 33a9d73e8e1fd9ecf196b245d01f9c81b395df77..69c0cc2e912fd063aa3bb8514a1b15a66b8e502f 100644 (file)
@@ -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 ();