Je travaille sur un programme de jeu vidéo simple pour l'école et j'ai créé une méthode où le joueur obtient 15 points de santé si cette méthode est appelée. Je dois garder la santé à un maximum de 100 et avec ma capacité de programmation limitée à ce stade, je fais quelque chose comme ça.
public void getHealed(){
if(health <= 85)
health += 15;
else if(health == 86)
health += 14;
else if(health == 87)
health += 13;
}// this would continue so that I would never go over 100
Je comprends que ma syntaxe n'est pas parfaite, mais ma question est de savoir quelle est la meilleure façon de le faire, car je dois également faire une chose similaire avec les points de dommage et ne pas descendre en dessous de 0.
C'est ce qu'on appelle l' arithmétique de saturation .
Réponses:
Je ferais juste ça. Il faut essentiellement le minimum entre 100 (la santé maximale) et ce que serait la santé avec 15 points supplémentaires. Il garantit que la santé de l'utilisateur ne dépasse pas 100.
Pour vous assurer que hitpoints ne laissez pas tomber en dessous de zéro, vous pouvez utiliser une fonction similaire:
Math.max
.la source
ajoutez simplement 15 à la santé, donc:
Cependant, comme fade l'a noté, parfois avec le multi-threading (plusieurs blocs de code s'exécutant à la fois), la santé dépassant 100 à tout moment peut causer des problèmes, et la modification de la propriété de santé plusieurs fois peut également être mauvaise. Dans ce cas, vous pouvez le faire, comme mentionné dans d'autres réponses.
la source
health
, ou de s'assurer qu'ilhealth
n'est accessible qu'à partir d'un seul thread. La contrainte "Ne devrait jamais permettre à la santé de dépasser 100" n'est pas réaliste.Vous n'avez pas besoin d' un cas distinct pour chaque
int
ci - dessus85
. Il suffit d'en avoir unelse
, de sorte que si la santé est déjà86
ou supérieure, réglez-la directement sur100
.la source
100 - 15
(ou100 -HEALED_HEALTH
) ne serait pas une amélioration?Je pense qu'une manière idiomatique et orientée objet de faire cela est d'avoir un
setHealth
sur laCharacter
classe. L'implémentation de cette méthode ressemblera à ceci:Cela empêche la santé de descendre en dessous de 0 ou au-dessus de 100, quel que soit votre réglage.
Votre
getHealed()
implémentation peut être la suivante:Que ce soit logique pour la méthode d'
Character
avoir-unegetHealed()
est un exercice laissé au lecteur :)la source
heal(int hp)
etdamage(int hp)
) qui appellent chacune votresetHealth(int newValue)
méthode.if
. C'est pour vous éviter de pouvoir vous tirer une balle dans le pied. S'il est trop détaillé, utilisez simplement des importations statiques. Ensuite, cela ressemble à ceci:health = max(0, min(100, newValue))
Si c'est toujours illisible pour vous, extrayez-le dans une méthode nommée declamp
sorte que la ligne ressemble à ceci:health = clamp(0, 100, newValue)
Je vais juste proposer une tranche de code plus réutilisable, ce n'est pas la plus petite mais vous pouvez l'utiliser avec n'importe quel montant, donc c'est toujours digne d'être dit
Vous pouvez également changer le 100 en une variable maxHealth si vous voulez ajouter des statistiques au jeu que vous créez, donc toute la méthode pourrait être quelque chose comme ça
ÉDITER
Pour plus d'informations
Vous pouvez faire la même chose lorsque le joueur est endommagé, mais vous n'avez pas besoin d'un minHealth car ce serait de toute façon 0. En procédant de cette façon, vous seriez en mesure d'endommager et de guérir n'importe quel montant avec le même code.
la source
minHealth
pourrait être négatif, par exemple, dans D&D ... :)la source
Je créerais une méthode statique dans une classe d'assistance. De cette façon, plutôt que de répéter le code pour chaque valeur qui doit tenir dans certaines limites, vous pouvez avoir une méthode polyvalente. Il accepterait deux valeurs définissant le min et le max, et une troisième valeur à serrer dans cette plage.
Pour votre cas, vous déclareriez votre santé minimum et maximum quelque part.
Appelez ensuite la fonction en passant votre santé min, max et ajustée.
la source
Je sais que c'est un projet scolaire, mais si vous vouliez étendre votre jeu plus tard et pouvoir améliorer votre pouvoir de guérison, écrivez la fonction comme suit:
et appelez la fonction:
...etc...
De plus, vous pouvez créer votre HP max en créant une variable qui n'est pas locale à la fonction. Comme je ne sais pas quelle langue vous utilisez, je ne montrerai pas d'exemple car il pourrait avoir la mauvaise syntaxe.
la source
Peut être ça?
la source
Si vous voulez être effronté et adapter votre code sur une seule ligne, vous pouvez utiliser un opérateur ternaire :
Notez que certaines personnes désapprouveront cette syntaxe en raison (sans doute) d'une mauvaise lisibilité!
la source
health = (health <= 85)?(health+15):100
plus lisible (si vous voulez vraiment utiliser un opérateur ternaire)Je crois que ça va faire
Explication:
Si l'écart de guérison est de 15 ou moins, la santé deviendra 100.
Sinon, si l'écart est supérieur à 15, cela ajoutera 15 à la santé.
Par exemple: si la santé est de 83, elle deviendra 98 mais pas 100.
la source
&& health < 100
condition est inutile. Si c'est 100, il sera mis à 100, aucun changement. La seule raison pour laquelle vous en auriez besoin est s'il était possible d'obtenir> 100 d'une manière ou d'une autre et nous ne voulons pas que la guérison vous ramène à 100.Si je voulais être thread-safe, je le ferais de cette façon plutôt que d'utiliser un bloc synchronisé.
L'atomic compareAndSet obtient le même résultat que synchronisé sans la surcharge.
la source
Manière la plus simple en utilisant l'opérateur module.
santé = (santé + 50)% 100;
la santé ne sera jamais égale ou supérieure à 100.
la source
health
100, vous finirez avec 50 points de vie.la source