Amazon GameLift
开发人员指南 (版本 )
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

FlexMatch, 规则集示例

FlexMatch, 规则集可以涵盖各种对战情况。以下示例符合 FlexMatch 配置结构和属性表达式语言。完整复制这些规则集或根据需要选择组件。

有关使用 FlexMatch 规则和规则集的更多信息,请参阅以下主题:

注意

当评估包含多个玩家的对战票证时,请求中的所有玩家都必须满足对战要求。

示例 1:创建两个势均力敌的玩家团队

此示例说明如何按照以下说明设置两个势均力敌的玩家对战团队。

  • 创建两个玩家团队。

    • 每个团队包含四到八个玩家。

    • 最终团队必须具有相同数量的玩家。

  • 附上玩家的技能水平 (如果未提供,则默认为 10)。

  • 选择与其他玩家技能水平相当的玩家。确保这两个团队的平均玩家技能在 10 点以内。

  • 如果未能快速填充对战游戏,则放宽玩家技能要求以在合理的时间内完成对战游戏。

    • 5 秒之后,扩大搜索范围以允许创建平均玩家技能在 50 点以内的团队。

    • 15 秒之后,扩大搜索范围以允许创建平均玩家技能在 100 点以内的团队。

使用此规则集的说明:

  • 此示例允许创建包含 4 到 8 位玩家的任何规模的团队 (但两个团队的规模必须相同)。对于在有效规模范围内的团队,对战构建器会尽量尝试匹配允许的最大玩家数量。

  • FairTeamSkill 规则集可确保根据玩家技能构建对战团队。要对每个新的潜在玩家评估此规则,FlexMatch, 会暂时将玩家加入团队并计算平均值。如果规则失败,则不会将潜在玩家添加到对战游戏。

