feat(world): 方块注册表、坐标工具、区块数据结构、确定性世界生成(含测试)
This commit is contained in:
25
internal/coord/coord.go
Normal file
25
internal/coord/coord.go
Normal 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
|
||||
}
|
||||
36
internal/coord/coord_test.go
Normal file
36
internal/coord/coord_test.go
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user