L/O/G/O
人工智能在游戏中的应用
各位评委老师,同学们大家好,我是来自09数字媒体技术专业的王晓宇,今天讲的是“人工智能在游戏中的应用”指导教师是金小峰副教授。
*
国内外研究现状
游戏开发环境和机器人足球策略
游戏框架设计与攻守算法设计
游戏运行结果与分析
4
1
2
3
Contents
结论与参考文献
5
接下来我将从五个方面详细介绍我所做的游戏,以机器人足球仿真游戏作为研究对象,将其模拟、改变最终游戏化,设计和实现了游戏中角色的防守、进攻与辅助算法。
*
人工智能在游戏中的应用
国内外研究现状
游戏出现的早期,如上个世纪70年代之前的游戏,由于计算机硬件设备水平的限制。游戏的画面表现力很有限,游戏中的角色、物体往往是以一些符号、色块来表示。游戏中的物体通常没有任何的过程性控制,而是根据特定的简单规则运动[1]。例如第一个电子游戏《Pong》,它是由Atari公司于1972年开发的一款类似乒乓球的游戏,游戏中的“智能”仅仅只是当乒乓球到达屏幕边缘时按照镜面反射路线被反弹回来而已。
上个世纪80年代之后,一些业务型控制台和家用控制台游戏机出现,游戏的视觉表现能力和娱乐性得到了显著提升。例如任天堂公司于1985年出品的著名横版过关游戏《超级马里奥兄弟》,游戏中包含了许多以二维画面表示的各种各样的角色和物体,已经表现出了一定的智能行为。在游戏的开发过程中,一些开发人员发明了能够被特定类型的游戏使用的一些简单但高效、巧妙的算法,这些算法在业界内被广泛的流传,例如目标追踪与躲避,沿着特定的路线巡逻等等,一些方法甚至沿用至今。在这个阶段,角色的运动往往是按事先准备好的路线移动,玩家在多次玩同一个游戏的同一关后,往往会自觉或不自觉地总结出NPC的行动规律。然而,由于当时的画面和音效的也非常简单,这种总结规律的过程也成为了游戏的乐趣之一。这使得当时的游戏开发厂商和玩家都没有强烈提升游戏中AI水平的内在需求。
到了90年代后期,游戏中的3D图形技术被越来越广泛地应用。游戏的视觉表现力得到空前的提升,自由度和互动程度得到进一步提升,游戏中的虚拟世界日趋复杂,使得玩家对游戏性的要求越来越高。游戏设计人员也逐渐认识到人工智能技术在游戏中的重要性。相对简单的专一化的算法己无法满足日趋提高的要求,一些在计算机学科的成熟的数据结构和算法,例如图论、优化算法等,在计算机游戏中被大量应用。
这部分简单介绍,如果没有必要就简单略过
*
人工智能算法在游戏中的改变
游戏中的人工智能的开发和运用,不仅只是人工智能算法理论上的改进和实现,更是要将一个看上去合理的行为呈现给玩家。主要原因有以下几点:
游戏软件的基本需求之一的实时性限制了大计算量算法的应用。
来自于人工智能学科本身的发展的限制。
游戏中的角色并不是真正的智能体。
游戏中实现人工智能的主要目的,是为了让玩家产生真实的环境的错觉,并不是为了使求解问题的性能度量最大化,游戏中往往需要刻意的让NPC犯错。
国内外研究现状
1.游戏软件的基本需求之一的实时性限制了大计算量算法的应用。
2.来自于人工智能学科本身的发展的限制。虽然专家系统、模糊逻辑、人工神经元网络等方法渐渐为游戏AI开发者所考虑,但由于游戏中实际状况的复杂性以及大量与现实不符的设定,使得这些工具并不能很好地贴合游戏。
3.游戏中的角色并不是真正的智能体。例如,由于应用环境的相似性,游戏AI开发者常常大量借鉴机器人学的成果,然而即使是比较先进的机器人,它的机械复杂性也是非常有限的,传感器对环境的感知也被局限在很小的范围内,相比之下,骨架动画的艺术创作的复杂度几乎是无限的,对环境的感知也是如上帝般全知的。这些角色的基本行为更大程度上是美术工作者创造的结果的回放,甚至是通过动作捕捉(Motion Capture)技术所作的人类行为的记录。现有的人工智能技术水平很难与之匹配。
4.游戏中实现人工智能的主要目的,是为了让玩家产生真实的环境的错觉,并不是为了使求解问题的性能度量[2]最大化,游戏中往往需要刻意的让NPC犯错。例如,游戏中一个按照路径规划算法寻路的对手,玩家可能会认为它的寻路能力过于完美,不符合人类真实的情况。
*
机器人足球比赛
足球是一种大家非常喜爱的运动。让机器人去踢足球,听起来像是天方夜谭。现在的足球机器人还没有能够做到像我们人一样运动。据科学家估计,再等上五十年,即2050年左右才能达到在一个真的足球场上,像我们人类一样的比赛规则,一样的条件下进行比赛的程度。到那时可能电视转播的体育节目中不仅仅只是人与人的比赛,也会出现人与机器人、机器人与机器人的比赛。当然,这是猜测,到目前为止,现实中在国际上最具影响力的机器人足球赛事组织有FIRA国际机器人足球联合会和ROBOTCUP[3]国际机器人足球世界杯赛。
国内外研究现状
足球机器人的双腿就是机器人的左右轮(中间的第三个轮子只起稳定作用)。机器人的车体部分包括车轮、电机、车架、通讯模块等。由通讯模块接收上位机传来的命令,来驱动左右车轮以相应速度旋转,从而实现自由前进、后退、打转等动作。
*
游戏开发环境介绍
制作游戏首先需要考虑游戏的运行平台、开发平台、开发环境、开发语言、游戏引擎,引擎辅助工具。
游戏开发环境和足球策略
运行平台就是游戏在什么操作系统上运行。iOS是如今炙手可热的移动平台,我选用了它作为游戏的运行平台,它是由苹果公司开发的手持设备操作系统,最早于2007年1月9日的Macworld大会上公布。其最初设计是用于iPhone,后来陆续沿用到iPod touch、iPad以及Apple TV等苹果产品上。
IOS的开发平台主要有:MAC OS和windows OS。我选用MAC OS作为开发平台。它是苹果电脑公司为Mac系列个人电脑开发的专属操作系统,是全球第一个在商用领域成功的图形用户界面操作系统。
开发环境(Software Development Environment,SDE)是指在基本硬件和宿主软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件。IOS的开发环境主要是Xcode4。
我使用的是Cocos2D,它一个开源框架,主要用于构建2D游戏、演示程序和其他图形界面等交互应用。Cocos2d-iPhone是基于 GNU LGPL v3 license的。
CocosBuilder的功能主要有两个,一个是Cocos2D下简单快速进行精灵,层,场景布局。另一个是动画编辑
这部分简单介绍,如果没有必要就简单略过
*
基于敌方信息的足球策略
作为一款游戏,玩家自然是最重要的,因此我选择了基于敌方(对于电脑而言的敌方就是玩家所控制的那一方)信息的足球策略作为这个游戏的参考。
游戏开发环境和足球策略
1)电脑需要同时控制多个对象。机器人足球比赛是一个机器人足球队对抗另一个机器人足球队最终胜利。要求每个机器人足球队必须不仅要发挥每个机器人小车的能力,而且还要控制所有机器人小车互相协同、合作,充分发挥“集体的力量”。
2)赛场环境复杂。比赛场地上,小球运动和所有机器人小车的运动都是不断变化的。双方机器人足球队必须实时了解己方和敌方队员的队形、布局,动态判断出当前的比赛形势,实时调整、组织自己的队伍,进行比赛。
3)比赛信息不对称。由于敌方行为的不可预测性,每个机器人足球队得到的是一组不完全、不确定和不对称的信息。
4)对抗性。一方的机器人足球队要通过更密切的合作、配合来对抗另一方的机器人足球队。
队形是指针对比赛场上的态势,由多名机器人小车队员根据各自的角色不同而形成的不同占位[7]。策略系统在得到敌方各队员的位置信息后,再根据比赛场地不同区域的特殊作用,即可确定敌方相应的进攻队形或防守队形,进而针对不同的敌方队形做出己方策略的调整、实施,完成比赛对抗。
*
游戏主框架
游戏框架设计
游戏也好、应用程序也罢,与平时作业、考试中的程序不同,它们本身就是一个巨大的死循环,再由界面、菜单、场景等大小不同的死循环互相嵌套、互相包含、互相影响最终构成整个程序。本章就由最大的死循环开始,向内介绍我做的这款游戏的框架。
桌面操作系统不同,大多数的移动设备操作系统出于安全考虑,都会把所有非操作系统本身的应用程序放在一个模拟器中,或者限制在一定范围内运行。IOS也不例外,它把所有基于SDK开发的应用程序限制在一个被称为“沙盒”(sandbox)程序中[8],这个“沙盒”只允许IOS应用程序访问有限的文件系统、网络资源以及硬件设备、并且只能在特定区域内创建和修改文件。PS:关于sandbox是否讲看情况而定。
由于这个项目只有我一个人,所以我并没有足够的经历去制作一个很完善的菜单。游戏只有一个主菜单,Logo结束后会出现一段动画,游戏开始(“Play”)按钮也会随之出现,同时还会播放声音。接下来是循环动画,直到玩家按下开始按钮进入游戏。
在游戏主程序中只有场景的位置是固定不变的,因此我将游戏中的摇杆、按钮和时间放在场景中,这样能让它们的位置与屏幕相对不变并浮于最上层。
游戏中只有一个层,那就是足球场。游戏中所以有的精灵包括球员和球,它们的位置都是相对于球场的,所以它们都放在球场这个层上。由于球场的大小远大于屏幕,所以就需要让这个层不断移动,以便尽量让足球位于屏幕中间。
精灵主要有两种,一种是足球,另一种是球员。与之前主菜单一样,我先用CocosBuilder制作了相应的素材和动画。足球并没有什么动作,只要让它不会跑出足球场就行了,所以我在它的更新函数中增加了一些判断,当它位置大于球场边缘时,让它的速度反向,造成反弹的效果。球员是游戏中最重要的角色,我给它定义来三个状态,分别是移动、停留、踢球和被抢球,并给每个状态分配不同的动作。
*
游戏的问题与改进
游戏框架设计
在游戏制作之初,我使用了Box2D这个物理引擎,构建了刚体,定义了旋转、移动等动作。完全仿造微型机器人足球,制作了5对5,共10个刚体有向正方形来作为机器人,有制作了一个圆形刚体来作为足球,并定义了摩擦力。
第一,屏幕太小玩家几乎什么也看不清楚。
第二,对于玩家而言控制简直就是一场噩梦
第三,系统更本不知道应该让玩家来控制哪个角色。
第四,硬件达不到要求。
第一,整个赛场压缩在320*480分辨率、不足4寸的屏幕中,玩家几乎无法分辨小车的方向,足球小的几乎只有一个点,这样做什么也看不清楚。
第二,对于玩家而言控制简直就是一场噩梦,要想控制这样一个方块踢球就像开着一辆卡丁车踢球一样,别说是射门、传球了。
第三,系统更本不知道应该让玩家来控制哪个角色。方块与球接触几乎只有一瞬间的时间,因此无法选择控制与球接触的方块。如果让玩家控制距离球最近的角色,那当两个角色与球的距离差不多的时候,控制权就会在这两个角色之间来回转换。
第四,硬件达不到要求。碰撞的预测是需要消耗大量资源的,而游戏的刷新率通常是每秒60帧,最低不能低于每秒30帧,而当多个方块将要与球接触时,无法在1/30秒内完成预测计算并修正方块的角度和速度,游戏将会变得很卡。
*
游戏的问题与改进
游戏框架设计
第一,将赛场放大到原来的5倍
第二,重构了原有的物理效应
第三,用人物代替了原来的小方块。
第一,将赛场放大到原来的5倍,屏幕不再显示整个赛场,而是只显示赛场的一部分,这样角色和足球得以放大,可以清晰地显示给玩家。
第二,重构了原有的物理效应,不再使用Box2D物理引擎,而是为角色设定了,带球、踢球、抢球等动作。足球与角色之间只做碰撞检测,然后根据角色当前的状态来决定结果。用踢球代替了原来的通过碰撞来让球弹开。
第三,用人物代替了原来的小方块。由于取消了原有的物理效应,也就不再需要小方块的形状,为了让游戏美观些,我将小方块改成了人物角色。这样也能方便未来扩展的时候,让某些角色拥有与众不同的特点。
*
敌方策略
攻守算法设计
首先我进行了任务分配,将队伍分成了两个前锋,一个中锋,一个后卫和一个守门员。
基于敌方的足球策略首先是要分析敌方的位置信息,由于移动设备的性能有限,无法像桌面设备那样精确的考虑敌方的位置,所以我将球场如图3-5划分成了5个区域(球场区域的划分是根据角色正常活动范围而定的)。然后在每个角色更新的时候判断它们在哪个区域内,从而记录每个区域内敌人的数量。之所以选择在角色更新的时候判断,是因为游戏与比赛不同,比赛时各自电脑记录各自队员的信息,而在游戏中,同一个设备同时记录着两队的信息,并且这两对的信息是可以共用的,因此我在甲队角色更新时记录其位置信息,然后在乙队决策时使用这些信息,这样可以避免重复判断,提高效率。
*
敌方策略
攻守算法设计
由于每一个角色都是一个简单的智能体,所以每一个角色都有它自己的状态。
接收前进指示
踢球动作结束
接收踢球指示
被抢球
被抢球
被抢动作结束
未接到前进指示
由于每一个角色都是一个简单的智能体,所以每一个角色都有它自己的状态。我为每个角色定义了跑动、站立、踢球和被抢这4个状态,并设立了简单的状态转换机制
*
敌方策略
攻守算法设计
防守
进攻
得球
传球
射门
丢球
足球策略主要分为进攻和防守两部分,由于角色与小车不同,角色有明确的得球和丢球之分,所以我用球是否在己方球员手上来划分进攻还是防守。
进攻时,带球前锋会跑向区域0、1、2中敌人最少的区域,另一个前锋会跑向区域0、1、2中敌人次少的区域,并和带球前锋保持一定距离以方便传球。而中锋和后卫会判断区域3、4中是否有敌人,乳沟没有说明它们在全力防御,那中锋和后卫就会分别跑向前锋和中锋的活动范围,中锋会帮助前锋,后卫会留在原中锋活动范围内以方万一。
防守时,首先判断球的位置,它进入或接近谁的活动范围就由谁去抢,然后判断区域3和区域4的敌人数量,如果敌人数量小于等于2,说明敌人没有全力进攻,那前锋就没有必要回防。如果敌人数量等于3,那就让一名前锋回防。如果敌人数量等于4,那就全部回防。
*
敌方策略
攻守算法设计
接下来是要设计一些简单通用的动作判断,首先是带球,由于角色不存在转向动作,所以我简化了原有的实时路径规划。由于游戏刷新率在30帧/秒以上,转弯时只要给角色直线目标再下一刻改变就行。如图3-8,假设A要带球去B点,原本走的是路线Ⅰ,敌方C要拦截。由于Cocos2D中默认坐标原点在左下角,所以只要将C的坐标带入直线AB中就能通过结果的正负判断C在直线AB上面还是下面。然后根据C与A的距离,在A的移动中加入相应的向上或向下的分量。使A最终延路线Ⅱ前进。
然后是要防止球被抢断,游戏与实际情况不同,游戏中的一切都是完美地按照预先设定好的规律运行的,因此不需要通过模拟来得到结果。是否会被抢断的判断方法如图3- 7所示。假设A要传球给B,C要拦截,C是延线CD前进拦截,由于球一般跑的比人快,那AD除以CD的值越大C就越容易抢断成功,当∠CDA为直角时AD/CD的值最大,因此我只需要计算∠CAB的余切值,就能估计(之所以只用估计是因为偶尔还是要让玩家抢到球的,不然游戏就没有趣味了)球是否会被抢断。
*
我方策略
攻守算法设计
第一、角色互换。
第二、自动改变被控角色
第三、进攻跑位。
第四、传球、射门辅助。
与电脑方不同,玩家方有一个是被控角色。玩家的行为是完全不受控制和不可预测的。你不能希望玩家去配合NPC进行游戏,只能让NPC去配合玩家。因此我以基于敌方的足球策略为样例写了基于被控角色足球策略。
与上一节中的策略类似但是我做出了如下改进:
角色互换。玩家通常不会区分角色的任务,往往会控制着一个后卫冲到前锋的位置上,这个时候后卫就会空出来。因此我在策略开始前加了一层判断,如果后卫冲过了中场,那它就会变成中锋,原来的中锋就会变成后卫。
自动改变被控角色。由于屏幕是锁定以足球为中心的,因此在防守时玩家经常会不小心跑出屏幕外,或者距离球过远,那样玩家的重要性就会下降。所以当被控角色跑出屏幕外或离球过远时,就让离球最近的角色成为被控角色。
进攻跑位。玩家很难去配合NPC,这时就需要NPC去配合玩家。当进攻时,玩家往往不会跑向敌人最少的区域,这时剩下的角色就不再跑向敌人最少的区域,而是跑向与玩家相邻的区域,并且尽量保持与玩家之间没有敌方角色。
传球、射门辅助。没有人能像计算机那样精确地计算角度,玩家也不例外。因此我在踢球的按键响应时增加了几层判断,首先判断玩家位置,如果玩家进入敌方禁区且踢球方向与球门方向相同,那就会判断它往球门哪边踢能进球,然后让它踢向那个方向。如果不是,那就遍历玩家与所有己方角色的之间的角度与距离,让它踢向度之差小于15度且距离最小的角色,如果没有这样的角色就踢向度之差小于45度且距离最小的角色。再没有就只能按原方向将球踢出。
*
4游戏运行结果与分析
游戏运行结果与分析
设备名称 CPU性能 运行平均帧数
Ipod touch4 单核800Mhz 32
Ipod touch5 双核800Mhz 58
Ipad 单核1Ghz 38
The new Ipad 四核1Ghz 60
结论
结论与参考文献
移动设备作为一个优秀的游戏平台,正在被越来越多的游戏制作者所关注。本次研究主要是对现实游戏化和人工智能为移动设备改进的一次尝试。设计和实现了:
以机器人足球为原型制作了一个足球游戏,并对其进行了修改使其更加符合一个游戏。
将一个桌面计算机的机器人足球策略进行修改,使之能为智能移动设备上的游戏服务。
以其为基础重构了一种足球策略,使之为玩家服务,提升游戏性。
但是仍然存在一些不足之处:
由于把重心放在了人工智能的应用上,没有为游戏制作完整的UI界面。因此在接下来的时间里,我将为游戏制作完整的主菜单、设置等界面。
游戏策略算法过于单一,应加入多个队伍供玩家选择。
可以增加可替换资源,使每个队伍都有不同的难度(策略),并可方便的替换。
主要参考文献
结论与参考文献
[1]. Russel, Stuart J, peter Norvig. Artificial Intelligence: A Modern Approach.Prentice Hall,2002.
[2]. HARVEY J, CHENG C, MICHAELSON D. High level design of a MiroSot simulator [J]. Micro-Robot World Cup Soccer Tournament Proceedings, 1996,10(3): 8-10.
[3]. Dave Mark, Jack Nutting, Jeff LaMarche 著, 毛姝雯, 漆振, 杨越, 孙文磊 译,iOS5基础教程,人民邮电出版社,2012年9月1日: 1-2.
L/O/G/O
*
各位评委老师,同学们大家好,我是来自09数字媒体技术专业的王晓宇,今天讲的是“人工智能在游戏中的应用”指导教师是金小峰副教授。
*
接下来我将从五个方面详细介绍我所做的游戏,以机器人足球仿真游戏作为研究对象,将其模拟、改变最终游戏化,设计和实现了游戏中角色的防守、进攻与辅助算法。
*
这部分简单介绍,如果没有必要就简单略过
*
1.游戏软件的基本需求之一的实时性限制了大计算量算法的应用。
2.来自于人工智能学科本身的发展的限制。虽然专家系统、模糊逻辑、人工神经元网络等方法渐渐为游戏AI开发者所考虑,但由于游戏中实际状况的复杂性以及大量与现实不符的设定,使得这些工具并不能很好地贴合游戏。
3.游戏中的角色并不是真正的智能体。例如,由于应用环境的相似性,游戏AI开发者常常大量借鉴机器人学的成果,然而即使是比较先进的机器人,它的机械复杂性也是非常有限的,传感器对环境的感知也被局限在很小的范围内,相比之下,骨架动画的艺术创作的复杂度几乎是无限的,对环境的感知也是如上帝般全知的。这些角色的基本行为更大程度上是美术工作者创造的结果的回放,甚至是通过动作捕捉(Motion Capture)技术所作的人类行为的记录。现有的人工智能技术水平很难与之匹配。
4.游戏中实现人工智能的主要目的,是为了让玩家产生真实的环境的错觉,并不是为了使求解问题的性能度量[2]最大化,游戏中往往需要刻意的让NPC犯错。例如,游戏中一个按照路径规划算法寻路的对手,玩家可能会认为它的寻路能力过于完美,不符合人类真实的情况。
*
足球机器人的双腿就是机器人的左右轮(中间的第三个轮子只起稳定作用)。机器人的车体部分包括车轮、电机、车架、通讯模块等。由通讯模块接收上位机传来的命令,来驱动左右车轮以相应速度旋转,从而实现自由前进、后退、打转等动作。
*
这部分简单介绍,如果没有必要就简单略过
*
1)电脑需要同时控制多个对象。机器人足球比赛是一个机器人足球队对抗另一个机器人足球队最终胜利。要求每个机器人足球队必须不仅要发挥每个机器人小车的能力,而且还要控制所有机器人小车互相协同、合作,充分发挥“集体的力量”。
2)赛场环境复杂。比赛场地上,小球运动和所有机器人小车的运动都是不断变化的。双方机器人足球队必须实时了解己方和敌方队员的队形、布局,动态判断出当前的比赛形势,实时调整、组织自己的队伍,进行比赛。
3)比赛信息不对称。由于敌方行为的不可预测性,每个机器人足球队得到的是一组不完全、不确定和不对称的信息。
4)对抗性。一方的机器人足球队要通过更密切的合作、配合来对抗另一方的机器人足球队。
队形是指针对比赛场上的态势,由多名机器人小车队员根据各自的角色不同而形成的不同占位[7]。策略系统在得到敌方各队员的位置信息后,再根据比赛场地不同区域的特殊作用,即可确定敌方相应的进攻队形或防守队形,进而针对不同的敌方队形做出己方策略的调整、实施,完成比赛对抗。
*
桌面操作系统不同,大多数的移动设备操作系统出于安全考虑,都会把所有非操作系统本身的应用程序放在一个模拟器中,或者限制在一定范围内运行。IOS也不例外,它把所有基于SDK开发的应用程序限制在一个被称为“沙盒”(sandbox)程序中[8],这个“沙盒”只允许IOS应用程序访问有限的文件系统、网络资源以及硬件设备、并且只能在特定区域内创建和修改文件。PS:关于sandbox是否讲看情况而定。
由于这个项目只有我一个人,所以我并没有足够的经历去制作一个很完善的菜单。游戏只有一个主菜单,Logo结束后会出现一段动画,游戏开始(“Play”)按钮也会随之出现,同时还会播放声音。接下来是循环动画,直到玩家按下开始按钮进入游戏。
在游戏主程序中只有场景的位置是固定不变的,因此我将游戏中的摇杆、按钮和时间放在场景中,这样能让它们的位置与屏幕相对不变并浮于最上层。
游戏中只有一个层,那就是足球场。游戏中所以有的精灵包括球员和球,它们的位置都是相对于球场的,所以它们都放在球场这个层上。由于球场的大小远大于屏幕,所以就需要让这个层不断移动,以便尽量让足球位于屏幕中间。
精灵主要有两种,一种是足球,另一种是球员。与之前主菜单一样,我先用CocosBuilder制作了相应的素材和动画。足球并没有什么动作,只要让它不会跑出足球场就行了,所以我在它的更新函数中增加了一些判断,当它位置大于球场边缘时,让它的速度反向,造成反弹的效果。球员是游戏中最重要的角色,我给它定义来三个状态,分别是移动、停留、踢球和被抢球,并给每个状态分配不同的动作。
*
第一,整个赛场压缩在320*480分辨率、不足4寸的屏幕中,玩家几乎无法分辨小车的方向,足球小的几乎只有一个点,这样做什么也看不清楚。
第二,对于玩家而言控制简直就是一场噩梦,要想控制这样一个方块踢球就像开着一辆卡丁车踢球一样,别说是射门、传球了。
第三,系统更本不知道应该让玩家来控制哪个角色。方块与球接触几乎只有一瞬间的时间,因此无法选择控制与球接触的方块。如果让玩家控制距离球最近的角色,那当两个角色与球的距离差不多的时候,控制权就会在这两个角色之间来回转换。
第四,硬件达不到要求。碰撞的预测是需要消耗大量资源的,而游戏的刷新率通常是每秒60帧,最低不能低于每秒30帧,而当多个方块将要与球接触时,无法在1/30秒内完成预测计算并修正方块的角度和速度,游戏将会变得很卡。
*
第一,将赛场放大到原来的5倍,屏幕不再显示整个赛场,而是只显示赛场的一部分,这样角色和足球得以放大,可以清晰地显示给玩家。
第二,重构了原有的物理效应,不再使用Box2D物理引擎,而是为角色设定了,带球、踢球、抢球等动作。足球与角色之间只做碰撞检测,然后根据角色当前的状态来决定结果。用踢球代替了原来的通过碰撞来让球弹开。
第三,用人物代替了原来的小方块。由于取消了原有的物理效应,也就不再需要小方块的形状,为了让游戏美观些,我将小方块改成了人物角色。这样也能方便未来扩展的时候,让某些角色拥有与众不同的特点。
*
首先我进行了任务分配,将队伍分成了两个前锋,一个中锋,一个后卫和一个守门员。
基于敌方的足球策略首先是要分析敌方的位置信息,由于移动设备的性能有限,无法像桌面设备那样精确的考虑敌方的位置,所以我将球场如图3-5划分成了5个区域(球场区域的划分是根据角色正常活动范围而定的)。然后在每个角色更新的时候判断它们在哪个区域内,从而记录每个区域内敌人的数量。之所以选择在角色更新的时候判断,是因为游戏与比赛不同,比赛时各自电脑记录各自队员的信息,而在游戏中,同一个设备同时记录着两队的信息,并且这两对的信息是可以共用的,因此我在甲队角色更新时记录其位置信息,然后在乙队决策时使用这些信息,这样可以避免重复判断,提高效率。
*
由于每一个角色都是一个简单的智能体,所以每一个角色都有它自己的状态。我为每个角色定义了跑动、站立、踢球和被抢这4个状态,并设立了简单的状态转换机制
*
进攻时,带球前锋会跑向区域0、1、2中敌人最少的区域,另一个前锋会跑向区域0、1、2中敌人次少的区域,并和带球前锋保持一定距离以方便传球。而中锋和后卫会判断区域3、4中是否有敌人,乳沟没有说明它们在全力防御,那中锋和后卫就会分别跑向前锋和中锋的活动范围,中锋会帮助前锋,后卫会留在原中锋活动范围内以方万一。
防守时,首先判断球的位置,它进入或接近谁的活动范围就由谁去抢,然后判断区域3和区域4的敌人数量,如果敌人数量小于等于2,说明敌人没有全力进攻,那前锋就没有必要回防。如果敌人数量等于3,那就让一名前锋回防。如果敌人数量等于4,那就全部回防。
*
接下来是要设计一些简单通用的动作判断,首先是带球,由于角色不存在转向动作,所以我简化了原有的实时路径规划。由于游戏刷新率在30帧/秒以上,转弯时只要给角色直线目标再下一刻改变就行。如图3-8,假设A要带球去B点,原本走的是路线Ⅰ,敌方C要拦截。由于Cocos2D中默认坐标原点在左下角,所以只要将C的坐标带入直线AB中就能通过结果的正负判断C在直线AB上面还是下面。然后根据C与A的距离,在A的移动中加入相应的向上或向下的分量。使A最终延路线Ⅱ前进。
然后是要防止球被抢断,游戏与实际情况不同,游戏中的一切都是完美地按照预先设定好的规律运行的,因此不需要通过模拟来得到结果。是否会被抢断的判断方法如图3- 7所示。假设A要传球给B,C要拦截,C是延线CD前进拦截,由于球一般跑的比人快,那AD除以CD的值越大C就越容易抢断成功,当∠CDA为直角时AD/CD的值最大,因此我只需要计算∠CAB的余切值,就能估计(之所以只用估计是因为偶尔还是要让玩家抢到球的,不然游戏就没有趣味了)球是否会被抢断。
*
与上一节中的策略类似但是我做出了如下改进:
角色互换。玩家通常不会区分角色的任务,往往会控制着一个后卫冲到前锋的位置上,这个时候后卫就会空出来。因此我在策略开始前加了一层判断,如果后卫冲过了中场,那它就会变成中锋,原来的中锋就会变成后卫。
自动改变被控角色。由于屏幕是锁定以足球为中心的,因此在防守时玩家经常会不小心跑出屏幕外,或者距离球过远,那样玩家的重要性就会下降。所以当被控角色跑出屏幕外或离球过远时,就让离球最近的角色成为被控角色。
进攻跑位。玩家很难去配合NPC,这时就需要NPC去配合玩家。当进攻时,玩家往往不会跑向敌人最少的区域,这时剩下的角色就不再跑向敌人最少的区域,而是跑向与玩家相邻的区域,并且尽量保持与玩家之间没有敌方角色。
传球、射门辅助。没有人能像计算机那样精确地计算角度,玩家也不例外。因此我在踢球的按键响应时增加了几层判断,首先判断玩家位置,如果玩家进入敌方禁区且踢球方向与球门方向相同,那就会判断它往球门哪边踢能进球,然后让它踢向那个方向。如果不是,那就遍历玩家与所有己方角色的之间的角度与距离,让它踢向度之差小于15度且距离最小的角色,如果没有这样的角色就踢向度之差小于45度且距离最小的角色。再没有就只能按原方向将球踢出。
*
*