Поделиться через


GameplayKit Пространство имен

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

Классы

GKAgent

Объект , GKComponent который может двигаться и имеет цели.

GKAgent2D

Объект , GKAgent движение которого ограничено двумя измерениями.

GKAgent3D

Трехмерный агент, который реагирует на цели.

GKAgentDelegate

Объект делегата, предоставляющий методы, связанные с синхронизацией состояния объекта GKAgent с внешними ограничениями, целями и представлениями.

GKAgentDelegate_Extensions

Методы расширения интерфейса IGKAgentDelegate для поддержки всех методов из GKAgentDelegate протокола.

GKARC4RandomSource

Случайный генератор на основе алгоритма ARC4. Часто хороший выбор.

GKBehavior

Коллекция GKGoal объектов и весов, вместе определяющих согласованное поведение игры.

GKBillowNoiseSource

Объект , GKCoherentNoiseSource выходные данные которого похожи на шум Перлина, но с более скругленными признаками.

GKCheckerboardNoiseSource

Объект , GKNoiseSource выходные данные которого состоят из чередующихся черных и белых квадратов.

GKCircleObstacle

Объект , GKObstacle определяемый расположением и радиусом.

GKCoherentNoiseSource

Объект , GKNoiseSource выходные данные которого изменяются плавно и непрерывно.

GKComponent

Абстрактный суперкласс для компонентов, включая GKAgent объекты, в архитектуре Entity-Component (см. примечания).

GKComponentSystem<TComponent>

Содержит GKComponent объекты определенного подтипа и периодически обновляет их.

GKCompositeBehavior

Объект , GKBehavior объединяющий другие GKBehavior объекты.

GKConstantNoiseSource

Объект , GKNoiseSource выходные данные которого являются одним значением.

GKCylindersNoiseSource

Объект , GKNoiseSource выходные данные которого состоят из концентрических цилиндрических оболочек. Подходит для текстур древесины.

GKDecisionNode

Элемент в GKDecisionTree.

GKDecisionTree

Дерево вопросов, ответов и действий.

GKEntity

Тип, состоящий из нескольких GKComponent объектов в архитектуре Entity-Component.

GKGameModel

Описывает игровой процесс способом, который можно оптимизировать с помощью GKMinMaxStrategist.

GKGameModel_Extensions

Методы расширения интерфейса IGKGameModel для поддержки всех методов из GKGameModel протокола.

GKGameModelPlayer_Extensions

Методы расширения интерфейса IGKGameModelPlayer для поддержки всех методов из IGKGameModelPlayer протокола.

GKGaussianDistribution

Объект GKRandomDistribution , который создает гауссовское (нормальное) распределение.

GKGoal

Влияет на перемещение одного или нескольких GKAgent объектов.

GKGraph

Математический граф, используемый для навигации и определения пути.

GKGraphNode

Базовый класс для узлов в GKGraph.

GKGraphNode2D

Объект GKGraphNode , содержащий двухуровневую позицию с плавающей запятой.

GKGraphNode3D

Объект , GKGraphNode который существует в трехмерном пространстве.

GKGridGraph

Объект , GKGraph в котором перемещение ограничено целочисленной сеткой

GKGridGraphNode

Объект GKGraphNode , содержащий двухбайтовую целочисленную позицию.

GKHybridStrategist

Объект IGKStrategist , который сочетает в себе поиск монте-карло-дерева и локальный поиск через MinMax.

GKLinearCongruentialRandomSource

Быстрый GKRandomSource. Биты низкого порядка несколько менее случайны, чем в GKARC4RandomSource.

GKMersenneTwisterRandomSource

Медленный GKRandomSource с очень хорошей случайностью.

GKMeshGraph<NodeType>

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

GKMinMaxStrategist

Игровой ИИ, который оценивает потенциальные состояния игры, оценивает их и пытается максимизировать свой собственный счет, минимизируя своих противников.

GKMonteCarloStrategist

Стратег, который достигает решения, которое, вероятно, близко к оптимальному за детерминированное количество времени.

GKNoise

Использует для GKNoiseSource процедурного создания бесконечного трехмерного поля шума.

GKNoiseMap

Срезает конечный двумерный прямоугольник из бесконечного GKNoise трехмерного поля шума объекта.

GKNoiseSource

Абстрактный базовый класс для генераторов процедурного шума.

GKNSPredicateRule

Объект GKRule , использующий NSPredicate для определения того, следует ли вызывать это действие.

GKObstacle

Абстрактный класс, представляющий области, которые GKAgent объекты не могут пройти.

GKObstacleGraph

Объект , GKGraph который создает сеть заполнения пространства для представления, обеспечивая плавные, но неэффективные пути.

GKObstacleGraph<NodeType>

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

