当前位置: 首页 > news >正文

使用一个json文件来描述我们的战场

{ "mapId": "standard_24_lanes", "name": "标准24格战场", "positions": [ { "id": 0, "zone": "friendly", "lane": "back" }, { "id": 1, "zone": "friendly", "lane": "back" }, // ... { "id": 6, "zone": "friendly", "lane": "front" }, // ... { "id": 12, "zone": "enemy", "lane": "front" }, // ... { "id": 18, "zone": "enemy", "lane": "back" } // ... ] }

2.建立战场数据模型

package models // PositionLayout 定义了单个位置的静态属性 type PositionLayout struct { ID int `json:"id"` Zone string `json:"zone"` Lane string `json:"lane"` } // MapLayout 代表整个地图的静态布局 type MapLayout struct { MapID string `json:"mapId"` Name string `json:"name"` Positions []PositionLayout `json:"positions"` }

3.初始化战场代码

// BattlePosition 代表战斗中一个位置的动态状态。 type BattlePosition struct { Layout *models.PositionLayout // 引用静态布局信息 Fighters []*Fighter // 存储当前站在此位置的战斗者 } // Fight 管理两个战斗者之间的战斗状态。 type Fight struct { Team1 []*Fighter Team2 []*Fighter Log strings.Builder DataLog models.DataLog round int Battlefield []*BattlePosition // Battlefield 是一个切片,索引直接对应位置ID FightersByID map[string]*Fighter // 新增一个用于快速查找的 map } // NewFight 创建并初始化一个新的战斗实例。 func NewFight(team1Chars, team2Chars map[int]models.Character, layout *models.MapLayout) *Fight { f := &Fight{ Team1: []*Fighter{}, Team2: []*Fighter{}, DataLog: models.DataLog{Rounds: []models.Round{}}, Battlefield: make([]*BattlePosition, len(layout.Positions)), FightersByID: make(map[string]*Fighter), // 初始化map } // 1. 根据布局初始化战场 for i, posLayout := range layout.Positions { // 复制一份,避免指针问题 layoutCopy := posLayout f.Battlefield[i] = &BattlePosition{ Layout: &layoutCopy, Fighters: []*Fighter{}, // 初始化为空 } } // 2. 创建战斗者并放置到地图上 placeFighter := func(char models.Character, pos int) *Fighter { charCopy := char // 创建副本以确保每个fighter有自己的character实例 fighter := &Fighter{ Character: &charCopy, CurrentHP: charCopy.Attributes.HP, Position: pos, IsAlive: true, } // 将战斗者添加到对应位置的Fighters列表中 if pos >= 0 && pos < len(f.Battlefield) { f.Battlefield[pos].Fighters = append(f.Battlefield[pos].Fighters, fighter) } f.FightersByID[charCopy.HeroID] = fighter // 使用HeroID作为key return fighter } for pos, char := range team1Chars { fighter := placeFighter(char, pos) f.Team1 = append(f.Team1, fighter) } for pos, char := range team2Chars { fighter := placeFighter(char, pos) f.Team2 = append(f.Team2, fighter) } return f }

4.分析

这么做会有两个显而易见的好处:高效与清晰的查询

针对两个需求,根据位置找人,或根据玩家id找人

对比我们的旧方法 : 遍历所有角色,检查每个角色的 Position 字段是不是xx,遍历所有角色,检查每个角色的 HeroID 字段

而现在我们只需要

// 直接通过索引访问,就像查字典一样精准 fightersAtPos := f.Battlefield[11].Fighters // 直接通过Key查找,一步到位 fighter, found := f.FightersByID["hero-111-111"]

噢,这太棒了

5.补充: make()方法说明

make() 是Go语言的一个内置函数,它的作用是预先分配内存并初始化一个特定类型的对象,

主要用于三种类型:切片(slices)、映射(maps)和通道(channels)

http://www.gsyq.cn/news/1616215.html

相关文章:

  • 【AI大模型】代码入门:批量调用API的极简Python脚本
  • 新手向 OpenClaw 部署实操,图形化工具完成本地智能体环境搭建(包含安装包)
  • 手机屏幕保护膜的光学性能测试方法与标准研究——以悟赫德护景贴观复盾的测试体系为例
  • 2026年房地产动画服务行业选购指南
  • 2026年AI生成文献综述哪家强?PaperRed与笔捷AI、ChatGPT实测对比
  • VDExplainer:让漏洞检测模型“说清楚”,逐语句解释漏洞从何而来
  • 一人公司必备AI工具:5分钟将详情页变废为宝,产出高转化社媒图文
  • YOLOv10模型改进-注意力机制-第38篇: YOLOv10改进策略【注意力机制】| ShuffleAttention注意力机制
  • macOS百度网盘性能优化架构解析:动态库注入与限速破解技术实现
  • C++ STL 简介:从标准模板库到开发利器
  • 猪场保温灯总坏?这款设备全项达标头部集团招标标准,已服务上千家猪场!
  • 英伟达收购LeptonAI一年后贾扬清离职,开源承诺搁置或是主因
  • Three.js 随机城市白膜教程
  • 2026年大模型“开源海啸”下,锥形语言模型零成本提升性能!
  • 煮饺子与docker、kubernetes之间的关系
  • 音频设备有底噪?选对音频变压器是关键
  • Three.js 优雅永不过时教程
  • GPT-5.6登场硬刚Claude Mythos 5,跑分互有胜负却因作弊被严控!
  • LG 发布新款扫地机器人,充电基座可藏厨房橱柜,或不进美国市场
  • 字节跳动All in AI:从C端到B端,双端下注能否跑通AI战略?
  • pdf盖章软件
  • 记录Linux线程(信号量函数)
  • Linux Wireless之WiFi Beacon Hint 流程分析
  • 对称加密算法实战指南:从AES到SM4,原理、选型与安全实践
  • 老牌顶刊跌下神坛,为何IF和分区双双“失守”?
  • 9-LLTrack:用于二维多目标跟踪的并行关联框架
  • OpenTelemetry 多租户分流怎么做:按服务名路由 traces 的实战方案
  • 三步打造个人数字图书馆:novel-downloader小说下载器终极指南
  • Grok 4.5私测,马斯克AI战略是转型还是出清?
  • ESim电工制图图文介绍