How am I supposed to decrease its armor first and next the health? I want not to print the negative of armor, and I want to print if the armor gets 0, the health should be the next to decrease.
For Instance in Testing Class, I use wizard and cast a spell to fireball 3 times to knight. Since knight should decrease the armor first, and health after the armor gets to 0.
Output:
Wizard use a 'Fireball' and will deal 24 damage to Knight Knight has now 6 armor left, and 80 health left. Wizard use a 'Fireball' and will deal 24 damage to Knight Knight has now -18 armor left, and 80 health left. Wizard use a 'Fireball' and will deal 24 damage to Knight Knight has now -18 armor left, and 56 health left.
As you can see in the Second Print, the armor gets -18, I want that to print 0 and 62 health left. since wizard deal 24 damage
This is the Parent class:
public class Human {
String name;
int strength;
int stealth;
int intelligence;
int health;
public Human() {
name = "Human";
strength=3;
stealth=3;
intelligence=3;
health=100;
}
public int getStrength()
{
return strength;
}
public int getStealth()
{
return stealth;
}
public int getIntelligence()
{
return intelligence;
}
public int getHealth()
{
return health;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public void setStrength(int strength)
{
this.strength = strength;
}
public void setStealth(int stealth)
{
this.stealth = stealth;
}
public void setIntelligence(int intelligence)
{
this.intelligence = intelligence;
}
public void setHealth(int health)
{
this.health = health;
}
public void attack(Human human)
{
int damagetaken = this.getStrength();
human.health = human.health - this.getStrength();
System.out.println(this.getName()+ " attack " + human.getName() + " and will deal " +damagetaken +" damage.");
System.out.println(human.getName()+ " has now "+human.getHealth()+" health left");
System.out.println();
}
}
Child Class Knight:
public class Knight extends Human
{
int armor=30;
public Knight() {
this.name="Knight";
this.health=80;
}
public void Reinforce(){
this.armor=this.armor+5;
System.out.println(this.getName()+ " use a 'Reinforce' and will increase its armor to 5 ");
System.out.println(this.getName()+ " has now "+ this.armor +" armor left.");
System.out.println();
}
public void HolyStrike(Human human)
{
int damagetaken = (int)(human.health-10-(.20*this.armor));
human.health= human.getHealth() - damagetaken;
System.out.println(this.getName()+ " use a 'Holy Strike' and will deal "+damagetaken+ " damage to "+ human.getName());
System.out.println(human.getName()+" has now " +human.getHealth()+" health left.");
System.out.println();
}
}
Child Class Wizard:
public class Wizard extends Human{
public Wizard()
{
this.name="Wizard";
this.health=50;
this.intelligence=8;
}
public void heal(Human human)
{
int healtake = this.getIntelligence();
human.health=human.health+this.intelligence;
System.out.println(this.getName()+" use a 'Heal' to " + human.getName() + " he/she will receive " + healtake + " additional health to his/her HP");
System.out.println(human.getName()+" has now "+ human.getHealth()+" health left.");
System.out.println();
}
public void fireball(Human human)
{
int damagetaken = this.intelligence*3;
human.health= human.health-(this.intelligence*3);
System.out.println(this.getName()+ " use a 'Fireball' and will deal "+damagetaken+ " damage to "+ human.getName());
System.out.println(human.getName()+" has now " +human.getHealth()+" health left.");
System.out.println();
}
public void fireball(Knight human)
{
if (human.armor > 1)
{
int damagetaken = this.intelligence*3;
human.armor= human.armor-(this.intelligence*3);
System.out.println(this.getName()+ " use a 'Fireball' and will deal "+damagetaken+ " damage to "+ human.getName());
System.out.println(human.getName()+" has now " +human.armor+" armor left, and "+human.getHealth()+" health left.");
System.out.println();
}
else
{
int damagetaken = this.intelligence*3;
human.health= human.health-(this.intelligence*3);
System.out.println(this.getName()+ " use a 'Fireball' and will deal "+damagetaken+ " damage to "+ human.getName());
System.out.println(human.getName()+" has now " +human.armor+" armor left, and "+human.getHealth()+" health left.");
System.out.println();
}
}
}
Testing Class:
public class HumanTest {
public static void main(String Args[]){
Human h1 = new Human();
Wizard w1= new Wizard();
Ninja n1 = new Ninja();
Samurai s1 = new Samurai();
Knight k1 = new Knight();
w1.fireball(k1);
w1.fireball(k1);
w1.fireball(k1);
w1.fireball(k1);
w1.fireball(k1);
w1.fireball(k1);
}
}
Can you help me to solve this?
you can ask me about the source code.
Advertisement
Answer
You are checking if armor is greater than 1 (human.armor > 1). You must reduce as much armor as possible and then the rest from health.
public void fireball(Knight knight) { //I've renamed the variable as knight
int damageToTake = this.intelligence * 3;
if (knight.armor >= damageToTake) {
knight.armor -= damageToTake;
} else {
int remaining = damageToTake - knight.armor;
knight.armor = 0;
// reduce remaining from health
knight.health -= remaining;
}
System.out.println(this.getName()+ " use a 'Fireball' and will deal "+damagetaken+ " damage to "+ knight.getName());
System.out.println(knight.getName()+" has now " +knight.armor+" armor left, and "+knight.getHealth()+" health left.");
System.out.println();
}
I guess you’ll also have to handle when there isn’t enough health as well. I’ll leave that to you.