GKOctree<ElementType>

Структура данных, которая эффективно упорядочивает трехмерные элементы.

GKOctreeNode

Узел в GKOctree<ElementType>. Автоматически управляется с помощью объекта as GKOctree<ElementType> добавляются и удаляются.

GKPath

Содержит двухугольный путь, за которым может следовать GKAgent.

GKPerlinNoiseSource

Объект , GKCoherentNoiseSource создающий улучшенный шум Перлина.

GKPolygonObstacle

Объект GKObstacle с произвольно сложной фигурой.

GKQuadTree

Структура данных, которая эффективно упорядочивает объекты в двумерном пространстве.

GKQuadTreeNode

Узел в кваддереве.

GKRandomDistribution

Определяет распределение вероятностей. Этот класс определяет равномерное распределение (все значения одинаково вероятны), а подклассы GKGaussianDistribution и GKShuffledDistribution обеспечивают разные вероятности.

GKRandomSource

Базовый класс для генераторов псевдослучайных чисел, подходящих для игры. Не используйте в целях шифрования или безопасности.

GKRidgedNoiseSource

Объект , GKCoherentNoiseSource выходные данные которого похожи на шум Перлина, но с резкими границами.

GKRTree<ElementType>

Структура данных для эффективного поиска объектов, упорядоченных в двумерном пространстве.

GKRule

Один элемент, состоящий из предиката и действия, который представляет дискретное правило в GKRuleSystem.

GKRuleSystem

Поддерживает коллекцию GKRule объектов , активируя их соответствующим образом.

GKScene

Связывает объекты GameplayKit с spriteKit SKScene.

GKSCNNodeComponent

Объект , GKComponent который работает с SCNNode.

GKShuffledDistribution

Объект , GKRandomDistribution который перемешивает коллекцию таким образом, что делает последовательности похожих значений маловероятными (минимальные горячие и холодные полосы).

GKSKNodeComponent

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

GKSphereObstacle

Объект GKObstacle , представляющий собой непроходимый сферический том.

GKSpheresNoiseSource

Объект , GKNoiseSource выходные данные которого состоят из концентрических оболочек. Подходит для текстур древесины.

GKState

Абстрактный класс, представляющий дискретное состояние в GKStateMachine.

GKStateMachine

Содержит GKState объекты и управляет переходами между ними.

GKVoronoiNoiseSource

Объект , GKNoiseSource выходные данные которого разделяют пространство на ячейки, окружающие начальные точки. Подходит для кристаллических текстур.

NSArray_GameplayKit

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

SCNNode_GameplayKit

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

SKNode_GameplayKit

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

Структуры

GKBox

Прямоугольная трехмерная рамка, выровненная по оси.

GKQuad

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

GKTriangle

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

Интерфейсы

IGKAgentDelegate

Интерфейс, представляющий обязательные методы (если таковые есть) протокола GKAgentDelegate.

IGKGameModel

Текущее состояние игры. Особенно полезно в сочетании с GKMinMaxStrategist.

IGKGameModelPlayer

Уникальный игрок игры. Разработчики должны реализовать GetPlayerId(IGKGameModelPlayer).

IGKGameModelUpdate

Допустимый ход игры. Минимальные данные, необходимые для перехода допустимого IGKGameModel в допустимое последующее состояние.

IGKRandom

Интерфейс для генераторов псевдослучайных чисел Для GameplayKit.

IGKSceneRootNodeType

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

IGKStrategist

Интерфейс для игрового стратега (ИИ).

Перечисления

GKMeshGraphTriangulationMode

Содержит параметры создания узлов в GKMeshGraph<NodeType>.

GKRTreeSplitStrategy

Пространство имен GameKit предоставляет классы для высокоуровневых игровых механик, таких как поиск путей, обработчики правил и противники ИИ.

Комментарии

Представленный в iOS 9, GameKit предоставляет классы для высокоуровневых игровых механик, таких как pathfinding, обработчики правил (как нечеткие, так и классические), а также предварительно созданный противник ИИ в виде GKMinMaxStrategist.

Противник ИИ

Теорема minimax, впервые изложенная Джоном фон Нейманом в 1928 году, гласит, что в игре с двумя лицами с нулевой суммой, с конечными стратегиями, существует некоторая оптимальная игра (или игры), которая одновременно максимизирует ожидаемое значение для текущего игрока и минимизирует ожидаемое значение для противоположного игрока. Другими словами, в таких играх, есть "лучший ход" (хотя, конечно, даже лучший ход может привести к потере или галстук, в зависимости от состояния игры).

