Files

50 lines
1.7 KiB
Go

// 本文件提供 AI 玩家的身份与展示信息:
// AI 使用独立号段(与真实自增 ID 完全隔离),并拥有稳定的拟人昵称,
// 房间与匹配器据此补齐空位,客户端只看到昵称与头像,无法区分真人还是 AI。
package game
import "sync/atomic"
// aiUIDBase 是 AI 用户号段的起点:真实用户 ID 从 1 开始自增,永远不会到达该号段。
const aiUIDBase = 900000000
// aiSeq 是进程内的 AI 序号分配器(原子自增,避免并发重复)。
var aiSeq atomic.Int64
// NewAIUID 分配一个新的 AI 用户 ID。
func NewAIUID() int64 {
return aiUIDBase + aiSeq.Add(1)
}
// IsAIUID 判断某个用户 ID 是否属于 AI 号段。
func IsAIUID(uid int64) bool {
return uid >= aiUIDBase
}
// aiNames 是 AI 昵称池:看起来就是普通玩家的昵称,不含任何 bot/robot/AI 字样。
var aiNames = []string{
"路过的风", "小柚子", "阿呆", "一只猫", "晚安月亮", "橘子汽水",
"慢慢来", "老张", "南风知我意", "会飞的鱼", "山野", "木木",
"夏天的风", "不打伞", "小满", "青柠", "路人甲", "深海",
}
// aiAvatars 是 AI 头像池:留空表示由客户端使用默认头像兜底。
// 若你有默认头像资源,可在此填入可访问 URL,客户端将直接展示。
var aiAvatars = []string{
"", "", "", "", "", "",
}
// AIProfile 返回指定 AI 的展示信息(昵称、头像)。
// 同一 uid 永远映射到同一组合,保证一局之内昵称不会跳变。
func AIProfile(uid int64) (nickname string, avatar string) {
idx := int(uid-aiUIDBase) % len(aiNames)
if idx < 0 {
idx = 0
}
avatar = ""
if idx < len(aiAvatars) {
avatar = aiAvatars[idx]
}
return aiNames[idx], avatar
}