From: Laurent MAZET Date: Wed, 18 Dec 2024 17:04:36 +0000 (+0100) Subject: first functional game X-Git-Tag: v1.0~11 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=a91b82b7c60c31b8a3af08b5bd73fd45738a80e1;p=sokoban.git first functional game --- diff --git a/display.c b/display.c index af167ee..c8aa401 100644 --- 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); diff --git a/function.c b/function.c index f628035..c6ea897 100644 --- a/function.c +++ b/function.c @@ -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: */ diff --git a/function.h b/function.h index f0fa0ef..c760395 100644 --- a/function.h +++ b/function.h @@ -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: */ diff --git a/sokoban.c b/sokoban.c index eeb17f4..dcc7805 100644 --- 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: