Estoy trabajando en un programa de videojuego simple para la escuela y he creado un método en el que el jugador obtiene 15 puntos de salud si se llama a ese método. Tengo que mantener la salud en un máximo de 100 y con mi capacidad de programación limitada en este momento estoy haciendo algo como esto.
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
Entiendo que mi sintaxis no es perfecta, pero mi pregunta es, cuál puede ser una mejor manera de hacerlo, porque también tengo que hacer algo similar con los puntos de daño y no bajar de 0.
A esto se le llama aritmética de saturación .
java
if-statement
switch-statement
saturation-arithmetic
Steven Eck
fuente
fuente
Respuestas:
Solo haría esto. Básicamente, toma el mínimo entre 100 (la salud máxima) y cuál sería la salud con 15 puntos extra. Asegura que la salud del usuario no supere los 100.
Para asegurar que los puntos de golpe no caen por debajo de cero, puede utilizar una función similar:
Math.max
.fuente
solo agregue 15 a la salud, entonces:
Sin embargo, como ha señalado Bland, a veces con el subproceso múltiple (varios bloques de código ejecutándose a la vez) tener la salud sobre 100 en cualquier punto puede causar problemas, y cambiar la propiedad de salud varias veces también puede ser malo. En ese caso, puede hacer esto, como se menciona en otras respuestas.
fuente
health
o asegurarse dehealth
que solo se acceda desde un subproceso. La restricción "Nunca debe permitir que la salud supere los 100" no es realista.No necesita un caso separado para cada uno de los
int
anteriores85
. Solo tenga unoelse
, de modo que si la salud ya es86
o superior, configúrelo directamente en100
.fuente
100 - 15
(o100 -HEALED_HEALTH
) una mejora?Creo que una forma idiomática y orientada a objetos de hacer esto es tener un
setHealth
en laCharacter
clase. La implementación de ese método se verá así:Esto evita que la salud vaya por debajo de 0 o por encima de 100, independientemente de lo que establezca.
Tu
getHealed()
implementación puede ser simplemente esta:Si tiene sentido
Character
tener ungetHealed()
método es un ejercicio que se deja al lector :)fuente
heal(int hp)
ydamage(int hp)
) cada uno de los cuales llama a susetHealth(int newValue)
método.if
. Esto es para evitar que pueda dispararse en el pie. Si es demasiado detallado, simplemente use importaciones estáticas. Entonces se ve así:health = max(0, min(100, newValue))
Si aún es ilegible para usted, extráigalo a un método llamadoclamp
para que la línea se vea así:health = clamp(0, 100, newValue)
Solo voy a ofrecer un fragmento de código más reutilizable, no es el más pequeño, pero puede usarlo con cualquier cantidad, por lo que aún vale la pena decirlo.
También puede cambiar el 100 a una variable maxHealth si desea agregar estadísticas al juego que está creando, por lo que todo el método podría ser algo como esto
EDITAR
Para más información
Podrías hacer lo mismo cuando el jugador se dañe, pero no necesitarías un minHealth porque sería 0 de todos modos. Si lo hace de esta manera, podrá dañar y curar cualquier cantidad con el mismo código.
fuente
minHealth
podría ser negativo, por ejemplo, en D&D ... :)fuente
Haría un método estático en una clase auxiliar. De esta manera, en lugar de repetir el código para cada valor que debe ajustarse a algunos límites, puede tener un método para todo uso. Aceptaría dos valores que definen el mínimo y el máximo, y un tercer valor que se fijará dentro de ese rango.
Para su caso, declararía su salud mínima y máxima en algún lugar.
Luego llame a la función pasando su salud mínima, máxima y ajustada.
fuente
Sé que este es un proyecto de la escuela, pero si quieres expandir tu juego más adelante y poder mejorar tu poder curativo, escribe la función así:
y llame a la función:
... etc ...
Además, puede crear su HP máximo creando una variable que no sea local para la función. Como no sé qué idioma está usando, no mostraré un ejemplo porque podría tener la sintaxis incorrecta.
fuente
¿Tal vez esto?
fuente
Si quieres ser descarado y ajustar tu código en una línea, puedes usar un operador ternario :
Tenga en cuenta que algunas personas desaprobarán esta sintaxis debido a (posiblemente) una mala legibilidad.
fuente
health = (health <= 85)?(health+15):100
más legible (si realmente desea usar un operador ternario)Creo que esto servirá
Explicación:
Si la brecha para la curación es de 15 o menos, la salud se convertirá en 100.
De lo contrario, si la brecha es mayor que 15, agregará 15 a la salud.
Entonces, por ejemplo: si la salud es 83, se convertirá en 98 pero no 100.
fuente
&& health < 100
condición es innecesaria. Si es 100, se establecerá en 100, sin cambios. La única razón por la que lo necesitaría es si fuera posible obtener> 100 de alguna manera y no queremos que la curación lo reduzca a 100.Si quisiera ser seguro para subprocesos, lo haría de esta manera en lugar de usar un bloque sincronizado.
El compareAndSet atómico logra el mismo resultado que sincronizado sin la sobrecarga.
fuente
La forma más sencilla utilizando el operador de módulo.
salud = (salud + 50)% 100;
la salud nunca será igual o superior a 100.
fuente
health
tienes 100, terminarías con 50 de salud.fuente