我正在为学校制作一个简单的视频游戏程序,我已经创建了一种方法,如果调用该方法,玩家将获得15个健康点。我必须保持最高100的健康状态,并且我现在有限的编程能力,我正在做这样的事情。
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
我理解我的语法并不完美,但我的问题是,这可能是一个更好的方法,因为我还必须对损伤点做类似的事情,而不是低于0。
答案 0 :(得分:222)
我会这样做。它基本上需要在100(最大生命值)和15点额外健康之间的最小值。它确保用户的健康状况不超过100。
public void getHealed() {
health = Math.min(health + 15, 100);
}
为确保生命值不低于零,您可以使用类似的功能:Math.max
。
public void takeDamage(int damage) {
if(damage > 0) {
health = Math.max(health - damage, 0);
}
}
答案 1 :(得分:71)
只需为健康添加15,所以:
health += 15;
if(health > 100){
health = 100;
}
然而,正如bland所指出的那样,有时多线程(多个代码块同时执行),任何点的健康状况超过100会导致问题,并且多次更改健康属性时代也可能不好。在这种情况下,你可以这样做,如其他答案所述。
if(health + 15 > 100) {
health = 100;
} else {
health += 15;
}
答案 2 :(得分:45)
int
以上的每个85
都不需要单独的案例。只需要一个else
,这样如果健康状况已经86
或更高,那么只需将其直接设置为100
。
if(health <= 85)
health += 15;
else
health = 100;
答案 3 :(得分:37)
我认为这样做的一种惯用的,面向对象的方法是在setHealth
类上使用Character
。该方法的实现如下所示:
public void setHealth(int newValue) {
health = Math.max(0, Math.min(100, newValue))
}
这可以防止健康状况低于0或高于100,无论您将其设置为什么。
您的getHealed()
实施可以是这样的:
public void getHealed() {
setHealth(getHealth() + 15);
}
让Character
拥有getHealed()
方法是否有意义是一个留给读者的练习:)
答案 4 :(得分:14)
我只是提供一个更可重复使用的代码片段,它不是最小的代码,但你可以使用任何数量的代码,所以它仍然值得一说
health += amountToHeal;
if (health >= 100)
{
health = 100;
}
如果你想为自己制作的游戏添加统计数据,你也可以将100改为maxHealth变量,所以整个方法可能是这样的
private int maxHealth = 100;
public void heal(int amountToHeal)
{
health += amountToHeal;
if (health >= maxHealth)
{
health = maxHealth;
}
}
了解更多信息
你可以在播放器受损时做同样的事情,但你不需要minHealth,因为无论如何都是0。这样做就可以使用相同的代码破坏和治愈任何金额。
答案 5 :(得分:10)
health = health < 85 ? health + 15 : 100;
答案 6 :(得分:4)
我会在helper类中创建一个静态方法。这样,您可以拥有一个通用方法,而不是为每个需要适合某些边界的值重复代码。它将接受定义最小值和最大值的两个值,以及要在该范围内钳制的第三个值。
class HelperClass
{
// Some other methods
public static int clamp( int min, int max, int value )
{
if( value > max )
return max;
else if( value < min )
return min;
else
return value;
}
}
对于您的情况,您可以在某处声明您的最低和最高健康状况。
final int HealthMin = 0;
final int HealthMax = 100;
然后调用传递最小,最大和调整后健康状况的函数。
health = HelperClass.clamp( HealthMin, HealthMax, health + 15 );
答案 7 :(得分:3)
我知道这是一个学校项目,但是如果你想在以后扩展你的游戏并且能够升级你的治疗能力,那就写下这样的功能:
public void getHealed(healthPWR) {
health = Math.min(health + healthPWR, 100);
}
并调出功能:
getHealed(15);
getHealed(25);
...等...
此外,您可以通过创建非函数本地的变量来创建最大HP。由于我不知道您正在使用哪种语言,因此我不会展示一个示例,因为它可能有错误的语法。
答案 8 :(得分:2)
也许这个?
public void getHealed()
{
if (health <= 85)
{
health += 15;
} else
{
health = 100;
}
}
答案 9 :(得分:2)
如果你想要厚颜无耻并且在一行上使用你的代码,你可以使用ternary operator:
health += (health <= 85) ? 15 : (100 - health);
请注意,由于(可以说)可读性差,有些人会对此语法不满意!
答案 10 :(得分:1)
我相信这样做
if (health >= 85) health = 100;
else health += 15;
说明:
如果治疗差距为15或更小,健康状况将变为100。
否则如果差距大于15,则会增加15点健康状况。
例如:如果健康状况是83,那么它将变为98而不是100。
答案 11 :(得分:1)
如果我想要线程安全,我会这样做而不是使用synchronized块。
原子compareAndSet在没有开销的情况下实现了与synchronized相同的结果。
AtomicInteger health = new AtomicInteger();
public void addHealth(int value)
{
int original = 0;
int newValue = 0;
do
{
original = health.get();
newValue = Math.min(100, original + value);
}
while (!health.compareAndSet(original, newValue));
}
答案 12 :(得分:1)
使用模运算符的最简单方法。
health =(health + 50)%100;
健康永远不会超过100。
答案 13 :(得分:0)
private int health;
public void Heal()
{
if (health > 85)
health = 100;
else
health += 15;
}
public void Damage()
{
if (health < 15)
health = 0;
else
health -= 15;
}