Algorithme simulation sportive
#1
Bonjour à tous,

J'ai toujours adoré les jeux de simulation sportive orienté plutôt management. Aujourd'hui j'aurais envie de m'essayer à créer un petit script (dans un premier temps) pour arriver à simuler des rencontres.

Comme dans tout jeu de management, l'idée c'est de représenter les joueurs sous forme de caractéristiques notées sur 20 ou 100 peu importe. Par exemple attaque, défense, endurance pour aller au plus simple (mais au fur et à mesure il faudrait affiner avec plus de caractéristiques).

Ensuite il faudrait pouvoir prendre la caractéristique d'attaque de l'attaquant et celle du défenseur pour essayer de définir le résultat de l'action. Mais la dessus je bloque un peu. 
Comment arriver à définir le résultat d'une action en fonction de plusieurs paramètres (on peut rajouter un malus pour l'endurance par exemple) et mettre aussi une part d'aléatoire (une toute petite).

Comme je suis pas hyper bon en calcul mathématique, j'ai fait des recherches sur le net et j'ai trouvé des sujets intéressant mais assez simple.

C'est basé sur un joueur attaquant et un joueur gardien. On affecte une note de capacité à cadrer le tir et une note d'attaque sur 100 à l'attaquant. Pour le gardien c'est une note de capacité à arrêter un tir et une note de défense sur 100 aussi.

L'algorithme part du principe qu'on défini si le tir est cadré, puis si c'est le cas on compare la note d'attaque de l'attaquant avec la défense du gardien. Si la différence est trop importante avec la défense on ajoute une petite condition aléatoire et si c'est bon le tir est marqué. Si l'aléatoire n'est pas bon on part du principe que c'est un arrêt exceptionnel ce qui est rare.

Si jamais la différence est trop importante dans l'autre sens, défense supérieure à l'attaque alors on fait la même chose qu'avec l'attaque et la part d' aléatoire pour définir si le tir est arrêté ou si l'attaquant marque un but miracle.

C'est très basique mais c'est une toute première piste pour moi. Bien sur j'aimerais aller plus loin dans le sujet, rajouter des paramètres pour être plus réaliste et offrir plus de possibilités à mon script. Mais je vois pas comment rajouter des paramètres et faire varier tout ça. Vous avez des idées ?

Merci d'avance
Répondre
#2
Bonjour,

Déjà, l'idéal serait de définir toutes les actions possibles (du moins, c'est ce que je ferais), en attaque et en défense, et savoir si elles sont influencés par le joueur adverse, pour avoir une vue d'ensemble sur les différents chiffres à confronter.

Comme ça, je partirais sur une base chiffre positif = attaque réussie et chiffre négatif = défense réussie.

Si on prend des statistiques basiques attaque et défense, imaginons joueur A 3 attaque, joueur B 5 défense
attaque - défense = résultat
3 - 5 = -2, l'attaque a échoué

Après, si tu veux ajouter une dose de chance, tu peux prendre un chiffre aléatoire entre les chiffres des deux joueurs, et l'ajouter à la somme (en le divisant par le nombre que tu veux si tu veux réduire l'impact de la chance). Une caractéristique chance du personnage peut aussi influencer ce chiffre, ou alors maîtrise.

Concernant les autres statistiques, il faut définir ce qu'elles impactent. Par exemple, l'endurance, est-ce qu'elle va réduire l'attaque et la défense du personnage au fur et à mesure de ses actions jusqu'à ce qu'il se repose ? Le joueur a 5 points de défense perdra un point de défense à chaque action (à toi de voir si tu instauras un minimum). La tenacité peut par exemple fixer un seuil minimum sous lequel les chiffres ne peuvent pas aller.

Après si tu veux rajouter des éléments spécifiques du genre du bon angle de tir, là aussi il faut commencer par définir ces éléments.
Imaginons, pour l'angle de tir, on part de 0, et chaque point de précisions apporte 5 points d'amélioration de l'angle.
Le joueur a 3 points de précisions, donc 15 points d'amélioration de l'angle, chaque tranche de 4 augmente l'attaque de 1.
Tu peux aussi mettre un système d'échec de l'angle de tir si la jauge passe en dessous de 10 par exemple, en soustrayant là aussi avec un nombre aléatoire entre 0 et la fatigue par exemple qui va augmenter au fur et à mesure des actions. Plus tu seras fatigué, plus tu auras des chances de perdre des points de l'angle de tir, et de rater. A ce moment là, l'endurance pourrait réduire le niveau de fatigue perdu après chaque action.

