first functional game
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 18 Dec 2024 17:04:36 +0000 (18:04 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 18 Dec 2024 17:04:36 +0000 (18:04 +0100)
display.c
function.c
function.h
sokoban.c

index af167ee945bd15d2cc76b2e7bbba97711858d30c..c8aa4013643d7e850de50e841a44e44e44020b05 100644 (file)
--- a/display.c
+++ b/display.c
@@ -127,7 +127,7 @@ void _set_symb_color (int symb)
         break;
     case '*': /* box docked */
     case '+': /* sokoban on dock */
-        set_color (cyan);
+        set_color (blue);
         break;
     case '@': /* sokoban */
         set_color (green);
@@ -146,8 +146,12 @@ void _element0 (board_t *board, int x, int y, int symb)
     case '*': /* box docked */
         element = ACS_DIAMOND;
         break;
+    case '@': /* sokoban */
+    case '+': /* sokoban on dock */
+        element = 'O';
+        break;
     case '.': /* empty dock */
-        element = 'X';
+        element = 'x';
         break;
     }
     _set_symb_color (symb);
@@ -162,12 +166,17 @@ void _element1 (board_t *board, int x, int y, int symb)
     switch (symb) {
     case '$':
     case '*':
-        element0 = ACS_LARROW;
-        element1 = ACS_RARROW;
+        element0 = '<';
+        element1 = '>';
+        break;
+    case '@':
+    case '+':
+        element0 = ACS_LTEE;
+        element1 = ACS_RTEE;
         break;
     case '.':
-        element0 = '-';
-        element1 = '-';
+        element0 = ACS_HLINE;
+        element1 = ACS_HLINE;
     }
     _set_symb_color (symb);
     mvaddch (board->yoffset + y, board->xoffset + 2 * x, element0);
@@ -189,11 +198,18 @@ void _element2 (board_t *board, int x, int y, int symb)
         element10 = ACS_LLCORNER;
         element11 = ACS_LRCORNER;
         break;
+    case '@':
+    case '+':
+        element00 = 'O';
+        element01 = ' ';
+        element10 = ACS_LTEE;
+        element11 = ACS_URCORNER;
+        break;
     case '.':
-        element00 = '.';
-        element01 = '.';
-        element10 = '.';
-        element11 = '.';
+        element00 = ACS_PLUS;
+        element01 = ACS_PLUS;
+        element10 = ACS_PLUS;
+        element11 = ACS_PLUS;
     }
     _set_symb_color (symb);
     mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x, element00);
@@ -221,13 +237,22 @@ void _element3 (board_t *board, int x, int y, int symb)
         element11 = ACS_HLINE;
         element12 = ACS_LRCORNER;
         break;
-    case '.':
-        element00 = ACS_VLINE;
+    case '@':
+    case '+':
+        element00 = 'O';
         element01 = ' ';
         element02 = ACS_VLINE;
-        element10 = ACS_LLCORNER;
-        element11 = ACS_HLINE;
-        element12 = ACS_LRCORNER;
+        element10 = ACS_LTEE;
+        element11 = ACS_URCORNER;
+        element12 = ACS_LLCORNER;
+        break;
+    case '.':
+        element00 = ACS_PLUS;
+        element01 = ACS_PLUS;
+        element02 = ACS_PLUS;
+        element10 = ACS_PLUS;
+        element11 = ACS_PLUS;
+        element12 = ACS_PLUS;
         break;
     }
     _set_symb_color (symb);
index f628035d1705978830f7315ef4dabd2045483ebc..c6ea897ad272512220678d037f71c8341ae8ca50 100644 (file)
@@ -242,7 +242,7 @@ int _moveelements (board_t *board, point *pt, int dir)
     }
 
     /* check 2 next positions in line */
-    int rc = 1;
+    int rc = 0;
     char next = getvalue (board, pt->x + move->x, pt->y + move->y);
     char next2 = getvalue (board, pt->x + 2 * move->x, pt->y + 2 * move->y);
     switch (next) {
@@ -251,12 +251,12 @@ int _moveelements (board_t *board, point *pt, int dir)
         switch (next2) {
         case ' ':
             *getcell (board, pt->x + 2 * move->x, pt->y + 2 * move->y) = '$';
+            rc = 1;
             break;
         case '.':
             *getcell (board, pt->x + 2 * move->x, pt->y + 2 * move->y) = '*';
+            rc = 1;
             break;
-        default:
-            rc = 0;
         }
     }
 
@@ -273,6 +273,7 @@ int _moveelements (board_t *board, point *pt, int dir)
     }
 
     /* move sokoban */
+    next = getvalue (board, pt->x + move->x, pt->y + move->y);
     switch (next) {
     case ' ':
         *getcell (board, pt->x + move->x, pt->y + move->y) = '@';
@@ -282,8 +283,6 @@ int _moveelements (board_t *board, point *pt, int dir)
         *getcell (board, pt->x + move->x, pt->y + move->y) = '+';
         rc = 1;
         break;
-    default:
-        rc = 0;
     }
 
     /* clean old sokoban position */
@@ -302,29 +301,34 @@ int _moveelements (board_t *board, point *pt, int dir)
     return rc;
 }
 
-void _findsokoban (board_t *board, point *pt)
+int _findelements (board_t *board, char *symbs, point *pt)
 {
-    int x, y;
-    for (x = 0; x < board->width; x++) {
-        for (y = 0; y < board->height; y++) {
-            switch (getvalue (board, x, y)) {
-            case '@':
-            case '+':
-                pt->x = x;
-                pt->y = y;
-                break;
+    char *str = NULL;
+    while (*symbs) {
+        str = strchr (board->tab, *symbs++);
+        if (str != NULL) {
+            int i = (int)(str - board->tab);
+            if (pt) {
+                pt->x = i % board->width;
+                pt->y = i / board->width;
             }
+            break;
         }
     }
+    return (str != NULL);
 }
 
 void movesokoban (board_t *board, int dir)
 {
     point sokoban = {-1, -1};
-    _findsokoban (board, &sokoban);
-    if (sokoban.x != -1) {
+    if (_findelements (board, "@+", &sokoban)) {
         _moveelements (board, &sokoban, dir);
     }
 }
 
+int endofgame (board_t *board)
+{
+    return (!_findelements (board, ".+", NULL));
+}
+
 /* vim: set ts=4 sw=4 et: */
index f0fa0ef3d87dca545c8961bf1c9ea46e2bdadf7d..c7603957bc046c45f64b8465d9d1803892288564 100644 (file)
@@ -39,6 +39,8 @@ char getvalue (board_t *board, int x, int y);
 
 void movesokoban (board_t *board, int dir);
 
+int endofgame (board_t *board);
+
 #endif /* __FUNCTION_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index eeb17f4f12ff51bff91659564b26e969b90f8daa..dcc7805028c9bab5a8de26ed48e4a5759bd4b33a 100644 (file)
--- a/sokoban.c
+++ b/sokoban.c
@@ -179,6 +179,7 @@ int main (int argc, char *argv[])
             dir = -1;
         }
         boardwindow (board);
+        mode = endofgame (board);
 
         int ch = getch ();
         switch (ch) {
@@ -187,7 +188,7 @@ int main (int argc, char *argv[])
         case '\r':
             if (mode == 1) {
                 // load next level
-                mode = 0;
+                stop = 1;
             }
             break;
         case KEY_UP: