Je suppose que c'est une question d'équilibre du jeu et non une question de codage, et il existe de nombreuses façons de gérer cela. D'après votre algorithme existant, je soupçonne que vous le rendez plus compliqué qu'il ne doit l'être (trois attributs ET un nombre aléatoire font un système extrêmement boueux du point de vue du joueur). Mon premier réflexe est de simplifier!
Privilégiez les attributs qui font plusieurs choses, plutôt que les résultats qui sont déterminés par plusieurs attributs. DEX fonctionne très bien en tant que principal déterminant de la chance de toucher; l'ajout de tout le reste ne fait que compliquer l'équilibre. Pensez-y de cette façon: les dégâts attendus d'un joueur à chaque coup sont son% de coup multiplié par ses dégâts moyens quand il touche. Comment prévoyez-vous de calculer un% à atteindre "normal" ou "typique" avec autant de variables?
Je vois un autre problème, c'est que votre formule n'est pas évolutive, et c'est probablement ce que vous vivez. En supposant que DEX, LUCK et SPEED ont tendance à augmenter au cours du jeu, les différences entre le joueur et le monstre dans ces statistiques auront également tendance à augmenter. À titre d'exemple, si le DEX en début de partie d'un joueur se situe dans la plage de 4 à 6, tout comme les monstres, c'est un modificateur de 10-20% pour toucher. Si la plage est plus proche de 10 à 20 dans les étapes ultérieures du jeu, cela correspond à un modificateur de 100%.
Une façon de résoudre ce problème est de maintenir les statistiques fixes. Les gammes de joueurs et de monstres sont les mêmes tout au long du jeu, et obtenir quelque chose comme +1 DEX est une affaire énorme, extrêmement rare et traitée comme telle (si elle existe). Ensuite, votre formule fonctionnera bien pour tout le jeu, et vous verrez un joueur avec environ la même chance de toucher tout au long.
Une autre façon est de changer ce "10" codé en dur pour évoluer avec le niveau, donc c'est peut-être "10 + niveau monstre" ou "10 + niveau donjon" ou quelque chose, ce qui provoque une légère augmentation de la difficulté à mesure que le jeu progresse, sauf si le joueur monte de niveau leurs statistiques en conséquence.
Une troisième façon, comme d'autres l'ont dit, consiste à fixer des plafonds fermes sur le% le plus élevé et le plus bas acceptable à atteindre, et à dire simplement "si la valeur calculée est inférieure à X, utilisez X à la place".
Par souci d'exhaustivité, je soulignerai qu'il n'y a pas de loi absolue que vous DEVEZ inclure un jet de touche en premier lieu. Prendre une action dans un jeu inefficace n'est pas particulièrement amusant et n'ajoute pas vraiment à l'expérience, sauf dans de rares cas. Une alternative est de laisser les joueurs TOUJOURS frapper, et juste jouer avec la gamme de dégâts afin que parfois ils fassent beaucoup moins de dégâts que les autres. N'oubliez pas que les systèmes complexes sont plus amusants pour le concepteur que pour le joueur.