En fait, ya des dizaines de possibilités... Définis d'abord tes actions, ensuite tes caractéristiques, pas forcément dans les chiffres, mais dans l'idée, pour savoir quel est leur impact sur les actions. Ensuite tu pourras définir tout ça en chiffres. Ce qui me parait intéressant, c'est d'avoir un chiffre de base, du côté des deux joueurs, et de le faire passer par une série d'effets caractéristiques / maîtrises / impact du terrain et autres avant de confronter ce résultat avec le joueur adverse. Ca demandera d'analyser suffisamment ces différents éléments en amont pour choisir quel joueur fait quel action face à quel autre joueur.

Mais en fait il faut beaucoup plus définir le jeu, parce que là, à partir du calcul que tu demandes, on peut faire un jeu d'élevage, d'agriculture, de course ou de combat... :p
Répondre
#3
Une autre approche pour la chance, moins aléatoire (car là, si tu as "pas de bol", un mec d'attaque 10 contre un mec défense 1 peut ne jamais marquer) consiste à faire le ratio des deux stats, et à appliquer l'aléatoire sur ce ratio.
ie: nb de buts marqués = (attaque / (défense + 1))*RAND(0.5 à 2) => un attaque 10 vs défense 1 marquera entre (10 / 2)*0.5 = 2.5 buts et (10 / 2)*2 = 10 buts (après, tu arrondis hein!)

Et une autre approche pour l'ensemble de l'algo consiste à le poser en équations plutôt qu'en "tours" (là, j'ai l'impression que ce sont des "tours" de jeu qu'on a).
Par exemple:
Buts du joueur = pow((attaque joueur + 1) / (défense adversaire + 1), tanh(2*(endurance joueur - endurance défenseur)) + 1)

L'idée est alors de poser un modèle global, définissant le résultat de la simulation. On peut alors faire de l'analyse mathématique dessus, et savoir comment le jeu se comportera quand l'attaquant a 2, 3, 100 fois plus d'endurance que le défenseur, ou quand les deux sont à égalité, etc. Ca donne plus de "maîtrise" à mon sens sur l'impact de chaque paramètre du jeu (ici, les paramètres sont les "+1", le facteur 2 dans la tanh, et les fonctions pow, tanh et division utilisées). Sinon, avec l'autre approche, maîtriser (équilibrer) le gameplay t'obligera à faire des simulations en masse (ça peut se faire aussi hein, et avec ce second modèle également).

Note qu'on peut poser d'autres équations pour d'autres caractéristiques du match:
Gain en endurance du joueur = 2*max(1, 1 - exp(endurance du joueur avant le match - endurance de l'adversaire avant le match))
(Note qu'elle ne peut que croître!)

Ou encore
attaque du joueur après match = (attaque du joueur avant le match + défense de l'adversaire avant le match)/2
(Note qu'elle peut donc décroître si j'affronte des faibles! ça pousse à affronter des forts)


Pour le reste, je suis d'accord: la problématique est très générale, et sera donc répondue de manière très générale.
Répondre
#4
Merci à vous deux d'avoir pris le temps de me faire des réponses détaillées 2

C'est vrai que j'ai dit que pour l'instant c'était plutôt une réflexion générale mais ça n'aide pas vraiment car c'est vaste. Donc mon objectif final est la simulation d'une rencontre de basket-ball.

En partant de ça on peut avoir une multitude de caractéristiques possibles pour les joueurs. De tête je dirais tir intérieur, tir extérieur, rebond, passe, interception, contre, défense, endurance, vitesse. Comme me l'a fait remarquer L'Omniscient, je devrais d'abord définir toutes les actions et les caractéristiques qui rentrent en compte pour chacune d'elles. Par exemple la note de tir extérieur n'aura aucun impact dans une situation de rebond.

Après pour le côté algorithme, j'ai un peu plus de mal. Ce que me propose Xenos à l'air assez intéressant mais j'ai du mal à comprendre tous les calculs, il va falloir que j'étudie ça à tête reposée.

Encore merci à vous deux 16
Répondre




Utilisateur(s) parcourant ce sujet : 1 visiteur(s)