feat: initial commit

This commit is contained in:
2025-07-22 18:11:39 +02:00
commit 3f6f7cb79e
5 changed files with 204 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
zig-out/
.zig-cache/

53
build.zig Normal file
View File

@@ -0,0 +1,53 @@
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe_mod = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
const exe = b.addExecutable(.{
.name = "snake",
.root_module = exe_mod,
});
const raylib_dep = b.dependency("raylib_zig", .{
.target = target,
.optimize = optimize,
});
const raylib = raylib_dep.module("raylib"); // main raylib module
const raygui = raylib_dep.module("raygui"); // raygui module
const raylib_artifact = raylib_dep.artifact("raylib"); // raylib C library
raylib_artifact.root_module.addCMacro("SUPPORT_FILEFORMAT_JPG", "");
exe.linkLibrary(raylib_artifact);
exe.root_module.addImport("raylib", raylib);
exe.root_module.addImport("raygui", raygui);
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const exe_unit_tests = b.addTest(.{
.root_module = exe_mod,
});
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_exe_unit_tests.step);
}

44
build.zig.zon Normal file
View File

@@ -0,0 +1,44 @@
.{
// This is the default name used by packages depending on this one. For
// example, when a user runs `zig fetch --save <url>`, this field is used
// as the key in the `dependencies` table. Although the user can choose a
// different name, most users will stick with this provided value.
//
// It is redundant to include "zig" in this name because it is already
// within the Zig package namespace.
.name = .snake,
// This is a [Semantic Version](https://semver.org/).
// In a future version of Zig it will be used for package deduplication.
.version = "0.0.0",
// Together with name, this represents a globally unique package
// identifier. This field is generated by the Zig toolchain when the
// package is first created, and then *never changes*. This allows
// unambiguous detection of one package being an updated version of
// another.
//
// When forking a Zig project, this id should be regenerated (delete the
// field and run `zig build`) if the upstream project is still maintained.
// Otherwise, the fork is *hostile*, attempting to take control over the
// original project's identity. Thus it is recommended to leave the comment
// on the following line intact, so that it shows up in code reviews that
// modify the field.
.fingerprint = 0x516d6b9e32258eaf, // Changing this has security and trust implications.
// Tracks the earliest Zig version that the package considers to be a
// supported use case.
.minimum_zig_version = "0.14.1",
.dependencies = .{
.raylib_zig = .{
.url = "git+https://github.com/Not-Nik/raylib-zig?ref=devel#5013830647196ba938a3a25a36b8245606e9a9cd",
.hash = "raylib_zig-5.6.0-dev-KE8REM0tBQAHVn9Xjqlgu9l1qgfTmP8aJa1kLhD584bV",
},
},
.paths = .{
"build.zig",
"build.zig.zon",
"src",
},
}

78
src/game.zig Normal file
View File

@@ -0,0 +1,78 @@
const std = @import("std");
const Direction = enum {
up,
down,
left,
right,
};
/// x, y
const Vec2 = @Vector(2, u32);
const Element = struct {
position: Vec2,
prev: ?Element,
next: ?Element,
pub fn hasPrev(self: Element) bool {
return self.prev != null;
}
pub fn hasNext(self: Element) bool {
return self.next != null;
}
};
const GameState = struct {
playFieldSize: Vec2,
food: Vec2,
headDirection: Direction,
head: Element,
tail: Element,
pub fn create() GameState {
const pos1 = Element{
.position = Vec2{ 10, 10 },
.prev = null,
.next = null,
};
const pos2 = Element{
.position = Vec2{ 9, 10 },
.prev = pos1,
.next = null,
};
const pos3 = Element{
.position = Vec2{ 8, 10 },
.prev = pos2,
.next = null,
};
pos1.next = pos2;
pos2.next = pos3;
return GameState{
.playFieldSize = Vec2{ 20, 20 },
.food = Vec2{ 2, 5 },
.headDirection = Direction.left,
.head = pos1,
.tail = pos3,
};
}
pub fn tick() void {}
fn calculateSnakePositions(self: GameState, allocator: std.Allocator) []Vec2 {
var array = std.ArrayList(u8).initCapacity(allocator, 1000);
var current = self.head;
while (current.hasNext()) {
array.add(current.position);
}
return array;
}
};

27
src/main.zig Normal file
View File

@@ -0,0 +1,27 @@
const std = @import("std");
const rl = @import("raylib");
pub fn main() anyerror!void {
const alloc = std.heap.page_allocator;
const screenWidth = 800;
const screenHeight = 450;
rl.initWindow(screenWidth, screenHeight, "Snake");
defer rl.closeWindow();
rl.setTargetFPS(100);
while (!rl.windowShouldClose()) {
rl.beginDrawing();
defer rl.endDrawing();
rl.clearBackground(.white);
const info = try std.fmt.allocPrintZ(alloc, "FPS: {}\n", .{rl.getFPS()});
rl.drawText("Congrats! You created your first window!", 190, 200, 20, .light_gray);
rl.drawText(info, 0, 0, 20, .light_gray);
rl.drawRectangle(10, 10, 10, 10, .black);
}
}