GameplayKit реализует алгоритм minimax в своем GKMinMaxStrategist классе и связанных классах (особенно GKGameModel). GKMinMaxStrategist— это оптимизированная версия алгоритма minimax, которая эффективно использует память и анализирует дерево поиска на конечных узлах, но разработчики должны знать, что алгоритм может быть дорогостоящим: эффективность времени алгоритма minimax — это O(b^m)b количество состояний в одном поиске "ply", а m — количество искомых объектов (смP:MonoTouch>GameplayKit.GKMinMaxStrategist.MaxLookAheadDepth). Эффективность пространства алгоритма — O(m).

Минимакс теорема применяется к очень большому количеству игр, от тривиальных, таких как Nim и Tic-Tac-Toe, до сложных игр, таких как шахматы и Go. Тем не менее, игры, такие как Шахматы и Go имеют так много возможных состояний игры и plies, что расходы на вычисление оптимального движения быстро становится астрономическим. Даже в таких случаях можно GKMinMaxStrategist использовать для оценки нескольких сотен или тысяч ходов и, если разработчик может точно запрограммировать оценку силы или слабости данного игрового состояния, произвести сильного противника.

Не GKMinMaxStrategist должен быть подкласс разработчиком. Скорее, разработчик реализует три интерфейса и передает их в GKMinMaxStrategist:

КлассНазначение
IGKGameModel Разработчики реализуют этот интерфейс для моделирования игры и ее текущего состояния. Например, в настольной игре это обычно будет доска и все части, а также ссылка на активного игрока. Кроме того, если он будет использоваться с GKMinMaxStrategist, этот класс должен реализовывать функции, описывающие потенциальные перемещения (M:GameplayKit.GKGameModule.GetGameModelUpdates*), и оценивать их с точки зрения желательности (IsWin, , IsLossGetScore).
IGKGameModelUpdate Этот класс описывает "перемещение" игры и содержит достаточно информации для перехода IGKGameModel между текущим состоянием и допустимым новым. Для работы может потребоваться GKMinMaxStrategistмножество тысяч экземпляров этого класса, поэтому разработчик должен позаботиться о том, чтобы сделать его упрощенным.
IGKGameModelPlayer Для GKMinMaxStrategist различения игроков использует значение M:GameplayKit.IGKGameModelPlayer.GetPlayer*).

Ключевой метод объекта GKMinMaxStrategistGetBestMove. При вызове этого метода происходит следующая последовательность вызовов:

IGKGameModelPlayer Сначала извлекаются объекты . Затем, начиная с текущего состояния игры, и хотя глубина ply меньше MaxLookAheadDepth, набор допустимых переходов из текущего состояния возвращается M:GameKit.GKMinMaxStrategist.GetGameModelUpdates*. Затем для каждого из этих шагов может потребоваться GKMinMaxStrategist выделить новую память; если это так, вызывается M:GameplayKit.GKMinMaxStrategist.Copy* . Затем для одного из многих GKGameModel объектов, которыми управляет GKMinMaxStrategist, выполняется потенциальное перемещение с помощью вызовов SetGameModel и M:GameplayKit.IGKGameModel.ApplyGameState*.

Затем GKMinMaxStrategist вычисляет каждое потенциальное перемещение путем вызова, сначала и IsWinIsLoss. Если любой из этих методов возвращает true, помечает GKMinMaxStrategist это состояние игры как конечный узел и не будет пытаться исследовать его далее в последующих plies. Если ни тот из методов не возвращает true, вызывается метод M:GameplayKit.GKGameModel_Extensions.Score* .

Разработчик должен написать метод M:GameplayKit.GKGameModel_Extensions.Score*, чтобы вернуть значение между MinScore (-16777216) и MaxScore (+16777216). Более высокие значения представляют состояния игры, которые лучше подходят для GetActivePlayer. В простых играх, где можно искать все дерево игры, так как или всегда возвращается true в MaxLookAheadDepth, метод M:GameplayKit.GKGameModel_Extensions.Score* может просто возвращать 0, так как GKMinMaxStrategist может вычислить лучший ход на основе выигрышных и проигрышных ходов.IsLossIsWin Однако это, скорее всего, будет происходить только в довольно простых играх, и, как правило, для создания хорошо производительной функции M:GameplayKit.GKGameModel_Updates.Score* потребуется как игровой, так и программный опыт. С точки зрения программирования метод M:GameplayKit.GKGameModel_Updates.Score* вызывается много раз во время поиска дерева игры и должен быть эффективным, а также точным.

Разработчики должны отметить, что GKMinMaxStrategist может выделить много копий IGKGameModelPlayer и , IGKGameModel а также много IGKGameModelUpdate объектов . Разработчики должны полагаться на значение, а не на ссылку, равенство и должны проявлять осторожность, когда дело доходит до этих объектов, управляющих глобальным или статическим состоянием.