GameplayKit 命名空间
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
GameKit 命名空间为高级游戏玩法机制(例如寻路、规则引擎和 AI 对手)提供类。
类
结构
GKBox |
轴对齐的矩形三维框。 |
GKQuad |
GameKit 命名空间为高级游戏玩法机制(例如寻路、规则引擎和 AI 对手)提供类。 |
GKTriangle |
GameKit 命名空间为高级游戏玩法机制(例如寻路、规则引擎和 AI 对手)提供类。 |
接口
IGKAgentDelegate |
表示所需方法的接口 ((如果协议 GKAgentDelegate有任何) )。 |
IGKGameModel |
当前游戏状态。 与 GKMinMaxStrategist结合使用特别有用。 |
IGKGameModelPlayer |
游戏的唯一标识玩家。 开发人员必须实现 GetPlayerId(IGKGameModelPlayer)。 |
IGKGameModelUpdate |
有效的游戏移动。 将有效 IGKGameModel 转换为有效后续状态所需的最小数据。 |
IGKRandom |
用于 GameplayKit 伪随机数生成器的接口。 |
IGKSceneRootNodeType |
GameKit 命名空间为高级游戏玩法机制(例如寻路、规则引擎和 AI 对手)提供类。 |
IGKStrategist |
游戏策略师 (AI) 界面。 |
枚举
GKMeshGraphTriangulationMode |
包含有关如何在 中 GKMeshGraph<NodeType>生成节点的选项。 |
GKRTreeSplitStrategy |
GameKit 命名空间为高级游戏玩法机制(例如寻路、规则引擎和 AI 对手)提供类。 |
注解
在 iOS 9 中引入的 GameKit 为高级游戏玩机制提供类,例如寻路、规则引擎 (模糊和经典) ,以及以 形式 GKMinMaxStrategist预生成的 AI 对手。
AI 对手
最小定理,约翰·冯·诺伊曼在1928年首次提出,认为在具有有限策略的两人零和游戏中,存在一些最佳发挥 (或发挥) ,同时最大化当前玩家的预期值,并最小化对方玩家的预期值。 换句话说,在这样的游戏中,有一个“最好的移动” (,当然,即使最好的移动可能导致输球或平局,这取决于游戏的状态) 。
GameplayKit 在其 GKMinMaxStrategist 类和相关类中实现 minimax 算法, (特别 GKGameModel) 。 GKMinMaxStrategist是 minimax 算法的优化版本,它有效地使用内存并分析终端节点处的搜索树,但开发人员应该知道该算法的成本可能很高:minimax 算法的时间效率是O(b^m)
b
单个向前看“ply”中的状态数,是m
搜索 (的层数,请参阅 P:MonoTouch>GameplayKit.GKMinMaxStrategist.MaxLookAheadDepth) 。 算法的空间效率为 O(m)
。
最小定理适用于大量的游戏,从小游戏,如尼姆和蒂克塔-塔-图,到复杂的游戏,如国际象棋和围棋。 然而,象棋和围棋等游戏有很多可能的游戏状态和成本,以至于计算最佳动作的费用很快就会变成天文数字。 即使在此类情况下, GKMinMaxStrategist 也可用于评估数百或数千个移动,如果开发人员能够准确地对给定游戏状态的强项或弱项进行编程估计,则会产生强大的对手。
GKMinMaxStrategist开发人员不需要对 进行子类化。 相反,开发人员实现三个接口,并将这些接口传递给 GKMinMaxStrategist:
类 | 目的 |
---|---|
IGKGameModel | 开发人员实现此接口是为了对游戏及其当前状态进行建模。 例如,在棋盘游戏中,这通常是棋盘和所有部分,以及对活动玩家的引用。 此外,如果该类要与 一起使用GKMinMaxStrategist,则此类必须实现描述 (M*) 的函数,并按照 (、、 IsLossGetScore) 的可取性IsWin对其进行评估。 |
IGKGameModelUpdate | 此类描述游戏“移动”,并包含足够的信息,用于在当前状态和有效新状态之间转换 IGKGameModel 。 此类可能需要 GKMinMaxStrategist数千个实例,因此开发人员应注意使其轻量级。 |
IGKGameModelPlayer | 依赖于 GKMinMaxStrategistM:GameplayKit.IGKGameModelPlayer.GetPlayerID*) 的值来区分玩家。 |
的GKMinMaxStrategistGetBestMove键方法是 。 调用此方法时,将发生以下调用序列:
首先, IGKGameModelPlayer 检索对象。 然后,从当前游戏状态开始,虽然 ply 深度小于 MaxLookAheadDepth,但 GameKit.GKMinMaxStrategist.GetGameModelUpdates*将返回一组来自当前状态的合法可能移动。 然后,对于每个移动,可能需要 GKMinMaxStrategist 分配新内存;如果是,则调用 M:GameplayKit.GKMinMaxStrategist.Copy* 。 然后,在由 管理的许多GKGameModel对象之一上,通过调用 SetGameModel 和 *来执行潜在的移动。GKMinMaxStrategist
然后, GKMinMaxStrategist 通过调用 、首先 IsWin 和 IsLoss来评估每个潜在移动。 如果其中任一方法返回 true
,则会 GKMinMaxStrategist 将该游戏状态标记为终端节点,并且不会在以后的层中尝试进一步调查它。 但是,如果两种方法都不返回 true
,则调用方法 M:GameplayKit.GKGameModel_Extensions.Score* 。
开发人员应编写 M:GameplayKit.GKGameModel_Extensions.Score* 方法,以返回介于 (-16777216) 和 MaxScore (+16777216) 之间的MinScore值。 值越高表示更适合 GetActivePlayer的游戏状态。 在可以搜索IsWin整个游戏树的简单游戏中,M IsLosstrue
MaxLookAheadDepthM:GameplayKit.GKGameModel_Extensions.Score* 方法可以只返回 0,因为 GKMinMaxStrategist 可以根据胜负移动计算最佳移动。 但是,这种情况很可能仅适用于相当简单的游戏,一般来说,创建性能良好的 GameplayKit.GKGameModel_Updates.Score* 函数需要游戏和编程专业知识。 在编程方面, M:GameplayKit.GKGameModel_Updates.Score* 方法在搜索游戏树期间多次调用,并且需要高效且准确。
开发人员应注意,GKMinMaxStrategist可能会分配 和 IGKGameModel 的IGKGameModelPlayer多个副本以及许多IGKGameModelUpdate对象。 开发人员应依赖于值,而不是引用、相等,并且当涉及到这些操作全局或静态状态的对象时,应小心谨慎。