Skip to main content

mlib - 轻量级数学与游戏工具库

公告!

请更换至mini-game-tools

该库将不再维护

但是本仓库不会删除

一个零外部依赖的Python工具库,提供分数运算、数学函数、随机数生成、颜色处理、几何碰撞检测、向量运算和存档系统。

特性

  • 🧮 sfrac - 零依赖的分数类,支持精确运算
  • 📐 smath - 基础数学函数(三角函数、对数、取整等),支持复数运算
  • 🎲 srandom - 可种子控制的随机数生成器
  • 🎨 scolor - RGB/HSV颜色转换、插值、常用颜色
  • 📏 sgeometry - 2D/3D几何类型与碰撞检测(矩形、圆形、线段、AABB、球体)
  • ➡️ svector - 二维/三维向量运算
  • 💾 ssaver - SGT格式存档系统,带校验和验证
  • 📦 spathfinder - BFS寻路

如何使用

分数运算 (sfrac)

from mlib import frac

a = frac(1, 2)  # 1/2
b = frac(3, 4)  # 3/4

print(a + b)          # 1.25
print(repr(a * b))    # 3/8
print(float(a / b))   # 0.6666666666666666
# 注意,这个分数在处理极大或极小数时容易产生误差

数学函数 (smath)

from mlib import *

# 三角函数(支持复数)
print(sin(pi/2))      # 1.0
print(cos(1+2j))      # 复数结果

# 对数
print(log(100))       # 2.0
print(ln(e**2))       # 2.0

# 取整与映射
print(floor(3.7))     # 3
print(ceil(3.2))      # 4
print(map(50, 0,100, 0,360))  # 180.0

随机数 (srandom)

from mlib import SimpleRNG

rng = SimpleRNG("my_seed")
print(rng.randint(1, 10))     # 随机整数
print(rng.random())            # [0,1) 浮点数
print(rng.choice(["a","b","c"]))  # 随机选择
print(rng.sample_by_y(lambda x: x**2, 3, 10) #根据函数高度取随机数
# 🎲 1.1.1新增:随机抽样与洗牌
# 随机抽牌(不重复)
cards = list(range(20))
hand = rng.sample(cards, 5)    # 抽5张,例如 [7, 1, 3, 6, 19]

# 打乱顺序(原地修改)
rng.shuffle(cards)              # cards 顺序被打乱
print(cards)                    # 例如 [7, 1, 12, 15, 18, 16, ...]

颜色处理 (scolor)

from mlib import *

# RGB操作
print(hex_to_rgb("#FF0000"))   # (255, 0, 0)
print(rgb_to_hex(0,255,0))     # #00ff00

# HSV转换
hsv = rgb_to_hsv(255,0,0)      # (0.0, 1.0, 1.0)
rgb = hsv_to_rgb(120, 1, 1)    # (0, 255, 0)

# 颜色插值
c1 = RED
c2 = BLUE
print(lerp(c1, c2, 0.5))       # (127, 0, 127)

# 颜色混合 - 正片叠底
blend(GREEN, PURPLE, "multiply") # (0, 112, 0)

#颜色混合 - 滤色

blend(GREEN, PURPLE, "screen") # (147.0, 255.0, 219.0)

几何碰撞 (sgeometry)

from mlib import *

# 2D矩形
rect = Rect(0,0,100,100)
print(rect.collide_point(50,50))      # True
print(rect.collide_circle(Circle((150,150),20)))  # False

# 线段
line = Line2((0,0),(100,100))
print(line.closest_point((50,0)))     # (25,25)

# 3D AABB
box = AABB((0,0,0),(10,10,10))
print(box.collide_point((5,5,5)))     # True

向量运算 (svector)

from mlib import vec2, vec3

v2 = vec2(3,4)
print(v2.length())          # 5.0
print(v2.normalize())       # (0.6, 0.8)

v3 = vec3(1,0,0)
w3 = vec3(0,1,0)
print(v3.cross(w3))         # (0,0,1)

存档系统 (ssaver)

from mlib import SGTsaver
from mlib import vec2

# 保存数据
saver = SGTsaver()
saver.set_value(
    score=100,
    name="hero",
    position=vec2(10,20),
    items=["sword","potion"]
)
saver.save("game.sgt")

# 加载数据
loaded = SGTsaver().load("game.sgt")
print(loaded["name"])       # "hero"
print(loaded["position"])   # (10.0, 20.0)

基本寻路

from mlib import bfs

# 地图:0可走,1障碍
grid = [
    [0,0,0,0,0],
    [0,1,1,1,0],
    [0,0,0,0,0],
    [0,1,1,1,0],
    [0,0,0,0,0]
]

# 找路径
path = bfs(grid, (0,0), (4,4))

# 输出路径
for p in path:
    print(f"({p.x}, {p.y})")

配合 vec2

from mlib import vec2, bfs

start = vec2(0, 0)
end = vec2(4, 4)

path = bfs(grid, start, end)
print(f"需要 {len(path)} 步")
print(f"第一步: {path[1]}")

无路可走

path = bfs(grid, (0,0), (4,4))
if path is None:
    print("到不了终点")

SGT文件格式

SGTv1                  # 魔数(被跳过)
#score=100            # 整数
#name="hero"          # 字符串
#position=(10,20)     # 向量
#items=["sword","potion"]  # 列表
#hash=123456          # 校验和
  • # 开头的行为有效数据
  • 非 # 开头的行会被跳过
  • 自动计算并验证校验和

依赖

  • 无外部依赖,纯Python实现
  • 兼容Python 3.6+

许可证

MIT License

关于版本号(从1.5.0开始有效)

1.5.0 0:当出现修复bug时,该号加一 5:当出现向下兼容的功能时,该号加一 1:当出现不向下兼容的API时,该号加一

Metadata

Release files for limo-s-game-tools 1.5.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for limo-s-game-tools 1.5.4
File Interpreter ABI Platform
limo_s_game_tools-1.5.4-py3-none-any.whl Python 3 none any Details

Release files / limo_s_game_tools-1.5.4-py3-none-any.whl

Download URL limo_s_game_tools-1.5.4-py3-none-any.whl
Size 20.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d8c36fe0eebdcb779f976e67016b3c776fabc603a07e69bef63b6d4962b76b45
BLAKE2b-256 checksum
How to use checksums
add22ce4c15fd08aec2102527a518017800ddc083d5484fd70a9f5a5873c9163
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release history Release notifications | RSS feed

This release

1.5.4 This release

1 release file

1.5.3

1 release file

1.5.2

1 release file

1.5.1

1 release file

1.5.0

1 release file

1.4.3.1

1 release file

1.4.3

1 release file

1.4.2

1 release file

1.4.1

1 release file

1.4.0

1 release file

1.3.0

1 release file

1.2.0

1 release file

1.1.1

1 release file

1.0.2

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page