Comprendre les exigences
- Tous les joueurs ont un nombre limité d'ennemis adjacents.
Tout d'abord, nous parlons des points d'apparition des joueurs, pas de la position actuelle des joueurs à un moment donné du jeu. Il suffit de retirer cela du chemin.
Adjacent est bien défini lorsque nous parlons d'un graphique. Nous pouvons penser à une carte qui représente la navigabilité sur la carte - désormais "le graphique".
Si un nœud peut avoir au plus un point d'apparition, alors parler d'eux comme «adjacents» a du sens. Remarque: Je ne contraindrai pas les nœuds à avoir un seul point d'apparition au plus, pour des raisons qui apparaîtront plus tard.
Pour construire le graphique, nous devrons prendre en compte des éléments tels que les murs, les ponts, les échelles, les points de téléportation, ou même envisager l'espace de vol s'il peut y avoir un joueur qui peut voler. Chaque nœud représente un emplacement traversable; chaque connexion représente un mouvement possible.
Remarque: connaître la taille et la forme des nœuds et travailler avec des nœuds réellement adjacents. Ne considérez pas les nœuds comme un point. Ne considérez pas les connexions comme ayant une longueur. Utilisez également des nœuds convexes.
Le graphique aurait pu être précompilé (la carte a été créée par un concepteur); sinon, il peut être créé à la volée si la carte est générée aléatoirement.
- Tous les joueurs ont des chances égales de rencontrer des ennemis adjacents.
Je suppose que les ennemis sont d'autres joueurs. Encore une fois, il suffit de supprimer cela.
En supposant que chaque joueur fasse une marche aléatoire, la probabilité de trouver un joueur à un point donné - sur un espace plat, sans obstacles - sera donnée par une fonction (gaussienne) de la distance jusqu'au point d'apparition - à partir de maintenant "le une fonction".
Puisque nous travaillons sur le graphique, nous annoterons plutôt les valeurs sur le graphique.
- La taille de la carte ne doit pas augmenter proportionnellement au nombre de joueurs.
Si nous avions la contrainte d'avoir un seul point d'apparition par nœud, alors pour ajouter plus de joueurs, nous aurions besoin de nœuds plus petits. Si nous décidons du graphique avant de savoir combien de joueurs nous aurons, nous devrons peut-être subdiviser les nœuds pour le jeu en particulier.
- Ces limitations ne sont pas appliquées avec des espaces impraticables arbitraires.
Je n'ai pas l'intention d'ajouter des obstacles pour résoudre le problème. Au contraire , je dois travailler autour des obstacles. S'ils n'étaient pas là, la mise en œuvre serait plus simple.
Solution
Nous essayons de placer N points de réapparition de manière à ce que les chances de rencontrer un autre joueur à tous ces points de réapparition soient égales.
Nous pouvons obtenir une mesure de l'erreur comme la somme des différences entre les chances et la moyenne des chances. Nous essayons de minimiser cela (en fait, nous voulons le mettre à 0).
Pour ce faire, nous devons connaître les chances de rencontrer un joueur sur chaque nœud du graphique.
Pour calculer cette chance, commencez par zéro. Puisque la chance de trouver un joueur sur un nœud donné, quand il n'y a pas de joueurs, est nulle. Et puis, pour chaque point d'apparition, parcourez le graphique en ajoutant à la chance annotée la valeur de la fonction pour le point d'apparition actuel.
Remarque 1: L'ajout ou le déplacement d'un point d'apparition affectera les chances de rencontrer un joueur pour toute la carte.
Remarque 2: Garder une trace de la façon dont chaque point d'apparition affecte la chance rendra les choses plus faciles.
Remarque 3: Étant donné que les nœuds ont une taille, la proximité de l'erreur = zéro dépend de la taille des nœuds. Vous pouvez être plus précis en travaillant avec des plages de valeurs (chances minimun et maximun, selon la position particulière des points d'apparition dans le nœud).
Placez les points d'apparition au hasard, puis commencez à les déplacer de telle sorte que l'erreur devienne plus petite (envisagez un mouvement possible, et si l'erreur diminue, conservez-le, sinon inversez-le). Et continuez ainsi jusqu'à ce que nous ne puissions pas nous améliorer davantage (trop d'itérations sans amélioration, ou l'erreur est nulle).
Remarque 4: Lorsque vous déplacez un point d'apparition, vous pouvez utiliser la chance de rencontrer un joueur (à l'exclusion du point d'apparition que vous allez déplacer) pour sélectionner au hasard une nouvelle position pour un point d'apparition telle que cette position qui a une chance de rencontrer un joueur plus proche de la moyenne est plus probable. Je vous rappelle que déplacer le point d'apparition affectera la moyenne.
Le comportement attendu est que les points d'apparition qui sont trop rapprochés se séparent et que les points d'apparition trop éloignés se rapprochent. Jusqu'à ce qu'ils atteignent l'équilibre.
Si à une itération donnée vous avez plusieurs points d'apparition sur un nœud (ce qui est peu probable, car ils devraient avoir tendance à s'écarter, mais possible si vous avez des nœuds suffisamment grands), divisez le nœud et continuez à résoudre. Toute division du nœud est valide.
La solution ci-dessus approchera error = zero, mais ne garantit pas d'atteindre zéro. Vous pouvez le faire jusqu'à ce qu'il atteigne un minimum local ... En théorie, vous pouvez ensuite diviser les nœuds pour le rendre exactement nul ... Pourtant, cela équivaut à modifier les coordonnées du point d'apparition!
Essayez un recuit simulé pour déplacer le point d'apparition dans le nœud. Bien que, honnêtement, cela ne vaut probablement pas la peine de s'embêter avec un tel niveau de détail.
Je tiens à préciser que le résultat d'une carte plane sans obstacles ne sera pas des points uniformément répartis. Au lieu de cela, si la carte a des bords (c'est-à-dire si elle ne s'enroule pas), alors il y aura plus de points d'apparition plus près des bords, c'est parce que les points au centre peuvent être atteints depuis plus de directions, augmentant les chances de rencontrer d'autres joueurs là-bas. Ainsi, les points plus éloignés près du centre pour compenser.