Referencia: Uso de ordenación explícita para encontrar los mejores emparejamientos
Este ejemplo configura un emparejamiento sencillo con dos equipos de tres jugadores. Muestra cómo utilizar reglas de ordenación explícitas para encontrar los mejores emparejamientos posibles lo más rápido posible. Estas reglas ordenan todos los tickets de emparejamiento activos para crear los mejores emparejamientos según determinados requisitos clave. Este ejemplo se implementa con las siguientes instrucciones:
-
Cree dos equipos de jugadores.
-
Incluya exactamente tres jugadores en cada equipo.
-
Incluya los siguientes atributos de los jugadores:
-
Nivel de experiencia (si no se proporciona, de manera predeterminada es 50).
-
Modos de juego preferidos (puede enumerar varios valores) (si no se proporcionan, de manera predeterminada son "coop" y "deathmatch").
-
Mapas de juego preferidos, se incluyen el nombre del mapa y la ponderación de preferencias (si no se proporciona, de manera predeterminada es
"defaultMap"
con un peso de 100).
-
-
Configure la ordenación previa:
-
Ordene los jugadores en función de su preferencia por el mismo mapa de juego que el jugador de referencia. Los jugadores pueden tener varios mapas de juego favoritos, por lo que este ejemplo utiliza un valor de preferencia.
-
Ordene los jugadores según el grado de coincidencia de su nivel de experiencia con el del jugador de referencia. Con esta ordenación, todos los jugadores de todos los equipos tendrían niveles de experiencia lo más similares posible.
-
-
Todos los jugadores de todos los equipos deben haber seleccionado al menos un modo de juego en común.
-
Todos los jugadores de todos los equipos deben haber seleccionado al menos un mapa de juego en común.
Notas sobre el uso de este conjunto de reglas:
-
La ordenación de mapa de juego utiliza una ordenación absoluta que compara el valor del atributo mapPreference. Puesto que es la primera del conjunto de reglas, se realiza esta ordenación en primer lugar.
-
La ordenación por experiencia utiliza una ordenación por distancia para comparar el nivel de habilidades de un posible jugador en relación con las habilidades del jugador de referencia.
-
Las ordenaciones se realizan según la disposición en la que aparecen en un conjunto de reglas. En esta situación, se ordena a los jugadores por preferencia de mapa de juego y, a continuación, por el nivel de experiencia.
{ "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 }] }