`
cenphoenix
  • 浏览: 160557 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

游戏算法整理 算法六:关于SLG中人物可到达范围计算的想法

阅读更多

下面的没有经过实践,因此很可能是错误的,觉得有用的初学朋友读一读吧:)
希望高人指点一二 :)

简介:
在标准的SLG游戏中,当在一个人物处按下鼠标时,会以人物为中心,向四周生成一个菱形的可移动区范围,如下:

   0
000
00s00
000
   0

这个图形在刚开始学习PASCAL时就应该写过一个画图的程序(是否有人怀念?)。那个图形和SLG的扩展路径一样。

一、如何生成路径:
从人物所在的位置开始,向四周的四个方向扩展,之后的点再进行扩展。即从人物所在的位置从近到远进行扩展(类似广宽优先)。

二、扩展时会遇到的问题:
1、当扩展到一个点时,人物的移动力没有了。
2、当扩展的时候遇到了一个障碍点。
3、当扩展的时候这个结点出了地图。
4、扩展的时候遇到了一个人物正好站在这个点(与2同?)。
5、扩展的点已经被扩展过了。当扩展节点的时候,每个节点都是向四周扩展,因此会产生重复的节点。

当遇到这些问题的时候,我们就不对这些节点处理了。在程序中使用ALLPATH[]数组记录下每一个等扩展的节点,不处理这些问题节点的意思就是不把它们加入到ALLPATH[]数组中。我们如何去扩展一个结点周围的四个结点,使用这个结点的坐标加上一个偏移量就可以了,方向如下:

   3
   0 2
   1

偏移量定义如下:
int offx[4] = { -1, 0, 1, 0 };
int offy[4] = { 0, 1, 0, -1 };

扩展一个节点的相邻的四个节点的坐标为:
for(int i=0; i<4; i )
{ 
     temp.x = temp1.x offx[i];
     temp.y = temp1.y offy[i];
}

三、关于地图的结构:
1、地图的二维坐标,用于确定每个图块在地图中的位置。
2、SLG中还要引入一个变量decrease表示人物经过这个图块后他的移动力的减少值。例如,一个人物现在的移动力为CurMP=5,与之相领的图块的decrease=2;这时,如果人物移动到这里,那它的移动力变成CurMP-decrease。
3、Flag域:宽度优先中好像都有这个变量,有了它,每一个点保证只被扩展一次。防止一个点被扩展多次。(一个点只被扩展一次真的能得到正确的结果吗?)
4、一个地图上的图块是否可以通过,我们使用了一个Block代表。1---不可以通过;0---可以通过。

这样,我们可以定义一个简单的地图结构数组了:

#define MAP_MAX_WIDTH 50
#define MAP_MAX_HEIGHT 50
typedef struct tagTILE{ 
     int x,y,decrease,flag,block;
}TILE,*LPTILE;
TILE pMap[MAP_MAX_WIDTH][MAP_MAX_HEIGHT];

以上是顺序数组,是否使用动态的分配更好些?毕竟不能事先知道一个地图的宽、高。

四、关于路径:
SLG游戏中的扩展路径是一片区域(以人物为中心向四周扩展,当然,当人物移动时路径只有一个)。这些扩展的路径必须要存储起来,所有要有一个好的结构。我定义了一个结构,不是很好:

typedef struct tagNODE{ 
     int x,y;   //扩展路径中的一个点在地图中的坐标。
     int curmp; //人物到了这个点以后的当前的移动力。
}NODE,*LPNODE;

上面的结构是定义扩展路径中的一个点的结构。扩展路径是点的集合,因此用如下的数组进行定义:

NODE AllPath[PATH_MAX_LENGTH];

其中的PATH_MAX_LENGTH代表扩展路径的点的个数,我们不知道这个扩展的路径中包含多少个点,因此定义一个大一点的数字使这个数组不会产生溢出:

#define PATH_MAX_LENGTH 200

上面的这个数组很有用处,以后的扩展就靠它来实现,它应该带有两个变量nodecount 代表当前的数组中有多少个点。当然,数组中的点分成两大部分,一部分是已经扩展的结点,存放在数组的前面;另一部分是等扩展的节点,放在数组的后面为什么会出现已扩展节点和待扩展节点?如下例子:

当前的人物坐标为x,y;移动力为mp。将它存放到AllPath数组中,这时的起始节点为等扩展的节点。这时我们扩展它的四个方向,对于合法的节点(如没有出地图,也没有障碍......),我们将它们存放入AllPath数组中,这时的新加入的节点(起始节点的子节点)就是等扩展结点,而起始节点就成了已扩展节点了。下一次再扩展节点的时候,我们不能再扩展起始节点,因为它是已经扩展的节点了。我们只扩展那几个新加入的节点(待扩展节点),之后的情况以此类推。那么我们如何知道哪些是已经扩展的结点,哪些是等扩展的节点?我们使用另一个变量cutflag,在这个变量所代表的下标以前的结点是已扩展节点,在它及它之后是待扩展结点。

五、下面是基本框架(只扩展一个人物的可达范围):

int nodecount=0; //AllPath数组中的点的个数(包含待扩展节点和已经扩展的节点
int cutflag=0; //用于划分已经扩展的节点和待扩展节点
NODE temp; //路径中的一个点(临时)
temp.x=pRole[cur]->x; //假设有一个关于人物的类,代表当前的人物
temp.y=pRole[cur]->y;
temp.curmp=pRole[cur]->MP; //人物的最大MP
AllPath[nodecount ]=temp; //起始点入AllPath,此时的起始点为等扩展的节点

while(curflag<nodecount) //数组中还有待扩展的节点
{ 
     int n=nodecount; //记录下当前的数组节点的个数。
     for(int i=cutflag;i<nodecount;i ) //遍历待扩展节点
     { 
         for(int j=0;j<4;j ) //向待扩展节点的四周各走一步
         { 
             //取得相邻点的数据
             temp.x=AllPath[i].x offx[j];
             temp.y=AllPath[i].y offy[j];
             temp.curmp=AllPath[i].curmp-pMap[AllPath[i].x][AllPath[i].y].decrease;
//以下为检测是否为问题点的过程,如果是问题点,不加入AllPath数组,继续处理其它的点
             if(pMap[temp.x][temp.y].block)
                 continue; //有障碍,处理下一个节点
             if(temp.curmp<0)
                 continue; //没有移动力了
             if(temp.x<0||temp.x>=MAP_MAX_WIDTH|| temp.y<0||temp.y>=MAP_MAX_HEIGHT)
                 continue; //出了地图的范围
             if(pMap[temp.x][temp.y].flag)
                 continue; //已经扩展了的结点
             //经过了上面几层的检测,没有问题的节点过滤出来,可以加入AllPath
             AllPath[nodecount]=temp;
         }
         pMap[AllPath[i].x][AllPath[i].y].flag=1; //将已经扩展的节点标记为已扩展节点
     }
     cutflag=n; //将已扩展节点和待扩展节点的分界线下标值移动到新的分界线
}
for(int i=0;i<nodecount;i )
     pMap[AllPath[i].x][AllPath[i].y].bFlag=0; //标记为已扩展节点的标记设回为待扩展节点。

分享到:
评论
1 楼 ha397666 2010-01-07  
5、扩展的点已经被扩展过了。当扩展节点的时候,每个节点都是向四周扩展,因此会产生重复的节点。这句话我觉得有问题···

1-1-*
1-2
5-2
从5扩展,5是总的数,如果5从右边扩展,最后上面方向的扩展不会扩展到右边的*,因为他已经扩展了 ,但其实他是能够扩展到*的
不知道我表述清楚了没有···也许是我对楼主理解的不够吧 楼主莫怪

相关推荐

    slg游戏路径算法原理

    通过对SLG游戏中路径查找算法的研究,我们可以发现这一算法不仅能够有效地解决角色在复杂地图上的移动问题,还能进一步应用于更多类型的游戏中。未来随着技术的发展,这类算法还将不断进化和完善,为玩家带来更加...

    【H5JS】游戏常用算法-路径搜索算法-随机迷宫算法(普里姆算法).pdf

    路径搜索算法是游戏开发中非常重要的一部分,特别是在RPG、SLG等游戏中,它可以让游戏角色自动寻找路径到达指定目的地。随机迷宫算法则可以用于生成随机迷宫,增加游戏的趣味性。 路径搜索算法的实现是通过将游戏...

    游戏开发中的经典算法(配图版,百度文库需下载券)

    SLG(策略游戏)中的人物可达范围计算,主要是确定角色能够在地图上的哪些区域自由移动。这涉及到对地图障碍物的分析,以及角色移动规则的设定,例如限制只能在特定地形上行走。通过计算每个节点的可达性,可以生成...

    SLG游戏用例Java版

    这是一个自制的SLG的Java PC游戏用例,本利仅为游戏本身,源码将随blog更新发布,当然有兴趣的允许反编译,未加密。

    SLG 游戏源码测试

    SLG游戏,全称为策略游戏(Strategy Game),是一种玩家通过制定策略来控制游戏进程的类型。在本案例中,我们关注的是将一个基于LGame-J2SE版本的SLG游戏移植到Android平台上的过程。LGame是一个轻量级的游戏开发...

    J2ME中的SLG游戏示例代码

    这个“J2ME中的SLG游戏示例代码”提供了使用J2ME开发策略类游戏(Strategy Game,简称SLG)的基础示例。SLG游戏通常涉及复杂的决策制定和资源管理,例如《文明》系列或《三国志》等经典游戏。通过研究这些源代码,...

    SLG源码博客使用

    "SLG源码博客使用"这个标题暗示了这是一个关于如何在实际项目中应用或学习SLG游戏开发的教程或案例。 描述中的"cping1982写的slg例子"表明这是一位名为"cping1982"的开发者创建的SLG游戏示例项目。他将这个示例转化...

    JSHTML5游戏常用算法之路径搜索算法随机迷宫算法详解【普里姆算法】随机搜索算法.pdf

    路径搜索算法是游戏开发中非常重要的一个算法,特别是在 RPG、SLG 中经常用到。在这些游戏中,通过路径指定目的地,人物或者 NPC 就会自动行走到目的地,这就是通过路径搜索或者称为寻路算法来实现的。 路径搜索...

    JavaSLG游戏开发入门示例及源码

    JavaSLG游戏开发入门示例及其源码(源码在jar内)

    人物移动和碰撞检测

    在游戏开发中,人物移动和碰撞检测是两个至关重要的技术环节。它们决定了游戏中的角色如何在虚拟世界中行动,以及如何与环境互动。本资源包含了人物移动算法和碰撞检测技术的相关资料,帮助开发者深入理解并实现这些...

    JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】

    路径搜索算法在游戏中非常常见,特别是在 RPG、SLG 中经常用到。在这些游戏中,通过鼠标指定行走目的地,人物或者NPC就会自动行走到目标地点,这就是通过路径搜索或者称为寻路算法来实现的。通俗地说,就是在一张...

    SlgAI 游戏引擎示例

    这个项目的主要目的是为了提供一个学习和交流的平台,帮助开发者理解和实现策略类游戏(SLG,即Strategy Game)的核心机制。通过研究和分析这个引擎,我们可以深入理解游戏逻辑、单位行为控制、战斗计算以及地图交互...

    java 游戏开发教程j2me教程java java 高手毕竟之路

    - **SLG中可移动范围的实现**:在策略游戏中,确定角色或单位的行动范围和策略。 8. **游戏优化和注意点**: - **屏幕绘制技术的优化**:提高帧率和视觉效果,减少不必要的绘图操作。 - **新对象的产生和垃圾...

    2021-2025年中国SLG类移动游戏行业调研及错位竞争策略研究报告.pdf

    ### 2021-2025年中国SLG类移动游戏行业调研及错位竞争策略研究报告 #### 重要知识点解读 ##### 一、企业错位竞争策略概述 - **错位竞争策略**:指企业在市场竞争中寻找差异化的竞争优势,通过发掘自身独特资源或...

    游戏编程者阅读(百日造就游戏制作人)

    其中,C++是游戏开发中最常用的编程语言之一,特别是在PC游戏开发中更是不可或缺。除此之外,还需要掌握一定的算法与数据结构知识,这对于优化游戏性能至关重要。 #### 三、游戏开发的专业培训与实践 游戏开发不...

    即时战略游戏glest源代码

    即时战略游戏(Real-Time Strategy,简称RTS)是一种深受玩家喜爱的游戏类型,它融合了策略、资源管理、单位生产与战斗等元素。Glest是一款开放源代码的RTS游戏,其源代码对于开发者,尤其是初学者,是学习游戏开发...

    细粒度IP定位参文2:(街道IP定位)

    Corr-SLG算法通过引入相对延迟距离相关性和多层共同路由器的概念,显著提高了IP地理定位的准确性,特别是在弱连接网络环境中。这对于未来的5G网络中多媒体内容提供商与用户之间提供更加精准的认证信息具有重要意义。...

    JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解

    这种算法经常用于RPG(早期的《最终幻想》、《DQ》、《仙剑奇侠传》)、SLG(《炎龙骑士团》、《超级机器人大战》)、PUZ(《俄罗斯方块》、《宝石谜阵》)类型的游戏。这类游戏中,通常情况下整个地图都是由一些...

Global site tag (gtag.js) - Google Analytics