feat(world): 方块注册表、坐标工具、区块数据结构、确定性世界生成(含测试)

This commit is contained in:
NianGao Dev
2026-08-15 22:32:50 +08:00
parent 8200cfe83d
commit a89d087c55
10 changed files with 852 additions and 0 deletions

25
internal/coord/coord.go Normal file
View File

@@ -0,0 +1,25 @@
// Package coord 坐标工具:floorDiv 与区块坐标换算(设计.md §4.1)。
// 关键:世界坐标转区块坐标必须使用 floorDiv,正确处理负数。
package coord
// FloorDiv 向下取整除法(负安全)。
func FloorDiv(a, b int32) int32 {
q := a / b
r := a % b
if r < 0 {
q--
}
return q
}
// ChunkCoord 世界坐标 → 区块坐标(区块大小 16)。
func ChunkCoord(worldX int32) int32 { return FloorDiv(worldX, 16) }
// LocalCoord 世界坐标 → 区块内局部坐标(0..15)。
func LocalCoord(worldX int32) int32 {
l := worldX - ChunkCoord(worldX)*16
if l < 0 {
l += 16
}
return l
}

View File

@@ -0,0 +1,36 @@
package coord
import "testing"
// TestFloorDiv 验证负坐标安全的向下取整除法(设计.md §4.1 踩坑)。
func TestFloorDiv(t *testing.T) {
cases := []struct {
a, b, want int32
}{
{15, 16, 0},
{16, 16, 1},
{-1, 16, -1},
{-16, 16, -1},
{-17, 16, -2},
{0, 16, 0},
}
for _, c := range cases {
if got := FloorDiv(c.a, c.b); got != c.want {
t.Fatalf("FloorDiv(%d, %d) = %d,期望 %d", c.a, c.b, got, c.want)
}
}
}
// TestChunkLocal 验证区块坐标与局部坐标互转(含负数)。
func TestChunkLocal(t *testing.T) {
for _, wx := range []int32{-33, -17, -16, -1, 0, 15, 16, 31} {
cx := ChunkCoord(wx)
lx := LocalCoord(wx)
if lx < 0 || lx >= 16 {
t.Fatalf("LocalCoord(%d) = %d 越界", wx, lx)
}
if cx*16+lx != wx {
t.Fatalf("坐标还原失败: %d → cx=%d lx=%d", wx, cx, lx)
}
}
}