From 58071b374c534bd6e1ec95772601cfa311aa15ca Mon Sep 17 00:00:00 2001 From: Luxferre Date: Fri, 23 Oct 2026 20:32:50 +0300 Subject: [PATCH] games: fix font glyphs, Snake edge-wrap, snappier Snake Font: add missing bitmap glyphs (/ # * + =) to both Snake and Tetris so control labels like '4/6 MOVE' and '# PAUSE' render correctly. Also hoist XSetForeground out of the per-pixel loop in draw_text (both games). Snake: remove the wall-collision death; the head now wraps through the opposite edge ((hx+COLS)%COLS, (hy+ROWS)%ROWS). Base speed raised from 70->100 px/sec (~128ms -> ~90ms per step) so it feels less laggy; the +1 px/sec per 5 food progressive difficulty is unchanged. --- overlay/rootfs/usr/bin/snake | Bin 13672 -> 13672 bytes overlay/rootfs/usr/bin/tetris | Bin 13668 -> 13668 bytes prebuilt/games/usr/bin/snake | Bin 13672 -> 13672 bytes prebuilt/games/usr/bin/tetris | Bin 13668 -> 13668 bytes src/games/snake.cpp | 23 ++++++++++++++--------- src/games/tetris.cpp | 10 +++++++--- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/overlay/rootfs/usr/bin/snake b/overlay/rootfs/usr/bin/snake index a77184b9e589e03cb2a892d794acbff208d473c3..aafc9723703694af96ab45cc9252acff98d5f4f1 100755 GIT binary patch delta 3693 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 Hks|&BTv~W~ diff --git a/overlay/rootfs/usr/bin/tetris b/overlay/rootfs/usr/bin/tetris index 76d4023b62875460624486b1e88cf4ba0072d25b..4828d866d77b1bb5ce204bf7dedf0dad1436332f 100755 GIT binary patch delta 1658 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 PgoupR<*2;(txobE)`xVn diff --git a/prebuilt/games/usr/bin/snake b/prebuilt/games/usr/bin/snake index a77184b9e589e03cb2a892d794acbff208d473c3..aafc9723703694af96ab45cc9252acff98d5f4f1 100755 GIT binary patch delta 3693 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 Hks|&BTv~W~ diff --git a/prebuilt/games/usr/bin/tetris b/prebuilt/games/usr/bin/tetris index 76d4023b62875460624486b1e88cf4ba0072d25b..4828d866d77b1bb5ce204bf7dedf0dad1436332f 100755 GIT binary patch delta 1658 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 PgoupR<*2;(txobE)`xVn diff --git a/src/games/snake.cpp b/src/games/snake.cpp index 0fe1128..77dabe6 100644 --- a/src/games/snake.cpp +++ b/src/games/snake.cpp @@ -70,6 +70,11 @@ static const Glyph GLYPHS[] = { {'7', {0b11111,0b00001,0b00010,0b00100,0b01000,0b01000,0b01000}}, {'8', {0b01110,0b10001,0b10001,0b01110,0b10001,0b10001,0b01110}}, {'9', {0b01110,0b10001,0b10001,0b01111,0b00001,0b00010,0b01100}}, + {'/', {0b00001,0b00010,0b00100,0b00100,0b01000,0b01000,0b10000}}, + {'#', {0b01010,0b01010,0b11111,0b01010,0b11111,0b01010,0b01010}}, + {'*', {0b00100,0b01010,0b11111,0b01010,0b00100,0b00000,0b00000}}, + {'+', {0b00000,0b00100,0b00100,0b11111,0b00100,0b00100,0b00000}}, + {'=', {0b00000,0b00000,0b11111,0b00000,0b11111,0b00000,0b00000}}, }; static const int NGLYPH = int(sizeof(GLYPHS) / sizeof(GLYPHS[0])); @@ -101,8 +106,8 @@ static int ndirx = 1, ndiry = 0; // buffered next direction static int foodx, foody; static int score = 0; static int best = 0; -static int speed = 130; // ms per step (derived from pps below) -static int pps = 70; // base speed px/sec; +1 px/sec per 5 food eaten +static int speed = 90; // ms per step (derived from pps below) +static int pps = 100; // base speed px/sec; +1 px/sec per 5 food eaten static unsigned long nextTick = 0; static bool running = true; static unsigned long now_ms() { @@ -160,7 +165,7 @@ static void reset_game() { dirx = 1; diry = 0; ndirx = 1; ndiry = 0; score = 0; - pps = 70; + pps = 100; update_speed(); place_food(); state = PLAYING; @@ -174,7 +179,9 @@ static void step() { } int hx = snake[snakelen - 1][0] + dirx; int hy = snake[snakelen - 1][1] + diry; - if (hx < 0 || hx >= COLS || hy < 0 || hy >= ROWS) { state = GAMEOVER; return; } + // wrap through the opposite edge instead of dying at the wall + hx = (hx + COLS) % COLS; + hy = (hy + ROWS) % ROWS; // self collision (ignore current tail cell since it will move, unless growing) for (int i = 0; i < snakelen - 1; i++) { if (snake[i][0] == hx && snake[i][1] == hy) { state = GAMEOVER; return; } @@ -204,16 +211,14 @@ static void step() { static void draw_text(int x, int y, int scale, unsigned long col, const char* s) { int cx = x; + XSetForeground(dpy, gc, col); for (const char* p = s; *p; p++) { const unsigned char* g = glyph(*p); for (int r = 0; r < 7; r++) { unsigned char row = g[r]; - for (int b = 0; b < 5; b++) { - if (row & (1 << (4 - b))) { - XSetForeground(dpy, gc, col); + for (int b = 0; b < 5; b++) + if (row & (1 << (4 - b))) XFillRectangle(dpy, back, gc, cx + b * scale, y + r * scale, scale, scale); - } - } } cx += 6 * scale; } diff --git a/src/games/tetris.cpp b/src/games/tetris.cpp index bc6be0c..b92358b 100644 --- a/src/games/tetris.cpp +++ b/src/games/tetris.cpp @@ -72,6 +72,11 @@ static const Glyph GLYPHS[] = { {'7', {0b11111,0b00001,0b00010,0b00100,0b01000,0b01000,0b01000}}, {'8', {0b01110,0b10001,0b10001,0b01110,0b10001,0b10001,0b01110}}, {'9', {0b01110,0b10001,0b10001,0b01111,0b00001,0b00010,0b01100}}, + {'/', {0b00001,0b00010,0b00100,0b00100,0b01000,0b01000,0b10000}}, + {'#', {0b01010,0b01010,0b11111,0b01010,0b11111,0b01010,0b01010}}, + {'*', {0b00100,0b01010,0b11111,0b01010,0b00100,0b00000,0b00000}}, + {'+', {0b00000,0b00100,0b00100,0b11111,0b00100,0b00100,0b00000}}, + {'=', {0b00000,0b00000,0b11111,0b00000,0b11111,0b00000,0b00000}}, }; static const int NGLYPH = int(sizeof(GLYPHS) / sizeof(GLYPHS[0])); static const unsigned char* glyph(char c) { @@ -245,15 +250,14 @@ static void reset_game() { static void draw_text(int x, int y, int scale, unsigned long col, const char* s) { int cx = x; + XSetForeground(dpy, gc, col); for (const char* p = s; *p; p++) { const unsigned char* g = glyph(*p); for (int r = 0; r < 7; r++) { unsigned char row = g[r]; for (int b = 0; b < 5; b++) - if (row & (1 << (4 - b))) { - XSetForeground(dpy, gc, col); + if (row & (1 << (4 - b))) XFillRectangle(dpy, back, gc, cx + b * scale, y + r * scale, scale, scale); - } } cx += 6 * scale; }