diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..42061c0 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +README.md \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7c34d9c..ac3b3a7 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/Java-Ring/src/main/java/org/project/Main.java b/Java-Ring/src/main/java/org/project/Main.java index c2e0550..eb809e3 100644 --- a/Java-Ring/src/main/java/org/project/Main.java +++ b/Java-Ring/src/main/java/org/project/Main.java @@ -1,15 +1,79 @@ -package org.project; +import org.project.entity.Entity; +import org.project.entity.players.Assassin; +import org.project.entity.players.Knight; +import org.project.entity.players.Wizard; +import org.project.entity.enemies.Dragon; +import org.project.entity.enemies.Goblin; +import org.project.entity.enemies.Skeleton; +import org.project.object.weapons; +import org.project.object.weapons.Sward; +import org.project.object.armors; +import org.project.object.armors.KnightArmor; -import org.project.location.Location; -import java.util.ArrayList; -import java.util.List; -public class Main { +import java.util.Scanner; + +public class JavaRingGame { + public static void main(String[] args) { - // TODO: ADD SOME LOCATIONS TO YOUR GAME - List locations = new ArrayList<>(); + Scanner scanner = new Scanner(System.in); + + System.out.println("Select your character: "); + System.out.println("1. Wizard"); + System.out.println("2. Knight"); + System.out.println("3. Assassin"); + + int choice = scanner.nextInt(); + Entity player = null; + + switch (choice) { + case 1: + player = new Wizard(100, 50, new Sword(30, 10)); + break; + case 2: + player = new Knight(120, 30, new Sword(40, 15)); + break; + case 3: + player = new Assassin(80, 70, new Sword(25, 5)); + break; + default: + System.out.println("Invalid choice, defaulting to Wizard."); + player = new Wizard(100, 50, new Sword(30, 10)); + } + + Entity enemy = generateRandomEnemy(); + + System.out.println("\nYour enemy: " + enemy.getClass().getSimpleName()); + System.out.println("Battle Start!"); + + while (player.isAlive() && enemy.isAlive()) { + System.out.println("\nYour turn to attack!"); + player.attack(enemy); + if (enemy.isAlive()) { + System.out.println("\nEnemy's turn to attack!"); + enemy.attack(player); + } + } + + if (!player.isAlive()) { + System.out.println("You have been defeated by " + enemy.getClass().getSimpleName() + "!"); + } else if (!enemy.isAlive()) { + System.out.println("You have defeated " + enemy.getClass().getSimpleName() + "!"); + } + } - // TODO: IMPLEMENT GAMEPLAY + public static Entity generateRandomEnemy() { + int rand = (int) (Math.random() * 3); + switch (rand) { + case 0: + return new Goblin(50, 20, new Sword(15, 5)); + case 1: + return new Skeleton(70, 25, new Sword(20, 8)); + case 2: + return new Dragon(200, 50, new Sword(50, 20)); + default: + return new Goblin(50, 20, new Sword(15, 5)); // Default enemy + } } -} \ No newline at end of file +} diff --git a/Java-Ring/src/main/java/org/project/entity/Entity.java b/Java-Ring/src/main/java/org/project/entity/Entity.java index 2a060f9..7c6b349 100644 --- a/Java-Ring/src/main/java/org/project/entity/Entity.java +++ b/Java-Ring/src/main/java/org/project/entity/Entity.java @@ -15,7 +15,5 @@ public interface Entity { int getMaxMP(); - /* - TODO: ADD OTHER REQUIRED AND BONUS METHODS - */ + boolean isAlive(); } diff --git a/Java-Ring/src/main/java/org/project/entity/enemies/Dragon.java b/Java-Ring/src/main/java/org/project/entity/enemies/Dragon.java new file mode 100644 index 0000000..29d407c --- /dev/null +++ b/Java-Ring/src/main/java/org/project/entity/enemies/Dragon.java @@ -0,0 +1,70 @@ +package org.project.entity.enemies; + +import org.project.object.armors.Armor; +import org.project.object.weapons.Weapon; +import org.project.entity.Entity; + +public class Dragon extends Enemy { + private static final int FIREBALL_DAMAGE = 30; + private static final int FIREBALL_MANA_COST = 20; + + public Dragon(int hp, int mp, Weapon weapon) { + super(hp, mp, weapon); + } + + @Override + public void attack(Entity target) { + if (getMp() >= FIREBALL_MANA_COST) { + System.out.println("🔥 Dragon breathes fire!"); + target.takeDamage(FIREBALL_DAMAGE); + fillMana(-FIREBALL_MANA_COST); + } else { + super.attack(target); + } + } + + @Override + public void takeDamage(int damage) { + int reducedDamage = damage / 2; + super.takeDamage(reducedDamage); + System.out.println("🛡️ Dragon's tough scales reduce damage!"); + } + + public void fly() { + System.out.println("🐉 Dragon flies into the sky, preparing for a powerful attack!"); + } +} +package org.project.entity.enemies; + +import org.project.object.weapons.Weapon; + +public class Dragon extends Enemy { + private static final int FIREBALL_DAMAGE = 30; + private static final int FIREBALL_MANA_COST = 20; + + public Dragon(int hp, int mp, Weapon weapon) { + super(hp, mp, weapon); + } + + @Override + public void attack(Entity target) { + if (getMp() >= FIREBALL_MANA_COST) { + System.out.println("🔥 Dragon breathes fire!"); + target.takeDamage(FIREBALL_DAMAGE); + fillMana(-FIREBALL_MANA_COST); + } else { + super.attack(target); + } + } + + @Override + public void takeDamage(int damage) { + int reducedDamage = damage / 2; + super.takeDamage(reducedDamage); + System.out.println("🛡️ Dragon's tough scales reduce damage!"); + } + + public void fly() { + System.out.println("🐉 Dragon flies into the sky, preparing for a powerful attack!"); + } +} \ No newline at end of file diff --git a/Java-Ring/src/main/java/org/project/entity/enemies/Enemy.java b/Java-Ring/src/main/java/org/project/entity/enemies/Enemy.java index 1fcc491..83c93d3 100644 --- a/Java-Ring/src/main/java/org/project/entity/enemies/Enemy.java +++ b/Java-Ring/src/main/java/org/project/entity/enemies/Enemy.java @@ -2,23 +2,64 @@ import org.project.object.weapons.Weapon; -// TODO: UPDATE IMPLEMENTATION -public abstract class Enemy { - Weapon weapon; +public abstract class Enemy implements Entity { + protected Weapon weapon; + private int maxHP; + private int maxMP; private int hp; private int mp; public Enemy(int hp, int mp, Weapon weapon) { + this.maxHP = hp; + this.maxMP = mp; this.hp = hp; this.mp = mp; - this.weapon = weapon; } - // TODO: (BONUS) UPDATE THE FORMULA OF TAKING DAMAGE + @Override + public void attack(Entity target) { + if (weapon != null) { + System.out.println("Enemy attacks with " + weapon.getName()); + target.takeDamage(weapon.getDamage()); + } else { + System.out.println("Enemy has no weapon to attack!"); + } + } + @Override public void takeDamage(int damage) { hp -= damage; + if (hp <= 0) { + hp = 0; + System.out.println("Enemy has been defeated!"); + } + } + + @Override + public void heal(int health) { + hp += health; + if (hp > maxHP) { + hp = maxHP; + } + } + + @Override + public void fillMana(int mana) { + mp += mana; + if (mp > maxMP) { + mp = maxMP; + } + } + + @Override + public int getMaxHP() { + return maxHP; + } + + @Override + public int getMaxMP() { + return maxMP; } public int getHp() { diff --git a/Java-Ring/src/main/java/org/project/entity/enemies/Goblin.java b/Java-Ring/src/main/java/org/project/entity/enemies/Goblin.java new file mode 100644 index 0000000..a2ae371 --- /dev/null +++ b/Java-Ring/src/main/java/org/project/entity/enemies/Goblin.java @@ -0,0 +1,30 @@ +package org.project.entity.enemies; + +import org.project.object.armors.Armor; +import org.project.object.weapons.Weapon; +import org.project.entity.Entity; +import java.util.Random; + +public class Goblin extends Enemy { + private static final double CRITICAL_CHANCE = 0.1; + + public Goblin(int hp, int mp, Weapon weapon) { + super(hp, mp, weapon); + } + + @Override + public void attack(Entity target) { + Random rand = new Random(); + for (int i = 0; i < 2; i++) { // دو بار حمله می‌کند + int damage = (weapon != null) ? weapon.getDamage() / 2 : 5; + + if (i == 0 && rand.nextDouble() < CRITICAL_CHANCE) { + damage *= 2; + System.out.println("💥 Goblin lands a CRITICAL HIT!"); + } + + System.out.println("⚔️ Goblin attacks for " + damage + " damage!"); + target.takeDamage(damage); + } + } +} \ No newline at end of file diff --git a/Java-Ring/src/main/java/org/project/entity/enemies/Skeleton.java b/Java-Ring/src/main/java/org/project/entity/enemies/Skeleton.java index 8c3e638..02aa55b 100644 --- a/Java-Ring/src/main/java/org/project/entity/enemies/Skeleton.java +++ b/Java-Ring/src/main/java/org/project/entity/enemies/Skeleton.java @@ -1,6 +1,34 @@ package org.project.entity.enemies; -// TODO: UPDATE IMPLEMENTATION -public class Skeleton { - // TODO: DESIGN ENEMY'S WEAPON AND ARMOR AND IMPLEMENT THE CONSTRUCTOR -} +import org.project.object.armors.Armor; +import org.project.object.weapons.Weapon; +import org.project.entity.Entity; +import java.util.Random; + +public class Skeleton extends Enemy { + private boolean resurrected = false; + + public Skeleton(int hp, int mp, Weapon weapon) { + super(hp, mp, weapon); + } + + @Override + public void takeDamage(int damage) { + int finalDamage = damage; + if (weapon != null) { + finalDamage *= 0.75; + } + + super.takeDamage(finalDamage); + System.out.println("🦴 Skeleton resists some damage!"); + + if (getHp() == 0 && !resurrected) { + Random rand = new Random(); + if (rand.nextBoolean()) { + resurrected = true; + heal(getMaxHP() / 2); + System.out.println("💀 Skeleton resurrects with half HP!"); + } + } + } +} \ No newline at end of file diff --git a/Java-Ring/src/main/java/org/project/entity/players/Assassin.java b/Java-Ring/src/main/java/org/project/entity/players/Assassin.java new file mode 100644 index 0000000..a24fbf5 --- /dev/null +++ b/Java-Ring/src/main/java/org/project/entity/players/Assassin.java @@ -0,0 +1,42 @@ +package org.project.entity.players; + +import org.project.object.armors.Armor; +import org.project.object.weapons.Weapon; +import org.project.entity.Entity; + +public class Assassin extends Assassin { + + public Assassin(String name, 200, 40, weapon, armor) { + + @Override + public void attack(Entity target) { + System.out.println(getName() + " attacks with a" + weapon.getname()); + super.attack(target); + } + + @Override + public void defend() { + System.out.println(getName() + " raises his shield!"); + super.defend(); + } + + @Override + public void takeDamage(int damage) { + System.out.println(getName() + " takes " + damage + " damage!"); + super.takeDamage(damage); + } + + @Override + public void heal(int health) { + System.out.println(getName() + " heals for " + health + " health!"); + super.heal(health); + } + + @Override + public void fillMana(int mana) { + System.out.println(getName() + " restores " + mana + " mana!"); + super.fillMana(mana); + } + } + } +} \ No newline at end of file diff --git a/Java-Ring/src/main/java/org/project/entity/players/Knight.java b/Java-Ring/src/main/java/org/project/entity/players/Knight.java index 14d8fa2..979ad69 100644 --- a/Java-Ring/src/main/java/org/project/entity/players/Knight.java +++ b/Java-Ring/src/main/java/org/project/entity/players/Knight.java @@ -1,6 +1,43 @@ package org.project.entity.players; -// TODO: UPDATE IMPLEMENTATION -public class Knight { - // TODO: DESIGN KNIGHT'S WEAPON AND ARMOR AND IMPLEMENT THE CONSTRUCTOR +import org.project.object.armors.Armor; +import org.project.object.weapons.Weapon; +import org.project.entity.Entity; + +public class Knight extends Player { + + public Knight(String name, Weapon weapon, Armor armor) { + super(name,150,30,weapon,armor); + } + + @Override + public void attack(Entity target) { + System.out.println(getName() + " attacks with a sword!"); + super.attack(target); + } + + @Override + public void defend() { + System.out.println(getName() + " raises his shield!"); + super.defend(); + } + + @Override + public void takeDamage(int damage) { + System.out.println(getName() + " takes " + damage + " damage!"); + super.takeDamage(damage); + } + + @Override + public void heal(int health) { + System.out.println(getName() + " heals for " + health + " health!"); + super.heal(health); + } + + @Override + public void fillMana(int mana) { + System.out.println(getName() + " restores " + mana + " mana!"); + super.fillMana(mana); + } } + diff --git a/Java-Ring/src/main/java/org/project/entity/players/Player.java b/Java-Ring/src/main/java/org/project/entity/players/Player.java index 674905a..f8b1116 100644 --- a/Java-Ring/src/main/java/org/project/entity/players/Player.java +++ b/Java-Ring/src/main/java/org/project/entity/players/Player.java @@ -5,26 +5,29 @@ import org.project.object.weapons.Weapon; // TODO: UPDATE IMPLEMENTATION -public abstract class Player { +public abstract class Player implements Entity{ protected String name; - Weapon weapon; - Armor armor; + protected Weapon weapon; + protected Armor armor; private int hp; private int maxHP; private int mp; private int maxMP; - public Player(String name, int hp, int mp, Weapon weapon, Armor armor) { + public Player(String name, int hp, int mp, Weapon weapon, Armor armor, int maxHP, int maxMP) { this.name = name; - this.hp = hp; - this.mp = mp; - + this.hp = maxHP; + this.mp = maxMP; + this.maxHP = maxHP; + this.maxMP = maxMP; this.weapon = weapon; this.armor = armor; } @Override public void attack(Entity target) { + int damage = weapon.getDamage; + System.out.println(name + " attacks " + ((target instanceof Player) ? ((Player) target).getName() : "the enemy") + " with " + damage + " damage."); target.takeDamage(weapon.getDamage()); } @@ -37,14 +40,14 @@ public void defend() { @Override public void takeDamage(int damage) { hp -= damage - armor.getDefense(); + System.out.println(name + " took " + reducedDamage + " damage. [HP: " + hp + "/" + maxHP + "]"); } @Override public void heal(int health) { hp += health; - if (hp > maxHP) { - hp = maxHP; - } + hp = Math.min(maxHP, hp + health); + System.out.println(name + " healed for " + health + " HP. [HP: " + hp + "/" + maxHP + "]"); } @Override @@ -53,8 +56,16 @@ public void fillMana(int mana) { if (mp > maxMP) { mp = maxMP; } + System.out.println(name + " restored " + mana + " MP. [MP: " + mp + "/" + maxMP + "]"); + } + + public boolean isAlive() { + return hp > 0; } + public void displayStatus() { + System.out.println(name + " [HP: " + hp + "/" + maxHP + ", MP: " + mp + "/" + maxMP + "]"); + } public String getName() { return name; @@ -85,5 +96,4 @@ public Weapon getWeapon() { public Armor getArmor() { return armor; } - } diff --git a/Java-Ring/src/main/java/org/project/entity/players/Wizard.java b/Java-Ring/src/main/java/org/project/entity/players/Wizard.java new file mode 100644 index 0000000..ab2ff51 --- /dev/null +++ b/Java-Ring/src/main/java/org/project/entity/players/Wizard.java @@ -0,0 +1,41 @@ +package org.project.entity.players; + +import org.project.object.armors.Armor; +import org.project.object.weapons.Weapon; +import org.project.entity.Entity; + +public class Wizard extends Player { + public Wizard(String name, Weapon weapon, Armor armor) { + super (name, 200, 40, weapon, armor); + } + + @Override + public void attack(Entity target) { + System.out.println(getName() + " attacks with a" + weapon.getname()); + super.attack(target); + } + + @Override + public void defend() { + System.out.println(getName() + " raises his shield!"); + super.defend(); + } + + @Override + public void takeDamage(int damage) { + System.out.println(getName() + " takes " + damage + " damage!"); + super.takeDamage(damage); + } + + @Override + public void heal(int health) { + System.out.println(getName() + " heals for " + health + " health!"); + super.heal(health); + } + + @Override + public void fillMana(int mana) { + System.out.println(getName() + " restores " + mana + " mana!"); + super.fillMana(mana); + } +} \ No newline at end of file diff --git a/Java-Ring/src/main/java/org/project/object/Object.java b/Java-Ring/src/main/java/org/project/object/Object.java index 922cbd5..a7212a5 100644 --- a/Java-Ring/src/main/java/org/project/object/Object.java +++ b/Java-Ring/src/main/java/org/project/object/Object.java @@ -1,11 +1,21 @@ package org.project.object; -import org.project.entity.Entity; +public abstract class GameObject { + protected String name; + protected double weight; -public interface Object { - void use(Entity target); + public GameObject(String name, double weight) { + this.name = name; + this.weight = weight; + } - /* - TODO: ADD OTHER REQUIRED AND BONUS METHODS - */ + public String getName() { + return name; + } + + public double getWeight() { + return weight; + } + + public abstract void use(); } diff --git a/Java-Ring/src/main/java/org/project/object/armors/Armor.java b/Java-Ring/src/main/java/org/project/object/armors/Armor.java index 346c25e..d8391b6 100644 --- a/Java-Ring/src/main/java/org/project/object/armors/Armor.java +++ b/Java-Ring/src/main/java/org/project/object/armors/Armor.java @@ -1,6 +1,5 @@ package org.project.object.armors; -// TODO: UPDATE IMPLEMENTATION public abstract class Armor { private int defense; private int maxDefense; @@ -9,23 +8,39 @@ public abstract class Armor { private boolean isBroke; - public Armor(int defense, int durability) { - this.defense = defense; - this.durability = durability; + // Constructor that accepts defense and durability + public Armor(int maxDefense, int maxDurability) { + this.maxDefense = maxDefense; + this.defense = maxDefense; // Defense starts at max value + this.maxDurability = maxDurability; + this.durability = maxDurability; // Durability starts at max value + this.isBroke = false; } + // Check if armor is broken public void checkBreak() { if (durability <= 0) { isBroke = true; defense = 0; + System.out.println("Armor is broken! Defense is now 0."); } } - // TODO: (BONUS) UPDATE THE REPAIR METHOD + // Repair armor to its maximum defense and durability public void repair() { - isBroke = false; - defense = maxDefense; - durability = maxDurability; + if (isBroke) { + isBroke = false; + defense = maxDefense; + durability = maxDurability; + System.out.println("Armor repaired. Defense and durability restored."); + } + } + + // Wear down durability over time + public void reduceDurability(int amount) { + durability -= amount; + if (durability < 0) durability = 0; // Ensure durability doesn't go below 0 + checkBreak(); // Check if the armor is broken after taking damage } public int getDefense() { @@ -39,4 +54,12 @@ public int getDurability() { public boolean isBroke() { return isBroke; } -} + + public int getMaxDefense() { + return maxDefense; + } + + public int getMaxDurability() { + return maxDurability; + } +} \ No newline at end of file diff --git a/Java-Ring/src/main/java/org/project/object/armors/KnightArmor.java b/Java-Ring/src/main/java/org/project/object/armors/KnightArmor.java index 0dedcc2..5eccc21 100644 --- a/Java-Ring/src/main/java/org/project/object/armors/KnightArmor.java +++ b/Java-Ring/src/main/java/org/project/object/armors/KnightArmor.java @@ -1,6 +1,28 @@ package org.project.object.armors; -// TODO: UPDATE IMPLEMENTATION -public class KnightArmor { - // TODO: DESIGN ARMOR'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR -} \ No newline at end of file +public class KnightArmor extends Armor { + private static final int EXTRA_DEFENSE = 20; + + public KnightArmor() { + super(50, 100); + } + + @Override + public void repair() { + super.repair(); + System.out.println("⚔️ Knight's armor is repaired, ready for battle!"); + } + + public void boostDefense() { + if (!isBroke()) { + defense += EXTRA_DEFENSE; + System.out.println("💪 Knight's armor defense boosted by " + EXTRA_DEFENSE); + } + } + + @Override + public void reduceDurability(int amount) { + super.reduceDurability(amount); + checkBreak(); + } +} diff --git a/Java-Ring/src/main/java/org/project/object/weapons/Sword.java b/Java-Ring/src/main/java/org/project/object/weapons/Sword.java index a0e3cc3..42dbf74 100644 --- a/Java-Ring/src/main/java/org/project/object/weapons/Sword.java +++ b/Java-Ring/src/main/java/org/project/object/weapons/Sword.java @@ -1,26 +1,40 @@ package org.project.object.weapons; import org.project.entity.Entity; - import java.util.ArrayList; -// TODO: UPDATE IMPLEMENTATION -public class Sword { - /* - THIS IS AN EXAMPLE OF A WEAPON DESIGN. - */ +public class Sword extends Weapon { + private int abilityCharge; - int abilityCharge; + public Sword(int damage, int manaCost) { + super("Sword", damage, manaCost, "Melee", 100); + this.abilityCharge = 0; + } - public Sword() { - // TODO: DESIGN SWORD'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR + @Override + public void use(Entity target) { + super.use(target); + System.out.println("Sword attack dealt " + getDamage() + " damage!"); } - // TODO: (BONUS) UPDATE THE UNIQUE ABILITY public void uniqueAbility(ArrayList targets) { abilityCharge += 2; for (Entity target : targets) { target.takeDamage(getDamage()); + System.out.println("Sword's unique ability dealt " + getDamage() + " damage to " + target.getClass().getSimpleName()); } } + + public int getAbilityCharge() { + return abilityCharge; + } + + public String getWeaponType() { + return "Melee Sword"; + } + + public void rechargeAbility() { + abilityCharge = 0; + System.out.println("Sword's ability is fully recharged."); + } } diff --git a/Java-Ring/src/main/java/org/project/object/weapons/Weapon.java b/Java-Ring/src/main/java/org/project/object/weapons/Weapon.java index 35e1ecc..9c0a564 100644 --- a/Java-Ring/src/main/java/org/project/object/weapons/Weapon.java +++ b/Java-Ring/src/main/java/org/project/object/weapons/Weapon.java @@ -2,23 +2,27 @@ import org.project.entity.Entity; -// TODO: UPDATE IMPLEMENTATION public abstract class Weapon { + private String name; private int damage; private int manaCost; + private String weaponType; + private int durability; - /* - TODO: ADD OTHER REQUIRED AND BONUS ATTRIBUTES - */ - - public Weapon(int damage, int manaCost) { + public Weapon(String name, int damage, int manaCost, String weaponType, int durability) { + this.name = name; this.damage = damage; this.manaCost = manaCost; + this.weaponType = weaponType; + this.durability = durability; } - @Override public void use(Entity target) { target.takeDamage(damage); + durability--; + if (durability <= 0) { + System.out.println("Weapon " + name + " is broken!"); + } } public int getDamage() { @@ -29,7 +33,19 @@ public int getManaCost() { return manaCost; } - /* - TODO: ADD OTHER REQUIRED AND BONUS METHODS - */ + public String getName() { + return name; + } + + public String getWeaponType() { + return weaponType; + } + + public int getDurability() { + return durability; + } + + public boolean isBroken() { + return durability <= 0; + } }