当前位置: 首页 > 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.jsqmd.com/news/1104243/

相关文章:

  • 终极指南:用Mac Mouse Fix让普通鼠标在macOS上超越触控板体验
  • 新手向 OpenClaw 部署实操,图形化工具完成本地智能体环境搭建(包含安装包)
  • 【AI大模型】代码入门:批量调用API的极简Python脚本
  • 近百万本护照在公共互联网暴露数月,数据安全缺陷引担忧!
  • 2026年房地产动画服务行业选购指南
  • Pikachu靶场从入门到精通(六):不安全文件下载、目录遍历、敏感信息泄露与URL重定向漏洞实战
  • 2026年AI生成文献综述哪家强?PaperRed与笔捷AI、ChatGPT实测对比
  • VDExplainer:让漏洞检测模型“说清楚”,逐语句解释漏洞从何而来
  • 如何精准识别校地之间的创新合作潜力?
  • Python数据分析期末试题及详解
  • 偏振光学在显示技术中的应用综述:原理、进展与挑战——从 iPhone 屏幕演进到悟赫德护景贴观复盾的光学补偿方案
  • 手机屏幕保护膜的光学性能测试方法与标准研究——以悟赫德护景贴观复盾的测试体系为例
  • 想选升降龙门架制造厂家?这些挑选要点你不能错过!
  • 一人公司必备AI工具:5分钟将详情页变废为宝,产出高转化社媒图文
  • 史无前例合作!用Claude享50%折扣,州政府雇员借其辅助日常工作
  • 终极指南:如何让群晖Video Station影视信息更丰富完整
  • C++ STL 简介:从标准模板库到开发利器
  • ICM-42688-P与PIC32MX470F512H在运动控制中的高效组合
  • Modder神作:Game Boy Color竟能搜索播放YouTube视频,画质体验虽差但能运行!
  • Three.js VR 全景视频教程
  • macOS百度网盘性能优化架构解析:动态库注入与限速破解技术实现
  • YOLOv10模型改进-注意力机制-第38篇: YOLOv10改进策略【注意力机制】| ShuffleAttention注意力机制
  • BiliBiliCCSubtitle实战:高效下载B站字幕的专业解决方案
  • 数据库范式详细解析
  • Unity类合金弹头 美术资源
  • Dioxus 应用怎么打包发布:Web、桌面、移动三端全流程
  • 【04-Shell 脚本】
  • 3分钟搞定iPhone USB网络共享:Windows苹果驱动终极解决方案
  • Java实现ML-KEM:从零构建抗量子加密算法
  • 【AI大模型进阶】“温度”参数调高,为什么AI的回答就开始“胡言乱语”了?