Change in osmocom-bb[master]: Wrote my not yet feature complete implementation of Snake.

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.org
Sat Aug 1 12:30:03 UTC 2020


roox 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>


More information about the gerrit-log mailing list