This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
roox gerrit-no-reply at lists.osmocom.orgroox has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/19486 ) Change subject: Wrote my not yet feature complete implementation of Snake. ...................................................................... Wrote my not yet feature complete implementation of Snake. Change-Id: Ib146f749b60e5851ba0723546697e09a6a05ae85 --- M src/target/firmware/apps/snake_game/main.c 1 file changed, 267 insertions(+), 37 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/86/19486/1 diff --git a/src/target/firmware/apps/snake_game/main.c b/src/target/firmware/apps/snake_game/main.c index 63dba3f..a4e8296 100644 --- a/src/target/firmware/apps/snake_game/main.c +++ b/src/target/firmware/apps/snake_game/main.c @@ -25,6 +25,10 @@ #include <string.h> #include <debug.h> +#define DEBUG 1 +#define KNRM "\x1B[0m" +#define UNDERLINE "\x1B[4m" + #include <memory.h> #include <delay.h> #include <rffe.h> @@ -44,6 +48,227 @@ #include <fb/framebuffer.h> #include <battery/battery.h> +#define BLANK 0 +#define HEAD 1 +#define TAIL 2 +#define HEAD_FOOD 3 +#define FOOD 9 +#define SBODY 20 +/* The numbers above 20 are the distance to the head. + * 21 is direly behind the head. +*/ +#define STDLEN 3 +#define HEIGHT 7 +#define WIDTH 16 +struct position { + int x; + int y; +} pos; + +uint8_t field[WIDTH][HEIGHT]; +uint16_t score = 0, lenght = 0; +enum errors { ALLRIGHT, SNAKE_COL, } err; + +void printField(); +void setItem(int, int, int); +void movepos(char); +void increaseBodyAge(); +void setFood() { + int x, y, c; + /* for (c = 0; c < 10;c++) { */ + /* x = rand() % (WIDTH -1); */ + /* y = rand() % (HEIGHT -1); */ + /* if (field[x][y] == BLANK) { */ + /* field[x][y] = FOOD; */ + /* return; */ + /* } */ + /* } */ + for (x = 0; x < WIDTH; x++) { + for (y = 0; y < HEIGHT; y++) { + if (field[x][y] == BLANK) { + field[x][y] = FOOD; + if (DEBUG > 0) printf("Set without rand (%d|%d) %d\n", x, y, c); + return; + } + } + } +} + +static void print_snake_str(char *text, int16_t x, int16_t y) +{ + x = 6 * x; + y = 8 * (y+1) -3; + printf("Put string %s to (%d|%d)\n", text, x, y); + fb_gotoxy(x, y); + fb_putstr(text, framebuffer->width); +} +void movepos(char dim) { + setItem(pos.x, pos.y, SBODY); + switch (dim) { + case 'Y': pos.y++;break; + case 'y': pos.y--;break; + case 'X': pos.x++;break; + case 'x': pos.x--;break; + } + switch (dim) { + case 'Y': case 'y': + if (pos.y == -1) pos.y = HEIGHT -1; + else if (pos.y == HEIGHT) pos.y = 0; + increaseBodyAge(); + break; + case 'X': case 'x': + if (pos.x == -1) pos.x = WIDTH -1; + else if (pos.x == WIDTH) pos.x = 0; + increaseBodyAge(); + break; + } + setItem(pos.x, pos.y, HEAD); + printField(); +} + +void increaseBodyAge() { + int y, x; + lenght = SBODY + STDLEN + score; + for (x = 0; x < WIDTH; x++) { + for (y = 0; y < HEIGHT; y++) { + if (field[x][y] >= lenght) field[x][y] = BLANK; + else if (field[x][y] >= SBODY) field[x][y]++; + } + } +} + +void setItem(int x, int y, int item) { + if (item == HEAD) { + switch (field[x][y]) { + case FOOD: score++; setFood(); item = HEAD_FOOD; break; + case BLANK: break; + default: err = SNAKE_COL; + } + } + field[x][y] = item; +} + +void resetField() { + /* system("clear"); */ + printf("\033[H\033[2J"); +} + +void printField() { + fb_clear(); + int x, y; + for (y = 0; y < HEIGHT; y++) { + for (x = 0; x < WIDTH; x++) { + switch (field[x][y]) { + case BLANK:break; + case HEAD: print_snake_str("O", x, y);break; + case HEAD_FOOD: print_snake_str("P", x, y);break; + case FOOD: print_snake_str("#", x, y);break; + default: + if (field[x][y] == lenght) print_snake_str(";", x, y); + else print_snake_str("o", x, y); + } + } + + } + printf("Score: %d\n", score); + fb_gotoxy(0, framebuffer->height+-9); + fb_lineto(framebuffer->width-1, framebuffer->cursor_y); + fb_gotoxy(0, framebuffer->height-1); + char text[16]; + switch (err) { + case SNAKE_COL: fb_putstr("The snake ate itself!!!", framebuffer->width); + err = ALLRIGHT; break; + default: sprintf(text, "Score: %u", score); + fb_putstr(text, framebuffer->width); + framebuffer->cursor_x = 45; + fb_putstr("OsmocomBB", framebuffer->width); + } + fb_flush(); + + if (DEBUG > 0) { + printf("Pos X: %d, Y: %d\n", pos.x, pos.y); + printf("\n\n"); + for(y = -1; y < HEIGHT; y++) { + for(x = -1; x < WIDTH; x++) { + if (y == -1 || x == -1) { + if (x == -1) printf(" %2d: ", y); + else if (y == -1) printf(UNDERLINE " %2d" KNRM, x); + } else printf(" %2d",field[x][y]); + } + puts("\n"); + } + } +} +int cursor = 0; +#define NEIGH_LINES ((framebuffer->height +8) / 8) +static void print_display(char *text, int *y, int c) +{ + /* skip lines, given by cursor */ + (*y)++; + if (c >= (*y)) { + printf("Line %d: Return c >= y\n", *y); + return; + } + /* skip, if end of display area is reached */ + if ((*y) - c > NEIGH_LINES) { + printf("Line %d: Return\n", *y); + return; + } + + fb_gotoxy(0, -3 + (((*y) - c - 1) << 3)); + fb_putstr(text, framebuffer->width); +} + +void fb_clear_fancy(uint8_t delay) { + int16_t x, y; + fb_setfg(FB_COLOR_BLACK); + fb_setbg(FB_COLOR_WHITE); + for (x = 0; x < framebuffer->width; x++) { + for (y = 0; y < framebuffer->height; y++) { + fb_set_p(x, y); + } + fb_flush(); + delay_ms(delay); + } + fb_setfg(FB_COLOR_WHITE); + fb_setbg(FB_COLOR_BLACK); + /* for (x = 0; x < framebuffer->width; x++) { */ + for (; x >= 0; x--) { + for (y = 0; y < framebuffer->height; y++) { + fb_set_p(x, y); + } + fb_flush(); + delay_ms(delay); + } + fb_setfg(FB_COLOR_BLACK); + fb_setbg(FB_COLOR_WHITE); +} + +void intro() { + fb_setfg(FB_COLOR_BLACK); + fb_setbg(FB_COLOR_WHITE); + fb_setfont(FB_FONT_HELVB14); + + fb_gotoxy(framebuffer->width/2 - 7 * 3, 15); + fb_putstr("Snake",framebuffer->width-4); + + fb_gotoxy(14, framebuffer->height-5); + fb_setfont(FB_FONT_HELVR08); + fb_putstr("Version: " GIT_SHORTHASH, framebuffer->width-4); + fb_gotoxy(0, 0); + fb_boxto(framebuffer->width - 1, 1); + fb_boxto(framebuffer->width - 2, framebuffer->height-1); + fb_boxto(0, framebuffer->height-2); + fb_boxto(1, 1); + + printf("(%u, %u)\n", framebuffer->width, framebuffer->height); + fb_gotoxy(2, 2); + fb_lineto(framebuffer->width-3, framebuffer->height-3); + fb_gotoxy(2, framebuffer->height-3); + fb_lineto(framebuffer->width-3, 2); + fb_flush(); +} + /* Main Program */ const char *hr = "======================================================================\n"; @@ -91,41 +316,36 @@ puts(hr); fb_clear(); - bl_level(255); + bl_level(255); + /* srand(23); // need time or other changing value */ + + intro(); + delay_ms(5000); + fb_clear_fancy(20); + fb_setfg(FB_COLOR_BLACK); fb_setbg(FB_COLOR_WHITE); - fb_setfont(FB_FONT_HELVB14); - - fb_gotoxy(framebuffer->width/2 - 7 * 3, 15); - fb_putstr("Snake",framebuffer->width-4); - - fb_gotoxy(14, framebuffer->height-5); - fb_setfont(FB_FONT_HELVR08); - fb_putstr("Version: " GIT_SHORTHASH, framebuffer->width-4); - fb_gotoxy(0, 0); - fb_boxto(framebuffer->width - 1, 1); - fb_boxto(framebuffer->width - 2, framebuffer->height-1); - fb_boxto(0, framebuffer->height-2); - fb_boxto(1, 1); - /* set_pixel_r(9,9); */ - /* set_pixel_r(10,10); */ - /* set_pixel_r(10,11); */ - /* set_pixel_r(10,12); */ - /* set_pixel_r(12,10); */ - /* set_pixel_r(0,0); */ - printf("(%u, %u)\n", framebuffer->width, framebuffer->height); - fb_gotoxy(2, 2); - fb_lineto(framebuffer->width-3, framebuffer->height-3); - fb_gotoxy(2, framebuffer->height-3); - fb_lineto(framebuffer->width-3, 2); - - fb_setfg(FB_COLOR_WHITE); - fb_setbg(FB_COLOR_BLACK); - fb_lineto(2, 20); - + fb_setfont(FB_FONT_HELVR08); + int y = 0, i; + /* for (i = 1; i <= 7; i++) { */ + /* printf("%d\n", i); */ + /* print_display("OOOOOOOOOOOOOOOO", &y, cursor - 1); */ + /* } */ + /* print_snake_str("U",0, 0); */ + /* print_snake_str("U",0, 2); */ + /* print_snake_str("U",2, 0); */ + print_snake_str("U",2, 0); + print_snake_str("U",2, 5); + print_snake_str("U",6, 0); fb_flush(); + pos.x = framebuffer->width/(6 * 2); + pos.y = framebuffer->height/(8 * 2); + setItem(pos.x, pos.y, HEAD); + setFood(); + printf("Put string to (%d|%d)\n", pos.x, pos.y); + printField(); sercomm_register_rx_cb(SC_DLCI_CONSOLE, console_rx_cb); @@ -150,13 +370,13 @@ switch (code) { case KEY_0: bl_level(0);break; case KEY_1: bl_level(10);break; - case KEY_2: bl_level(20);break; + case KEY_2: movepos('y');break; case KEY_3: bl_level(30);break; - case KEY_4: bl_level(40);break; + case KEY_4: movepos('x');break; case KEY_5: bl_level(50);break; - case KEY_6: bl_level(100);break; + case KEY_6: movepos('X');break; case KEY_7: bl_level(150);break; - case KEY_8: bl_level(200);break; + case KEY_8: movepos('Y');break; case KEY_9: bl_level(255);break; // used to be display_puts... break; @@ -166,9 +386,19 @@ case KEY_HASH: // used to be display puts... break; - case KEY_LEFT_SB: bl_mode_pwl(1);break; - case KEY_RIGHT_SB: bl_mode_pwl(0);break; - case KEY_POWER: twl3025_power_off_now();break; + case KEY_LEFT_SB: + bl_mode_pwl(1); + break; + case KEY_RIGHT_SB: + bl_mode_pwl(0); + break; + case KEY_POWER: + twl3025_power_off_now(); + break; + case KEY_RIGHT: movepos('X'); break; + case KEY_LEFT: movepos('x'); break; + case KEY_UP: movepos('y'); break; + case KEY_DOWN: movepos('Y'); break; default: break; } -- To view, visit https://gerrit.osmocom.org/c/osmocom-bb/+/19486 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmocom-bb Gerrit-Branch: master Gerrit-Change-Id: Ib146f749b60e5851ba0723546697e09a6a05ae85 Gerrit-Change-Number: 19486 Gerrit-PatchSet: 1 Gerrit-Owner: roox <mardnh at gmx.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200801/2d1c91ff/attachment.htm>