{ "name": "aliens_vs_cowboys", "ruleLanguageVersion": "1.0", "playerAttributes": [{ "name": "skill", "type": "number", "default": 10 }], "teams": [{ "name": "cowboys", "maxPlayers": 8, "minPlayers": 4 }, { "name": "aliens", "maxPlayers": 8, "minPlayers": 4 }], "rules": [{ "name": "FairTeamSkill", "description": "The average skill of players in each team is within 10 points from the average skill of all players in the match", "type": "distance", // get skill values for players in each team and average separately to produce list of two numbers "measurements": [ "avg(teams[*].players.attributes[skill])" ], // get skill values for players in each team, flatten into a single list, and average to produce an overall average "referenceValue": "avg(flatten(teams[*].players.attributes[skill]))", "maxDistance": 10 // minDistance would achieve the opposite result }, { "name": "EqualTeamSizes", "description": "Only launch a game when the number of players in each team matches, e.g. 4v4, 5v5, 6v6, 7v7, 8v8", "type": "comparison", "measurements": [ "count(teams[cowboys].players)" ], "referenceValue": "count(teams[aliens].players)", "operation": "=" // other operations: !=, <, <=, >, >= }], "expansions": [{ "target": "rules[FairTeamSkill].maxDistance", "steps": [{ "waitTimeSeconds": 5, "value": 50 }, { "waitTimeSeconds": 15, "value": 100 }] }] }

示例 2:创建水平不对等的团队(猎人对战怪物)

此示例描述了一组玩家搜捕单个怪物的游戏模式。玩家可以选择猎人或怪物角色。猎人指定他们希望对战的怪物的最低技能水平。可随时间推移放宽猎人团队的最小规模以完成对战游戏。此方案规定了以下说明:

  • 创建一个包含五个猎人的团队。

  • 创建一个包含单个怪物的团队。

  • 包含以下玩家属性:

    • 玩家的技能水平 (如果未提供,则默认为 10)。

    • 玩家首选的怪物技能水平 (如果未提供,则默认为 10)。

    • 玩家是否想成为怪物 (如果未提供,则默认为 0 或 false)。

  • 根据以下条件选择将成为怪物的玩家:

    • 玩家必须请求怪物角色。

    • 玩家必须满足或超过已添加到猎人团队的玩家的首选最高技能水平。

  • 根据以下条件选择将加入猎人团队的玩家:

    • 请求怪物角色的玩家无法加入猎人团队。

    • 如果怪物角色已填充,玩家必须要有低于建议怪物技能的怪物技能水平。

  • 如果对战游戏未快速填满,则放宽猎人团队的最小规模,如下所示:

    • 30 秒后,允许启动猎人团队只包含四个玩家的游戏。

    • 60 秒后,允许启动猎人团队只包含三个玩家的游戏。

使用此规则集的说明:

  • 通过为猎人和怪物分别创建两个单独的团队,您可以根据不同的条件评估团队成员。

{ "name": "players_vs_monster_5_vs_1", "ruleLanguageVersion": "1.0", "playerAttributes": [{ "name": "skill", "type": "number", "default": 10 },{ "name": "desiredSkillOfMonster", "type": "number", "default": 10 },{ "name": "wantsToBeMonster", "type": "number", "default": 0 }], "teams": [{ "name": "players", "maxPlayers": 5, "minPlayers": 5 }, { "name": "monster", "maxPlayers": 1, "minPlayers": 1 }], "rules": [{ "name": "MonsterSelection", "description": "Only users that request playing as monster are assigned to the monster team", "type": "comparison", "measurements": ["teams[monster].players.attributes[wantsToBeMonster]"], "referenceValue": 1, "operation": "=" },{ "name": "PlayerSelection", "description": "Do not place people who want to be monsters in the players team", "type": "comparison", "measurements": ["teams[players].players.attributes[wantsToBeMonster]"], "referenceValue": 0, "operation": "=" },{ "name": "MonsterSkill", "description": "Monsters must meet the skill requested by all players", "type": "comparison", "measurements": ["avg(teams[monster].players.attributes[skill])"], "referenceValue": "max(teams[players].players.attributes[desiredSkillOfMonster])", "operation": ">=" }], "expansions": [{ "target": "teams[players].minPlayers", "steps": [{ "waitTimeSeconds": 30, "value": 4 },{ "waitTimeSeconds": 60, "value": 3 }] }] }

示例 3:设置团队要求和延迟限制

此示例说明如何设置三个具有同等对战水平的玩家团队,并为团队应用规则集,而不是为每个玩家应用规则集。它还会设置所有玩家的最大延迟。随着时间的推移可以放宽延迟最大值以完成对战游戏。此方案规定了以下说明:

  • 创建三个玩家团队。

    • 每个团队包含三到五个玩家。

    • 最终团队必须包含数量相同或基本相同的玩家 (一个团队中)。

  • 包含以下玩家属性:

    • 玩家的技能水平 (如果未提供,则默认为 10)。

    • 玩家的人物角色 (如果未提供,则默认为“peasant”)。

  • 选择与对战游戏中其他玩家技能水平相当的玩家。

    • 确保每个团队的平均玩家技能在 10 点以内。

  • 将团队数量限制为“medic”角色的以下数量:

    • 整个对战游戏最多可以包含 5 个医生。

  • 只有对战游戏玩家才有最多 50 毫秒的延迟。

  • 如果对战游戏未快速填满,则放宽玩家的延迟要求,如下所示:

    • 10 秒之后,允许将玩家的延迟时间值增加到 100 毫秒。

    • 20 秒之后,允许将玩家的延迟时间值增加到 150 毫秒。

使用此规则集的说明:

  • 规则集可确保根据玩家技能构建对战团队。为评估 FairTeamSkill 规则,FlexMatch 会暂时将潜在玩家加入团队,计算团队中玩家的平均技能水平,并将其与两个团队中玩家的平均技能水平进行比较。如果规则失败,则不会将潜在玩家添加到对战游戏。

  • 团队和对战游戏级别的要求 (医生总数) 通过一组规则实现。此规则类型会获取所有玩家的角色属性列表,并针对最大数量进行检查。使用 flatten 为所有团队中的所有玩家创建列表。

  • 根据延迟进行评估时,请注意以下几点:

    • 延迟数据在对战请求中作为玩家对象的一部分提供。它不是玩家属性,因此无需列出。

    • 对战构建器按区域评估延迟。延迟高于最大延迟的任何区域都将被忽略。要让对战游戏接受,玩家必须至少有一个区域的延迟低于最大延迟。

    • 如果对战请求忽略一个或多个玩家的延迟数据,则会拒绝所有对战游戏的请求。

{ "name": "three_team_game", "ruleLanguageVersion": "1.0", "playerAttributes": [{ "name": "skill", "type": "number", "default": 10 },{ "name": "character", "type": "string_list", "default": [ "peasant" ] }], "teams": [{ "name": "red", "minPlayers": 3, "maxPlayers": 5 }, { "name": "blue", "minPlayers": 3, "maxPlayers": 5 }, { "name": "green", "minPlayers": 3, "maxPlayers": 5 }], "rules": [{ "name": "FairTeamSkill", "description": "The average skill of players in each team is within 10 points from the average skill of players in the match", "type": "distance", // get players for each team, and average separately to produce list of 3 "measurements": [ "avg(teams[*].players.attributes[skill])" ], // get players for each team, flatten into a single list, and average to produce overall average "referenceValue": "avg(flatten(teams[*].players.attributes[skill]))", "maxDistance": 10 // minDistance would achieve the opposite result }, { "name": "CloseTeamSizes", "description": "Only launch a game when the team sizes are within 1 of each other. e.g. 3 v 3 v 4 is okay, but not 3 v 5 v 5", "type": "distance", "measurements": [ "max(count(teams[*].players))"], "referenceValue": "min(count(teams[*].players))", "maxDistance": 1 }, { "name": "OverallMedicLimit", "description": "Don't allow more than 5 medics in the game", "type": "collection", // This is similar to above, but the flatten flattens everything into a single // list of characters in the game. "measurements": [ "flatten(teams[*].players.attributes[character])"], "operation": "contains", "referenceValue": "medic", "maxCount": 5 }, { "name": "FastConnection", "description": "Prefer matches with fast player connections first", "type": "latency", "maxLatency": 50 }], "expansions": [{ "target": "rules[FastConnection].maxLatency", "steps": [{ "waitTimeSeconds": 10, "value": 100 }, { "waitTimeSeconds": 20, "value": 150 }] }] }

示例 4:使用显式排序以查找最佳对战游戏

此示例设置了包含三个玩家的两个团队的简单对战游戏。它介绍了如何使用显式排序规则才能尽快找到最佳对战游戏。这些规则会为对战票证预排序,以根据特定的关键要求创建最佳对战游戏。此方案根据以下说明实现:

  • 创建两个玩家团队。

  • 每个团队只包含三个玩家。

  • 包含以下玩家属性:

    • 经验等级 (如果未提供,则默认为 50)。

    • 首选游戏模式 (可以列出多个值) (如果未提供,则默认为“coop”和“deathmatch”)。

    • 首选游戏地图,包括地图名称和首选权重 (如果未提供,则默认使用 "defaultMap" 和权重 100)。

  • 设置预排序:

    • 根据与基准点玩家相同的游戏地图的首选项来对玩家排序。玩家可以有多个最喜欢的游戏地图,因此本示例使用首选项值。

    • 根据玩家与基准点玩家的经验等级的接近程度对玩家排序。采用这种排序方式,所有玩家在所有团队中的经验等级会尽可能地接近。

  • 所有团队中的所有玩家必须至少选择一个共同的游戏模式。

  • 所有团队中的所有玩家必须至少选择一个共同的游戏地图。

使用此规则集的说明:

  • 游戏地图排序采用与 mapPreference 属性值进行比较的绝对排序。它是规则集中优先采用的第一个排序方法。

  • 经验排序采用比较潜在玩家与基准点玩家之间的距离的距离排序。

  • 排序规则的顺序确定了每个排序的执行顺序。在这种情况下,玩家先按游戏地图首选项进行排序,然后按经验等级排序。

{ "name": "multi_map_game", "ruleLanguageVersion": "1.0", "playerAttributes": [{ "name": "experience", "type": "number", "default": 50 }, { "name": "gameMode", "type": "string_list", "default": [ "deathmatch", "coop" ] }, { "name": "mapPreference", "type": "string_number_map", "default": { "defaultMap": 100 } }, { "name": "acceptableMaps", "type": "string_list", "default": [ "defaultMap" ] }], "teams": [{ "name": "red", "maxPlayers": 3, "minPlayers": 3 }, { "name": "blue", "maxPlayers": 3, "minPlayers": 3 }], "rules": [{ // We placed this rule first since we want to prioritize players preferring the same map "name": "MapPreference", "description": "Favor grouping players that have the highest map preference aligned with the anchor's favorite", // This rule is just for sorting potential matches. We sort by the absolute value of a field. "type": "absoluteSort", // Highest values go first "sortDirection": "descending", // Sort is based on the mapPreference attribute. "sortAttribute": "mapPreference", // We find the key in the anchor's mapPreference attribute that has the highest value. // That's the key that we use for all players when sorting. "mapKey": "maxValue" }, { // This rule is second because any tie-breakers should be ordered by similar experience values "name": "ExperienceAffinity", "description": "Favor players with similar experience", // This rule is just for sorting potential matches. We sort by the distance from the anchor. "type": "distanceSort", // Lowest distance goes first "sortDirection": "ascending", "sortAttribute": "experience" }, { "name": "SharedMode", "description": "The players must have at least one game mode in common", "type": "collection", "operation": "intersection", "measurements": [ "flatten(teams[*].players.attributes[gameMode])"], "minCount": 1 }, { "name": "MapOverlap", "description": "The players must have at least one map in common", "type": "collection", "operation": "intersection", "measurements": [ "flatten(teams[*].players.attributes[acceptableMaps])"], "minCount": 1 }] }

示例 5:在多个玩家属性之间查找交集

此示例说明如何使用集合规则,在两个或更多玩家属性中查找交集。在处理集合时,您可以对单个属性使用 intersection 操作,并对多个属性使用 reference_intersection_count 操作。

为了说明这种方法,此示例会在对战游戏中根据玩家的角色首选项来评估玩家。该示例游戏是一个“混战”风格的游戏,对战游戏中的所有玩家都是对手。每个玩家需要 (1) 为自己选择一个角色,(2) 选择他们希望作为对手的角色。我们需要一个规则,该规则可确保对战游戏中的每位玩家所使用的角色都位于所有其他玩家的首选对手列表中。

该示例规则集描述了一个具有以下特征的对战游戏:

  • 团队结构:一个团队 5 个玩家

  • 玩家属性:

    • myCharacter:玩家的选定角色。

    • preferredOpponents:玩家希望作为对手的角色的列表。

  • 对战游戏规则:如果每个正在使用的角色都位于各个玩家的首选对手列表中,则潜在的对战游戏是可接受的。

为了实施该对战游戏规则,此示例使用具有以下属性值的集合规则:

  • 操作 – 使用 reference_intersection_count 操作来评估测量值中的每个字符串列表与参考值中的字符串列表的相交情况。

  • 测量值 – 使用 flatten 属性表达式来创建一个字符串列表的列表,其中每个字符串列表包含一个玩家的 myCharacter 属性值。

  • 参考值 – 使用 set_intersection 属性表达式创建所有 preferredOpponents 属性值的字符串列表,这些属性值对于对战游戏中的每个玩家是通用的。

  • 限制 – minCount 设置为 1,以确保每个玩家的选定角色(测量值中的一个字符串列表)匹配至少一个对所有玩家通用的首选对手。(参考值中的字符串)。

  • 扩展 – 如果对战游戏在 15 秒内未满员,则放松最小交集要求。

此规则的流程如下:

  1. 将一位玩家添加到潜在对战游戏。重新计算参考值 (字符串列表),以便包含与新玩家的首选对手列表的交集。重新计算测量值 (字符串列表的列表),以便将新玩家的选定角色作为新的字符串列表添加。

  2. Amazon GameLift 验证测量值 (玩家的选定角色) 中的每个字符串列表与参考值 (玩家的首选对手) 中的至少一个字符串相交。在本示例中,由于测量值中的每个字符串列表中仅包含一个值,因此交集为 0 或 1。

  3. 如果测量值中的任何字符串列表与参考值字符串列表不相交,则该规则失败,并且从潜在对战游戏中删除该新玩家。

  4. 如果对战游戏在 15 秒内未满员,则放弃对手匹配要求,以便在对战游戏中填满剩余的玩家位置。

{ "name": "preferred_characters", "ruleLanguageVersion": "1.0", "playerAttributes": [{ "name": "myCharacter", "type": "string_list" }, { "name": "preferredOpponents", "type": "string_list" }], "teams": [{ "name": "red", "minPlayers": 5, "maxPlayers": 5 }], "rules": [{ "description": "Make sure that all players in the match are using a character that is on all other players' preferred opponents list.", "name": "OpponentMatch", "type": "collection", "operation": "reference_intersection_count", "measurements": ["flatten(teams[*].players.attributes[myCharacter])"], "referenceValue": "set_intersection(flatten(teams[*].players.attributes[preferredOpponents]))", "minCount":1 }], "expansions": [{ "target": "rules[OpponentMatch].minCount", "steps": [{ "waitTimeSeconds": 15, "value": 0 }] }] }

示例 6:在所有玩家之间比较属性

此示例说明如何在一组玩家之间比较玩家属性。

该示例规则集描述了一个具有以下特征的对战游戏:

  • 团队结构:两个团队,每个团队一个玩家

  • 玩家属性:

    • gameMode:玩家选择的游戏类型 (如果未提供,则默认设置为“基于次序”)。

    • gameMap:玩家选择的游戏世界 (如果未提供,则默认设置为 1)。

    • character:玩家选择的角色 (无默认值,表示玩家必须指定角色)。

  • 对战游戏规则:匹配的玩家必须满足以下要求:

    • 玩家必须选择相同的游戏模式。

    • 玩家必须选择相同的游戏地图。

    • 玩家必须选择不同的角色。

为了实施该对战游戏规则,此示例使用比较规则来检查所有玩家的属性值。对于游戏模式和地图,该规则验证值是相同的。对于角色,该规则验证值是不同的。

{ "name": "", "ruleLanguageVersion": "1.0", "playerAttributes": [{ "name": "gameMode", "type": "string", "default": "turn-based" }, { "name": "gameMap", "type": "number", "default": 1 }, { "name": "character", "type": "number" }], "teams": [{ "name": "red", "minPlayers": 1, "maxPlayers": 1 }, { "name": "blue", "minPlayers": 1, "maxPlayers": 1 }], "rules": [{ "name": "SameGameMode", "description": "Only match players when they choose the same game type", "type": "comparison", "operation": "=", "measurements": ["flatten(teams[*].players.attributes[gameMode])"] }, { "name": "SameGameMap", "description": "Only match players when they're in the same map", "type": "comparison", "operation": "=", "measurements": ["flatten(teams[*].players.attributes[gameMap])"] }, { "name": "DifferentCharacter", "description": "Only match players when they're using different characters", "type": "comparison", "operation": "!=", "measurements": ["flatten(teams[*].players.attributes[character])"] }] }