一种战棋游戏的AI算法设计与实现浅析.doc_第1页
一种战棋游戏的AI算法设计与实现浅析.doc_第2页
一种战棋游戏的AI算法设计与实现浅析.doc_第3页
一种战棋游戏的AI算法设计与实现浅析.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 26 卷 第 2 期2011 年 11 月西藏大学学报(自然科学版)Vol.26 No.2JOURNAL OF TIBET UNIVERSITY Nov. 2011一种战棋游戏的 AI 算法设计与实现浅析格桑多吉王玉龙郭 鑫(西藏大学工学院 西藏拉萨 850000)摘要:文章描述了利用改进 A* 算法实现的战棋游戏 AI 设计。对战棋游戏基本元素进行了分析,并给出了算法设计的整体思路,采用 C+实现了战棋游戏基本元素的数据结构,用类广度优先算法实现了对棋 子可走范围的计算,用类折半查找和模糊行为确定了行动的选取和实施的目标,用逆遍历栈的方法确定一条到目标格的合适路径。关键词:战棋游戏;AI;算法中图分类号:TP18文献标识码:A文章编号:1005-5738(2011)02-102-05引 言游戏,作为一种新型的电子艺术手段,具有传统艺术手段(小说、戏剧、电影、美术等)所不具备的极强的人物代入感,深刻影响着游戏玩家的世界观、价值观甚至审美观。其在精神领域所体现的巨大褒贬作用 以及对于感情的宣泄效果是传统艺术所望尘莫及的。在我国实现现代化、宣扬社会主义文化的进程中,这 种新兴电子艺术所产生的巨大影响力是不可忽视的,因此应该不断提高目前国内业界相对欠缺或落后的 游戏理念、游戏算法以及各种相关的技术,使其为祖国的社会主义文化事业服务。本文描述了以弘扬反抗侵略、不屈外辱、保家卫国的伟大民族精神为主线的藏汉双语版创新战棋型 游戏“江孜保卫战”的基本算法设计和实现方法。战棋型游戏类似于传统棋类游戏,是玩家双方在“棋盘”上轮流控制自己的“棋子”进行战斗的一种电 脑游戏,其英文简写为“TRPG”1。不同的是,战棋游戏的“棋子”一般为具有一定属性的人物或生物,其“棋 盘”一般为一定行数和列数的网格,每个网格有一定属性。每个“棋子”具有行动优先级,在固定回合每方 只能控制固定的“棋子”行动。本文所指的战棋游戏作为抽象范例,只具有最基本的元素。1 相关术语1.1 单位:即通常棋类游戏里的“棋子”。1.2 格子:也称“格”,棋盘由一系列规则排列的格子组成,每个单位占据一个格子,并且以格为单位进行收稿日期:201 1 - 09- 25基金项目:201 0 年度国家大学生创新性实验计划项目“藏汉双语版创新战棋型游戏江孜保卫战”阶段性成果,项目号:1 01 06941 9第一作者简介:格桑多吉,男,藏族,西藏日喀则人,西藏大学工学院副教授,主要研究方向为藏文信息处理。1.3 移动力:单位拥有的移动能力,单位每移动一格,将消耗一定的移动力,也称“速度”。1.4 模糊行为:指电脑采取的行动并不固定,而是具有一定的随机性。在设定的几率(一般低于 20%)内电 脑将随机采取某种行为,反之则采取程序预先设定好的行为。2 AI 的算法实现及 C+代码2.1 整体思路A* 算法在人工智能中是一种典型的启发式搜索算法,是最好优先算法的一种2。利用改进 A* 算法实 现了战棋游戏 AI(Artificial Intelligence,简称 AI)设计。首先对战棋游戏基本元素进行了分析,接着 给出了算法设计的整体思路,然后设计并用 C+ 实现了战棋游戏基本元素的数据结构。用类广度优先算 法实现了对棋子可走范围的计算3,用类折半查找和模糊行为确定了选取的行动和行动实施的目标4,用 逆遍历栈的方法确定出一条到目标格的合适路径。下面给出了相关实现代码。用类广度优先遍历确定此单位的行走范围,将范围中的格入栈,并置 flag 为 1;分析范围内所有敌人的综合情况,利用类折半查找方式确定目标格和实施的动作;从目标格到当前所在格逆推出一条可走路径,并沿此路径走到目标格,实施动作。2.2 单位信息的存储 单位具有编号、移动力、生命值的属性,故采用结构体储存。其代码如下:typedef struct roleint row;/棋子所在格的行数inr column;/棋子所在格的列数int speed;/移动力role;role role1;/role1 为电脑所要控制行动的单位52.3 棋盘格子信息的存储 由于每个格子具有行数、列数、消耗多少移动力的属性,故采用二维结构体数组存储6。为了扩展单位可行走区域的方便,给每个格增加两个属性,即是否已扩展标志 flag 和是否有人标志 block。其代码如下:typedef struct mapTile int decrease;/存储消耗 int flag;/0 为未扩展int block; /0 为无人,其余为所在单位的编号map;map map100100;/设棋盘长宽都为 100 格,二维数组的维数为棋盘行数,维度为列数2.4 需要用到的其它数据结构的设计需要借助一个结构体的栈来存储当前已经扩展的格子。在 C+ 中,用结构体数组代替栈,并构造相应 的压栈函数 pushStack()和出栈函数 popStack()。相应代码如下:typedef struct cubeint s;/存储扩展到此格后剩余的移动力cube cube255;cube *top=&cube0;/栈顶指针/压栈函数void pushStack(int s,int r,int c) top.s=s; top.r=r; top.c=c;+top;/出栈函数void popStack()-top; top.s=0; top.r=0; top.c=0;2.5 用类广度优先遍历确定单位的行走范围 从单位所在格开始,按逆时针顺序(上、左、下、右)对周围的四个格进行遍历,若当前格满足以下三个条件:单位到达此格后移动力大于或等于 0;没有其他单位占据;当前格还没有遍历过。则将此格的信息入栈。当遍历完当前格的周围格子后,开始遍历下一栈元素的周围格,直到遍历完所有栈元素的周 围格,则此时栈中元素为单位所能到达的所有格,且这个格的 flag 标志等于遍历的层数。代码如下:int pr;/指向当前遍历的栈元素int mt;/用于存储需要遍历的最大格数switch(role1.speed)/设单位的最大速度为 3 case 1:mt=5; break; case 2: mt=12; break; case 3: mt=24; break;/单位所在格入栈pushStack(role1.speed, role1.row, role1.column);/开始广度优先遍历fot(pr=0;pr=0)/上方格可到达& cubepr.s-pushStack(role1.speed-mapcubepr.r-1cubepr.c.decrease, cubepr.r-1, cubepr.c);if(mapcubepr.rcubepr.c-1.block= =0 & mapcubepr.rcubepr.c-1.block = =0 & cubepr.s- mapcubepr.r cubepr.c-1.decrease=0)/左方格可到达/左方格入栈pushStack(role1.speed-mapcubepr.rcubepr.c-1.decrease, cubepr.r, cubepr.c-1);if(mapcubepr.r+1cubepr.c.block= =0 & mapcubepr.r+1 cubepr.c.block = =0 & cubepr.s- mapcubepr.r +1 cubepr.c.decrease=0)/下方格可到达/下方格入栈pushStack(role1.speed-mapcubepr.r+1cubepr.c.decrease, cubepr.r+1, cubepr.c);if (map cube pr.r cube pr.c +1.block = =0 & map cube pr.r cube pr.c +1.block = =0 & cube pr.s - mapcubepr.r cubepr.c+1.decrease=0)/右方格可到达/右方格入栈pushStack(role1.speed-mapcubepr.rcubepr.c+1.decrease, cubepr.r, cubepr.c+1);2.6 利用类折半查找以及模糊行为选定实施行动目标 由于此步取决于游戏设定情况,所以在此仅描述算法的思想,而不附带相关代码。先设置相应计算几率的函数和行动函数。行动函数是以当前单位攻击区域的综合情况为条件,与设定的一系列条件进行对比判断,来确定行动目标以及将采取的行动。若几率函数计算的值低于或等于设定的几率,则对一随机目 标实施随机行动,否则用行动函数确定目标并实施行动。如,当前遍历栈内共有 5 个单位,包括 3 个敌人 和 2 个友军。此时若几率函数得出的结果小于等于 20%,则随机选取 3 个敌人中的一个进行攻击;或随机 选取 2 个友军单位中的一个,随机进行医治或掩护动作;或不选取目标,进行防御。若几率函数得到的结 果大于 20%,则调用行动函数。行动函数的每一次条件判断都应至少去除一半的可能行动,故称这种方法 为类折半的行动查找。2.7 以逆推的方式确定当前格子到目标格子的路径“当前格”是指正在行动单位所在的格,“目标格”是指确定实施动作的对象单位所在格。逆推路径的 方式有很多,这里只提供一种典型的思路:在遍历栈中查找目标格,找到目标格。按逆时针方向依次查看目标格周围四个格子的 flag 标志,将 flag 标志为目标格 flag-1 的格子留下,并修改值为 10,将其余格出栈,并修改 flag 为 0。以找到的这个格为中心进行步骤 2。依次进行,直到找到 flag 为 1 的格子,而 这个格子正是单位所在的格子(即“当前格”),此时在栈中的所有剩余格即构成了一条从当前格到目标格 的路径。代码如下:int ar;/存储目标格的行数int ac;/存储目标格的列数/寻找目标格while(-top).r! =ar & (-top).c! =ac)popStack();/开始逆推遍历,注意 top 此时指向栈顶元素maptop.r-1top.c.flag=10;/置其 flag 为 10else if(maptop.rtop.c-1.flag=maptop.rtop.c.flag-1)/左方格满足条件maptop.rtop.c-1.flag=10;/置其 flag 为 10else if(maptop.r+1top.c.flag=maptop.rtop.c.flag-1)/下方格满足条件maptop.r+1top.c.flag=10;/置其 flag 为 10else if(maptop.rtop.c+1.flag=maptop.rtop.c.flag-1)/右方格满足条件maptop.rtop.c+1.flag=10;/置其 flag 为 10/将其余栈元素全部弹出while(map(-top).r(-top).c.flag! =10)popStack();沿着 flag 为 10 的格,走到目标格,并实施在 2.6 中已经确定好的行动。3 结 语综上所述,本文简要描述了一种由 A* 算法所演变的战棋游戏中基本 AI 算法的设计与实现方法。从实现效果来看,达到了预期要求,但是其中有很多不够完善的地方,有待继续改进。参考文献1 小龙, 废柴. 风暴机枪,战斗在召唤战棋游戏,模型与游戏的完美结合J. 模型世界, 2006(8).2 P. E. Hart, N . J. N ilsson, and B. R aphael. A formal basis for the heuristic determination of minimum cost paths in graphs J. IEEE Trans. Syst. Sci. and Cybernetics, SSC- 4(2):100- 107, 1968.3 关慧芬,师军,马继红.网络爬行技术研究J.郑州轻工业学院学报(自然科学版),2008,23(6).4 李伟青.凸多边形窗口线裁剪的折半查找算法J.计算机辅助设计与图形学学报 ,2005,17(5). 5 王浩. Visual C+ + 游戏开发经典案例详解M.北京:清华大学出版社,2010.6(美)Tony Gaddis.C+ + 图形与游戏编程基础M.周靖,译.北京:清华大学出版社,2010.AI Arithmetic Design and Practical Path of aWar-chess Game Gesang-Duoji WangYu-long Guo-Xin (School of Engineering, Tibet University, Lhasa 850000, Tibet)Abstract:In this paper, the improvement of AI designed war-chess game practiced by A* arithmetic was described by the analyzing basic elements of war-chess games and giving whole idea of arithmetic design. C+ language was used to practice the data structure of basic elements of the war-chess game. Priority search al gorithm was used to practice the walking r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论