50 lines
1.7 KiB
Go
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
|
|
}
|