A resposta fornecida por Grzegorz Sławecki já é boa, mas eu queria explicar a lógica por trás do método dele e fornecer as ferramentas para adaptar as soluções às suas necessidades de jogo.
Os parâmetros da presente problema é o nível de ataque do jogador um , dano da arma W , os danos infligidos total num ataque d , saúde do inimigo H e o número mínimo de visitas necessárias para matar o inimigo, chamemos-lhe n .
Se você quer que o jogador mate em n acertos, o dano total d deve ser tal que
(n-1) .d <H ≤ nd ou em outras palavras, n = ceil (H / d) .
d depende de dano da arma w e no nível de ataque do jogador um e podemos esperar armas para obter melhor como o nível aumenta, então vamos escrever d (a) e w (a) em vez de simplesmente d e w . Os inimigos que o jogador enfrenta também devem ficar mais difíceis, então, novamente, H (a) . Todas essas são funções crescentes de a e você deseja que elas satisfaçam as inequações acima. As incógnitas do problema são funções. Você define um como uma restrição e encontra os outros. Você tem graus de liberdade, o que é uma coisa boa.
Se eu entendi bem sua pergunta, você tem uma jogabilidade precisa em mente, e essa jogabilidade é representada aqui principalmente pelo número de acertos necessários para matar o inimigo, n (a) . Portanto, defina n (a) dependendo da jogabilidade que você imagina para o jogo e encontre o restante das variáveis do problema . É isso que você sempre deve fazer, porque, como mostra sua pergunta, sua primeira tentativa foi tentar um algoritmo que você pensou que poderia fazer e depois percebeu que resultava em uma jogabilidade indesejada.
Vamos supor, por exemplo, que você queira que o jogador bata mais e mais vezes à medida que avança no jogo. Você também deseja que, à medida que o número necessário de acertos aumente, ele aumente cada vez menos, para que o jogador gaste uma parte mais longa do jogo batendo 5 vezes e 2 vezes. Aqui está a aparência de n (a) :

A função usada é n (a) = ceil (2 / 3.sqrt (a)) .
Queremos que H (a) / d (a) permaneça dentro dos intervalos de valores que fazem n (a) ter o valor desejado e, como n (a) = teto (H (a) / d (a)) , esses intervalos são os seguintes retângulos:

e H (a) / d (a) podem naturalmente ser configurados para 2 / 3.sqrt (a), de modo a obter o gráfico a seguir, com a curva vermelha sendo H (a) / d (a) :

Observação: podemos facilmente encontrar H (a) / d (a) aqui porque sabemos a função de que n (a) é o teto, mas se nossa especificação para n fosse menos agradável, teríamos que fazer nosso próprio ajuste função usando vários truques. Nem todos os problemas são bons!
Portanto, queremos que H (a) / d (a) se assemelhe a uma função de raiz quadrada personalizada e sabemos que H e d devem estar aumentando as funções. As soluções são abundantes. Por exemplo,
H (a) = a. 2 / 3.sqrt (a), e d (a) = a

Mas gostaríamos que o dano e o HP do inimigo aumentassem muito, para que haja números grandes e impressionantes no final do jogo, apenas por estilo, por isso, definimos
H (a) = a². 20 / 3.sqrt (a), e d (a) = 10.a²

A questão toda, e a melhor parte, é esta: você sabe que suas soluções para o problema ( H (a) e d (a) ) obedecem às especificações ( n (a) ), para obter o mesmo n (a) , mas você tem liberdade. Você conhece exatamente a liberdade que tem e pode usá-lo para personalizar a experiência. Você deve sempre tentar se dar essa liberdade, satisfazendo suas necessidades mais importantes, sempre que possível.
Agora que escolhemos o dano de um golpe d (a) e como d (a) depende do dano da arma w (a) , podemos usar d (a) como nossa especificação e tentar encontrar um w (a ) que nos fornece esse d (a) . Os princípios são os mesmos, o problema é diferente: queremos que o jogador cause mais dano à medida que seu nível aumenta, mesmo com a arma permanecendo a mesma, e também queremos que o dano aumente quando a arma sozinha melhorar e o nível permanecer. o mesmo.
Mas que importância cada fator deve ter? Suponha que queremos que o nível seja mais importante que as armas: uma parte maior das variações de d (a) = a² deve ser independente de w (a) , por exemplo, com
w (a) = 22.sqrt (a) e, portanto, d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))
Obtemos o gráfico a seguir para w (a) ...

... e ainda o mesmo d (a) , porque nós novamente encontrou uma solução que obedeceu a especificação , aqui de d (a) , e nós temos as propriedades citadas acima, com w e um contribuindo para o dano (suponha que nós olhamos d em função de a e w : então, se a fosse fixo e tivéssemos w variado na equação d (a, w) = a / 30.w , d ainda seria uma função crescente de w , e o mesmo é verdadeiro se você fixa w e faz uma variação).
Este w (a) pode fornecer o valor a ser exibido na descrição do jogo na arma: obteríamos "Dano na Arma: 220" com a melhor arma do jogo, por exemplo.
Poderíamos ter usado uma especificação completamente diferente para nossa jogabilidade e, portanto, para n (a) , por exemplo, uma que faz o número de acertos necessários aumentar rapidamente à medida que o jogo avança e depois atinge o platô, e as soluções resultantes seriam diferentes.
playerAttackestatística para 100? Considerando que este é o valor máximo, não seria apropriado matar o inimigo em alguns acertos? (É o inimigo algo 1000 HP você veria no início do jogo Um inimigo padrão chefe???)