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

Golang游戏开发笔记:地图索引系统实现

好家伙,

在游戏开发,尤其是后端服务的构建过程中,我们常常从一个简单的想法或原型开始。

代码直接、功能明确,一切看起来都很好。但随着项目复杂度的提升,最初的“简洁”设计往往会变成“僵化”的枷锁。

 

0.需求分析

我想我需要一张地图,作用如下:

1.记录所有人的位置,

2.快速的拿到某个角色的信息

3.快速拿到某个位置所有角色的信息

4.某个角色在释放技能时进行索敌,

 

1.战场模型

使用一个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        []*FighterTeam2        []*FighterLog          strings.BuilderDataLog      models.DataLoground        intBattlefield  []*BattlePosition   // Battlefield 是一个切片,索引直接对应位置IDFightersByID 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 := posLayoutf.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作为keyreturn 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)

 

make(...)作用:告诉go,请在内存中给我分配一块连续的空间,这个空间的长度要xxx

 

代码类型作用现实比喻
make([]*BattlePosition, 24) 切片 (Slice) 创建一个有24个空位的、固定长度的列表。 建造一个有24个格子的空货架。
make(map[string]*Fighter) 映射 (Map) 创建一个空的、可动态增长的键值对存储结构。 准备一个空的、可以随时存取档案的档案柜。

 

 

 

 

http://www.zskr.cn/news/50580.html

相关文章:

  • 完整教程:《简易制作 Linux Shell:详细分析原理、设计与实践》
  • 计算机网络5 - 指南
  • 2025年开除申诉靠谱机构推荐:专业学术申诉机构评测指南!
  • win10pro sn
  • 用递归的方式输出各位数字
  • 2025 年 11 月门窗十大品牌综合实力权威推荐榜单,产能、专利、环保三维数据透视
  • 20232426 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • AzuraCast:自托管一体化网络电台管理套件
  • 019数据结构之栈——算法备赛 - 实践
  • GESP考试报名附考试报名流程
  • 字节序浅析
  • 2025 最新无缝钢管厂家推荐榜:国际测评认证 + 技术创新 + 全场景适配权威指南大口径无缝钢管/16Mn 无缝钢管/定制无缝钢管/厚壁无缝钢管公司推荐
  • 2025年硫酸钠流化床干燥机源头厂家权威推荐榜单:调味品振动流化床干燥机/大豆纤维流化床干燥机/味精振动流化床干燥机源头厂家精选
  • MX Round 24 解题报告
  • 2025年目字扣订制厂家权威推荐榜单:塑料扣具/箱包插扣/五金插扣源头厂家精选
  • # 第10章 指针和结构体
  • 2025年全自动无屑切割倒角一体机实力厂家权威推荐榜单:自动化切割倒角一体机/切割倒角一体机/自动切割倒角一体机源头厂家精选
  • 2025 年 11 月喷漆废水处理工艺,喷漆废水处理技术改造,喷漆废水处理运维服务公司最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 2025 年 11 月喷漆废水处理设备,喷漆废水处理药剂,喷漆废水处理系统厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读!
  • 2025 最新喷漆废水处理公司推荐!喷漆废水处理设备 / 药剂 / 工艺 / 循环回用系统优质品牌榜单,含技术改造与运维服务厂家优选
  • 完整教程:VScode 入门(设置篇)
  • 微服务架构中的 Token 工作机制详解
  • [KaibaMath]1023 柯西不等式的简洁证明
  • 2025 最新网架厂家权威排行榜:焊接球 / 螺栓球 / 大跨度等多类型网架实力企业最新推荐
  • WEB集群-HTTP概述与Nginx部署
  • BBS伪随机数生成器
  • 11.15模拟赛
  • 2025年RS485红外线测温仪源头厂家权威推荐榜单:在线红外测温仪/20mA红外线测温仪/红外线测温仪变送器源头厂家精选
  • P14508 猜数游戏 guess
  • 用HBuilder建立查询天气的网页