支持多人数对局与 AI 补位:玩法声明人数范围、匹配分队列与超时补 AI、房间玩家名册
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
// 本文件提供 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
|
||||
}
|
||||
Reference in New Issue
Block a user