// 本文件提供 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 }