From 39600b2bf8beecb9429b05748bbb293da1c90f08 Mon Sep 17 00:00:00 2001 From: Tim Wundenberg Date: Fri, 27 Feb 2026 22:13:15 +0100 Subject: [PATCH] add ui score for implement restart --- src/game.zig | 6 ++-- src/main.zig | 91 +++++++++++++++++++++++++++------------------------- 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/src/game.zig b/src/game.zig index 77c1a59..71ebc38 100644 --- a/src/game.zig +++ b/src/game.zig @@ -25,6 +25,8 @@ pub const State = enum { won, }; +const startLen = 3; + pub const Game = struct { playFieldSize: Vec2, direction: Direction, @@ -37,14 +39,14 @@ pub const Game = struct { grow: bool, pub fn score(self: Game) usize { - return self.body.items.len; + return self.body.items.len - startLen; } pub fn create(allocator: std.mem.Allocator) !Game { var body = try std.ArrayList(Vec2).initCapacity(allocator, 400); const startPos: u8 = 10; - for (0..3) |i| { + for (0..startLen) |i| { const index = std.math.cast(i32, i) orelse unreachable; try body.append(allocator, Vec2{ startPos - index, 10 }); } diff --git a/src/main.zig b/src/main.zig index af6f09b..fcf9900 100644 --- a/src/main.zig +++ b/src/main.zig @@ -24,65 +24,51 @@ pub fn main() !void { var timer: f32 = 0; var isFast = false; - const fontSize = 50; - const gameOverText = "Game Over!"; - const gameOverTextWidth = rl.measureText(gameOverText, fontSize); - const youWinText = "You Win!"; - const youWinTextWidth = rl.measureText(youWinText, fontSize); - while (!rl.windowShouldClose()) { const deltaTime = rl.getFrameTime(); timer += deltaTime; - if (rl.isKeyPressed(.up)) { - game.setDirection(g.Direction.up); - } - if (rl.isKeyPressed(.down)) { - game.setDirection(g.Direction.down); - } - if (rl.isKeyPressed(.right)) { - game.setDirection(g.Direction.right); - } - if (rl.isKeyPressed(.left)) { - game.setDirection(g.Direction.left); - } - if (rl.isKeyDown(.s)) { - if (!isFast) { - isFast = true; - timer = 0; + if (game.state == g.State.running) { + if (rl.isKeyPressed(.up)) game.setDirection(g.Direction.up); + if (rl.isKeyPressed(.down)) game.setDirection(g.Direction.down); + if (rl.isKeyPressed(.right)) game.setDirection(g.Direction.right); + if (rl.isKeyPressed(.left)) game.setDirection(g.Direction.left); + if (rl.isKeyDown(.s)) { + if (!isFast) { + isFast = true; + timer = 0; + } + } else { + isFast = false; + } + const interval = if (isFast) fastTickInterval else tickInterval; + if (timer >= interval) { + timer -= interval; + try game.tick(); } } else { - isFast = false; - } - const interval = if (isFast) fastTickInterval else tickInterval; - if (timer >= interval) { - timer -= interval; - try game.tick(); + if (rl.isKeyPressed(.r)) { + game.deinit(); + game = try g.Game.create(allocator); + timer = 0; + isFast = false; + } } - render( - game, - scaleFactor, - gameOverText, - screenWidth, - gameOverTextWidth, - screenHeight, - fontSize, - youWinText, - youWinTextWidth, - ); + render(game, scaleFactor, screenWidth, screenHeight); } } -fn render(game: g.Game, scaleFactor: comptime_int, gameOverText: [:0]const u8, screenWidth: i32, gameOverTextWidth: i32, screenHeight: i32, fontSize: comptime_int, youWinText: [:0]const u8, youWinTextWidth: i32) void { +fn render(game: g.Game, scaleFactor: comptime_int, screenWidth: i32, screenHeight: i32) void { rl.beginDrawing(); defer rl.endDrawing(); rl.clearBackground(.white); - // Border const fieldWidth = game.playFieldSize[0] * scaleFactor + scaleFactor; const fieldHeight = game.playFieldSize[1] * scaleFactor + scaleFactor; + + // Border rl.drawRectangle(0, 0, fieldWidth, scaleFactor, .black); // top rl.drawRectangle(0, 0, scaleFactor, fieldHeight, .black); // left rl.drawRectangle(0, game.playFieldSize[1] * scaleFactor, fieldWidth, scaleFactor, .black); // bottom @@ -97,10 +83,29 @@ fn render(game: g.Game, scaleFactor: comptime_int, gameOverText: [:0]const u8, s rl.drawRectangle(part[0] * scaleFactor, part[1] * scaleFactor, scaleFactor, scaleFactor, color); } + // Score in top border + var scoreBuf: [32]u8 = undefined; + const scoreText = std.fmt.bufPrintZ(&scoreBuf, "Score: {d}", .{game.score()}) catch unreachable; + rl.drawText(scoreText, scaleFactor + 5, 6, 18, .white); + + // Game over / win overlays + const bigFontSize = 50; + const smallFontSize = 22; + const restartText = "Press R to restart"; + const restartTextWidth = rl.measureText(restartText, smallFontSize); + const cx = @divTrunc(screenWidth, 2); + const cy = @divTrunc(screenHeight, 2); + if (game.state == g.State.lost) { - rl.drawText(gameOverText, @divTrunc(screenWidth - gameOverTextWidth, 2), @divTrunc(screenHeight - fontSize, 2), fontSize, .dark_gray); + const text = "Game Over!"; + const tw = rl.measureText(text, bigFontSize); + rl.drawText(text, cx - @divTrunc(tw, 2), cy - @divTrunc(bigFontSize, 2), bigFontSize, .dark_gray); + rl.drawText(restartText, cx - @divTrunc(restartTextWidth, 2), cy + @divTrunc(bigFontSize, 2) + 8, smallFontSize, .dark_gray); } if (game.state == g.State.won) { - rl.drawText(youWinText, @divTrunc(screenWidth - youWinTextWidth, 2), @divTrunc(screenHeight - fontSize, 2), fontSize, .dark_gray); + const text = "You Win!"; + const tw = rl.measureText(text, bigFontSize); + rl.drawText(text, cx - @divTrunc(tw, 2), cy - @divTrunc(bigFontSize, 2), bigFontSize, .dark_gray); + rl.drawText(restartText, cx - @divTrunc(restartTextWidth, 2), cy + @divTrunc(bigFontSize, 2) + 8, smallFontSize, .dark_gray); } }