GameplayKit 命名空間
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
GameKit 命名空間提供高階遊戲機制的類別,例如路徑定義、規則引擎和 AI 元素。
類別
結構
GKBox |
軸對齊矩形三維方塊。 |
GKQuad |
GameKit 命名空間提供高階遊戲機制的類別,例如路徑定義、規則引擎和 AI 元素。 |
GKTriangle |
GameKit 命名空間提供高階遊戲機制的類別,例如路徑定義、規則引擎和 AI 元素。 |
介面
IGKAgentDelegate |
如果通訊協定 GKAgentDelegate 有任何) ,則表示必要方法的介面 (。 |
IGKGameModel |
目前的遊戲狀態。 與 搭配 使用特別有用 GKMinMaxStrategist 。 |
IGKGameModelPlayer |
遊戲唯一識別的玩家。 開發人員必須實作 GetPlayerId(IGKGameModelPlayer) 。 |
IGKGameModelUpdate |
有效的遊戲移動。 將有效 IGKGameModel 轉換為有效後續狀態所需的最小資料。 |
IGKRandom |
GameKit 虛擬亂數產生器的介面。 |
IGKSceneRootNodeType |
GameKit 命名空間提供高階遊戲機制的類別,例如路徑定義、規則引擎和 AI 元素。 |
IGKStrategist |
遊戲策略 (AI) 的介面。 |
列舉
GKMeshGraphTriangulationMode |
保留如何在 中 GKMeshGraph<NodeType> 產生節點的選項。 |
GKRTreeSplitStrategy |
GameKit 命名空間提供高階遊戲機制的類別,例如路徑定義、規則引擎和 AI 元素。 |
備註
在 iOS 9 中引進,GameKit 提供高階遊戲機制的類別,例如路徑定義、規則引擎 (模糊和傳統) ,以及以 形式 GKMinMaxStrategist 預先建置的 AI 工具。
AI 系統
由 John von Neumann 在 1928 年第一次陳述的 minimax 定理,在具有有限策略的雙人、零總和遊戲中,有一些最佳的遊戲 (或播放) 同時最大化目前球員的預期值,並將相對球員的預期值降至最低。 換句話說,在這類遊戲中,「最佳移動」 (不過,即使最佳移動可能會導致遺失或系結,視遊戲的狀態而定) 。
GameKit 會在其 GKMinMaxStrategist 類別中實作 minimax 演算法,以及 (特別 GKGameModel) 的相關類別。 GKMinMaxStrategist是 minimax 演算法的優化版本,會有效率地使用記憶體,並在終端機節點剖析搜尋樹狀結構,但開發人員應該注意演算法的成本可能很高:minimax 演算法的時間效率是 O(b^m)
b
單一視角前 「ply」 中的狀態數目,而且 m
是搜尋的 plies 數目 (請參閱 P:MonoTouchGameKit.GKMinMaxStrategist.MaxLookAheadDepth >) 。 演算法的空間效率為 O(m)
。
minimax 定理適用于非常大量的遊戲,例如 Nim 和 Tic-Tac-Toe,到複雜的遊戲,例如 Chess 和 Go。 不過,象棋和 Go 等遊戲有許多可能的遊戲狀態和費力,計算最佳移動的成本會快速變成運動。 即使在這類情況下, GKMinMaxStrategist 也可以用來評估數百或數千次移動,而且,如果開發人員可以正確程式設計指定遊戲狀態的強度或弱點估計值,則會產生強式的優缺點。
GKMinMaxStrategist不需要由開發人員子類別化。 相反地,開發人員會實作三個介面,並將其傳遞至 GKMinMaxStrategist :
類別 | 用途 |
---|---|
IGKGameModel | 開發人員會實作此介面,以建立遊戲模型,而且它是目前的狀態。 例如,在棋盤遊戲中,這通常是棋盤和所有片段,以及作用中玩家的參考。 此外,如果要與 搭配 GKMinMaxStrategist 使用,這個類別必須實作描述可能移動的函式, ( *) ,並以可還原性 (IsWin 、 IsLoss 、 GetScore) 進行評估。 |
IGKGameModelUpdate | 這個類別描述遊戲「移動」,並包含足夠的資訊,以在目前狀態與有效的新狀態之間轉換 IGKGameModel 。 此類別可能需要 GKMinMaxStrategist 數千個實例,因此開發人員應該小心讓它變得輕量。 |
IGKGameModelPlayer | 依賴 GKMinMaxStrategist M:GameKit.IGKGameModelPlayer.GetPlayerID*的值,) 區分玩家。 |
的 GKMinMaxStrategistGetBestMove 索引鍵方法是 。 呼叫此方法時,會發生下列呼叫順序:
首先,會 IGKGameModelPlayer 擷取物件。 然後,從目前的遊戲狀態開始,而 ply 深度小於 MaxLookAheadDepth ,則 *會傳回一組合法的可能移動。 然後,針對每個移動,可能需要 GKMinMaxStrategist 配置新的記憶體;如果是,則會呼叫 * 。 然後,在 所管理的許多物件其中一個上,可能會執行移動, SetGameModel 並呼叫 和 *。 GKGameModelGKMinMaxStrategist
接著會 GKMinMaxStrategist 呼叫 、第一個 IsWin 和 IsLoss 來評估每個可能的移動。 如果上述任一方法傳 true
回 ,則會 GKMinMaxStrategist 將該遊戲狀態標示為終端節點,且不會嘗試在稍後進行進一步調查。 不過,如果兩種方法都傳回 true
,則會呼叫 M:GameplayKit.GKGameModel_Extensions.Score* 。
開發人員應該撰寫 GameplayKit.GKGameModel_Extensions.Score*方法,以傳回 (-16777216) 和 MaxScore (+16777216) 之間的 MinScore 值。 較高的值代表較適合 GetActivePlayer 的遊戲狀態。 在可以搜尋 IsWin 整個遊戲樹狀結構的簡單遊戲中,或 IsLoss 一律傳 MaxLookAheadDepth 回 true
,*方法可以直接傳回 0,因為 GKMinMaxStrategist 可以根據勝出和失去移動來計算最佳移動。 不過,這很可能在相當容易的遊戲中,而且一般而言,製作高效能 * 函式將需要遊戲遊戲和程式設計專業知識。 就程式設計而言, * 方法會在搜尋遊戲樹時多次呼叫,而且必須有效率且精確。
開發人員應該注意, GKMinMaxStrategist 可能會配置 和 IGKGameModel 的許多複本 IGKGameModelPlayer 以及許多 IGKGameModelUpdate 物件。 開發人員應該依賴價值,而不是參考、相等,而且應該在操作全域或靜態狀態的物件時小心。