diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..935cb4a --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..c16bbb5 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..4158879 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index a20905f..be3fc8d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,13 @@ + + + + diff --git a/Java-Knight/pom.xml b/Java-Knight/pom.xml new file mode 100644 index 0000000..863ff5c --- /dev/null +++ b/Java-Knight/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + org.project + Java-Knight + 1.0-SNAPSHOT + + + 25 + 25 + UTF-8 + + + \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/Main.java b/Java-Knight/src/main/java/org/project/Main.java new file mode 100644 index 0000000..c2e0550 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/Main.java @@ -0,0 +1,15 @@ +package org.project; + +import org.project.location.Location; + +import java.util.ArrayList; +import java.util.List; + +public class Main { + public static void main(String[] args) { + // TODO: ADD SOME LOCATIONS TO YOUR GAME + List locations = new ArrayList<>(); + + // TODO: IMPLEMENT GAMEPLAY + } +} \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/entity/Entity.java b/Java-Knight/src/main/java/org/project/entity/Entity.java new file mode 100644 index 0000000..2a060f9 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/entity/Entity.java @@ -0,0 +1,21 @@ +package org.project.entity; + +public interface Entity { + void attack(Entity target); + + void defend(); + + void heal(int health); + + void fillMana(int mana); + + void takeDamage(int damage); + + int getMaxHP(); + + int getMaxMP(); + + /* + TODO: ADD OTHER REQUIRED AND BONUS METHODS + */ +} diff --git a/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java b/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java new file mode 100644 index 0000000..1fcc491 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java @@ -0,0 +1,35 @@ +package org.project.entity.enemies; + +import org.project.object.weapons.Weapon; + +// TODO: UPDATE IMPLEMENTATION +public abstract class Enemy { + Weapon weapon; + private int hp; + private int mp; + + public Enemy(int hp, int mp, Weapon weapon) { + this.hp = hp; + this.mp = mp; + + this.weapon = weapon; + } + + // TODO: (BONUS) UPDATE THE FORMULA OF TAKING DAMAGE + @Override + public void takeDamage(int damage) { + hp -= damage; + } + + public int getHp() { + return hp; + } + + public int getMp() { + return mp; + } + + public Weapon getWeapon() { + return weapon; + } +} diff --git a/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java b/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java new file mode 100644 index 0000000..8c3e638 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java @@ -0,0 +1,6 @@ +package org.project.entity.enemies; + +// TODO: UPDATE IMPLEMENTATION +public class Skeleton { + // TODO: DESIGN ENEMY'S WEAPON AND ARMOR AND IMPLEMENT THE CONSTRUCTOR +} diff --git a/Java-Knight/src/main/java/org/project/entity/players/Knight.java b/Java-Knight/src/main/java/org/project/entity/players/Knight.java new file mode 100644 index 0000000..14d8fa2 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/entity/players/Knight.java @@ -0,0 +1,6 @@ +package org.project.entity.players; + +// TODO: UPDATE IMPLEMENTATION +public class Knight { + // TODO: DESIGN KNIGHT'S WEAPON AND ARMOR AND IMPLEMENT THE CONSTRUCTOR +} diff --git a/Java-Knight/src/main/java/org/project/entity/players/Player.java b/Java-Knight/src/main/java/org/project/entity/players/Player.java new file mode 100644 index 0000000..674905a --- /dev/null +++ b/Java-Knight/src/main/java/org/project/entity/players/Player.java @@ -0,0 +1,89 @@ +package org.project.entity.players; + +import org.project.entity.Entity; +import org.project.object.armors.Armor; +import org.project.object.weapons.Weapon; + +// TODO: UPDATE IMPLEMENTATION +public abstract class Player { + protected String name; + Weapon weapon; + 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) { + this.name = name; + this.hp = hp; + this.mp = mp; + + this.weapon = weapon; + this.armor = armor; + } + + @Override + public void attack(Entity target) { + target.takeDamage(weapon.getDamage()); + } + + @Override + public void defend() { + // TODO: (BONUS) IMPLEMENT A DEFENSE METHOD FOR SHIELDS + } + + // TODO: (BONUS) UPDATE THE FORMULA OF TAKING DAMAGE + @Override + public void takeDamage(int damage) { + hp -= damage - armor.getDefense(); + } + + @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; + } + } + + + public String getName() { + return name; + } + + public int getHp() { + return hp; + } + + @Override + public int getMaxHP() { + return maxHP; + } + + public int getMp() { + return mp; + } + + @Override + public int getMaxMP() { + return maxMP; + } + + public Weapon getWeapon() { + return weapon; + } + + public Armor getArmor() { + return armor; + } + +} diff --git a/Java-Knight/src/main/java/org/project/location/Location.java b/Java-Knight/src/main/java/org/project/location/Location.java new file mode 100644 index 0000000..dfa9cb8 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/location/Location.java @@ -0,0 +1,32 @@ +package org.project.location; + +import org.project.entity.enemies.Enemy; + +import java.util.ArrayList; + +public class Location { + private String name; + + private ArrayList enemies; + + public Location(ArrayList locations, ArrayList enemies) { + this.locations = locations; + this.enemies = enemies; + } + + /* + TODO: (BONUS) RESET EACH LOCATION AFTER PLAYER LEAVES + */ + + public String getName() { + return name; + } + + public ArrayList getLocations() { + return locations; + } + + public ArrayList getEnemies() { + return enemies; + } +} diff --git a/Java-Knight/src/main/java/org/project/object/Object.java b/Java-Knight/src/main/java/org/project/object/Object.java new file mode 100644 index 0000000..922cbd5 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/object/Object.java @@ -0,0 +1,11 @@ +package org.project.object; + +import org.project.entity.Entity; + +public interface Object { + void use(Entity target); + + /* + TODO: ADD OTHER REQUIRED AND BONUS METHODS + */ +} diff --git a/Java-Knight/src/main/java/org/project/object/armors/Armor.java b/Java-Knight/src/main/java/org/project/object/armors/Armor.java new file mode 100644 index 0000000..346c25e --- /dev/null +++ b/Java-Knight/src/main/java/org/project/object/armors/Armor.java @@ -0,0 +1,42 @@ +package org.project.object.armors; + +// TODO: UPDATE IMPLEMENTATION +public abstract class Armor { + private int defense; + private int maxDefense; + private int durability; + private int maxDurability; + + private boolean isBroke; + + public Armor(int defense, int durability) { + this.defense = defense; + this.durability = durability; + } + + public void checkBreak() { + if (durability <= 0) { + isBroke = true; + defense = 0; + } + } + + // TODO: (BONUS) UPDATE THE REPAIR METHOD + public void repair() { + isBroke = false; + defense = maxDefense; + durability = maxDurability; + } + + public int getDefense() { + return defense; + } + + public int getDurability() { + return durability; + } + + public boolean isBroke() { + return isBroke; + } +} diff --git a/Java-Knight/src/main/java/org/project/object/armors/KnightArmor.java b/Java-Knight/src/main/java/org/project/object/armors/KnightArmor.java new file mode 100644 index 0000000..0dedcc2 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/object/armors/KnightArmor.java @@ -0,0 +1,6 @@ +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 diff --git a/Java-Knight/src/main/java/org/project/object/consumables/Consumable.java b/Java-Knight/src/main/java/org/project/object/consumables/Consumable.java new file mode 100644 index 0000000..fd8962c --- /dev/null +++ b/Java-Knight/src/main/java/org/project/object/consumables/Consumable.java @@ -0,0 +1,8 @@ +package org.project.object.consumables; + +// TODO: UPDATE IMPLEMENTATION +public abstract class Consumable { + /* + TODO: ADD OTHER REQUIRED AND BONUS METHODS + */ +} diff --git a/Java-Knight/src/main/java/org/project/object/consumables/Flask.java b/Java-Knight/src/main/java/org/project/object/consumables/Flask.java new file mode 100644 index 0000000..d7e515d --- /dev/null +++ b/Java-Knight/src/main/java/org/project/object/consumables/Flask.java @@ -0,0 +1,16 @@ +package org.project.object.consumables; + +import org.project.entity.Entity; + +// TODO: UPDATE IMPLEMENTATION +public class Flask { + /* + THIS IS AN EXAMPLE OF A CONSUMABLE DESIGN. + */ + + // TODO: (BONUS) UPDATE USE METHOD + @Override + public void use(Entity target) { + target.heal(target.getMaxHP() / 10); + } +} diff --git a/Java-Knight/src/main/java/org/project/object/weapons/Sword.java b/Java-Knight/src/main/java/org/project/object/weapons/Sword.java new file mode 100644 index 0000000..a0e3cc3 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/object/weapons/Sword.java @@ -0,0 +1,26 @@ +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. + */ + + int abilityCharge; + + public Sword() { + // TODO: DESIGN SWORD'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR + } + + // TODO: (BONUS) UPDATE THE UNIQUE ABILITY + public void uniqueAbility(ArrayList targets) { + abilityCharge += 2; + for (Entity target : targets) { + target.takeDamage(getDamage()); + } + } +} diff --git a/Java-Knight/src/main/java/org/project/object/weapons/Weapon.java b/Java-Knight/src/main/java/org/project/object/weapons/Weapon.java new file mode 100644 index 0000000..35e1ecc --- /dev/null +++ b/Java-Knight/src/main/java/org/project/object/weapons/Weapon.java @@ -0,0 +1,35 @@ +package org.project.object.weapons; + +import org.project.entity.Entity; + +// TODO: UPDATE IMPLEMENTATION +public abstract class Weapon { + private int damage; + private int manaCost; + + /* + TODO: ADD OTHER REQUIRED AND BONUS ATTRIBUTES + */ + + public Weapon(int damage, int manaCost) { + this.damage = damage; + this.manaCost = manaCost; + } + + @Override + public void use(Entity target) { + target.takeDamage(damage); + } + + public int getDamage() { + return damage; + } + + public int getManaCost() { + return manaCost; + } + + /* + TODO: ADD OTHER REQUIRED AND BONUS METHODS + */ +} diff --git a/README.md b/README.md index e006786..8555a93 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ git checkout -b develop A well-structured OOP hierarchy is crucial. Avoid duplicating code by placing shared logic in abstract classes. -- **Entities & Locations:** You have `Entity`, `Object`, and `Location`. +- **Entities & Locations:** You have `Entity`, `Object`(Bonus) , and `Location`. - **Players:** `Player` is an abstract class implementing `Entity`. Subclasses: `Wizard`, `Knight`, `Assassin`. - **Base Stat Differences:** Each class must have distinct starting stats. For example: - **Knight:** Highest Base Damage. @@ -47,7 +47,11 @@ A well-structured OOP hierarchy is crucial. Avoid duplicating code by placing sh - **Assassin:** Highest Max Stamina/Mana. - **Enemies:** `Enemy` is an abstract class implementing `Entity`. Subclasses: `Skeleton`, `Goblin`, `Vampire`, and **`Dragon`**. - **The Boss:** Even though `Dragon` is the final boss, it **must** be a subclass of `Enemy` to inherit common combat properties, while possessing extremely high stats and unique mechanics. -- **Objects:** `Consumable`, `Armor`, `Weapon` are abstract classes implementing `Object`. +- **Objects (Bonus):** `Consumable`, `Armor`, `Weapon` are abstract classes implementing `Object`. example : + - KnightArmor extends Armor - you can add more subclasses of Armor for extra score + - Sword extends Weapon - you can add more subclasses of Weapon for extra score + +![structure](Readme_Pictures/structure.png) ### 3️⃣ Step 3: Implement Player & Monster Methods 🏹 diff --git a/Readme_Pictures/structure.png b/Readme_Pictures/structure.png new file mode 100644 index 0000000..3b53890 Binary files /dev/null and b/Readme_Pictures/structure.png differ