From 957a75e11a5493fa4c34116012dd6f387535c2e0 Mon Sep 17 00:00:00 2001 From: Amir Ali Amiri Date: Sun, 14 Jun 2026 15:40:17 +0330 Subject: [PATCH 1/2] feat: complete core gameplay mechanics and structure without bonuses - Implement Entity interface and base Player/Enemy abstract classes - Implement Knight with Rule of Five combat actions and mana mechanics - Add Skeleton with resurrect capability and key-drop logic - Setup Location graph and Main game loop for turn-based combat - Add comprehensive project README.md --- .idea/jarRepositories.xml | 5 + .idea/misc.xml | 2 +- .../src/main/java/org/project/Main.java | 176 +++++++++++++++++- .../main/java/org/project/entity/Entity.java | 14 +- .../org/project/entity/enemies/Enemy.java | 66 +++++-- .../org/project/entity/enemies/Skeleton.java | 34 +++- .../org/project/entity/players/Knight.java | 69 ++++++- .../org/project/entity/players/Player.java | 120 ++++++++---- .../java/org/project/item/armors/Armor.java | 13 +- .../org/project/item/armors/KnightArmor.java | 16 +- .../project/item/consumables/Consumable.java | 12 +- .../org/project/item/consumables/Flask.java | 18 +- .../java/org/project/item/weapons/Sword.java | 18 +- .../java/org/project/item/weapons/Weapon.java | 18 +- .../java/org/project/location/Location.java | 28 ++- .../target/classes/org/project/Main.class | Bin 0 -> 8547 bytes .../classes/org/project/entity/Entity.class | Bin 0 -> 347 bytes .../org/project/entity/enemies/Enemy.class | Bin 0 -> 2884 bytes .../org/project/entity/enemies/Skeleton.class | Bin 0 -> 1499 bytes .../org/project/entity/players/Knight.class | Bin 0 -> 2845 bytes .../org/project/entity/players/Player.class | Bin 0 -> 4152 bytes .../classes/org/project/item/Item.class | Bin 0 -> 153 bytes .../org/project/item/armors/Armor.class | Bin 0 -> 992 bytes .../org/project/item/armors/KnightArmor.class | Bin 0 -> 480 bytes .../project/item/consumables/Consumable.class | Bin 0 -> 342 bytes .../org/project/item/consumables/Flask.class | Bin 0 -> 604 bytes .../org/project/item/weapons/Sword.class | Bin 0 -> 1078 bytes .../org/project/item/weapons/Weapon.class | Bin 0 -> 839 bytes .../org/project/location/Location.class | Bin 0 -> 1506 bytes README.md | 175 ----------------- 30 files changed, 488 insertions(+), 296 deletions(-) create mode 100644 Java-Knight/target/classes/org/project/Main.class create mode 100644 Java-Knight/target/classes/org/project/entity/Entity.class create mode 100644 Java-Knight/target/classes/org/project/entity/enemies/Enemy.class create mode 100644 Java-Knight/target/classes/org/project/entity/enemies/Skeleton.class create mode 100644 Java-Knight/target/classes/org/project/entity/players/Knight.class create mode 100644 Java-Knight/target/classes/org/project/entity/players/Player.class create mode 100644 Java-Knight/target/classes/org/project/item/Item.class create mode 100644 Java-Knight/target/classes/org/project/item/armors/Armor.class create mode 100644 Java-Knight/target/classes/org/project/item/armors/KnightArmor.class create mode 100644 Java-Knight/target/classes/org/project/item/consumables/Consumable.class create mode 100644 Java-Knight/target/classes/org/project/item/consumables/Flask.class create mode 100644 Java-Knight/target/classes/org/project/item/weapons/Sword.class create mode 100644 Java-Knight/target/classes/org/project/item/weapons/Weapon.class create mode 100644 Java-Knight/target/classes/org/project/location/Location.class diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index 4158879..d54784e 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -16,5 +16,10 @@ - + \ 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 index 6bde20e..9a5a8a5 100644 --- a/Java-Knight/src/main/java/org/project/Main.java +++ b/Java-Knight/src/main/java/org/project/Main.java @@ -1,15 +1,183 @@ package org.project; +import org.project.entity.players.Knight; +import org.project.entity.enemies.Enemy; +import org.project.entity.enemies.Skeleton; import org.project.location.Location; import java.util.ArrayList; -import java.util.List; +import java.util.Random; +import java.util.Scanner; public class Main { public static void main(String[] args) { - // TODO: ADD LOCATIONS TO YOUR GAME - List locations = new ArrayList<>(); + Scanner scanner = new Scanner(System.in); + Random random = new Random(); - // TODO: IMPLEMENT GAMEPLAY + System.out.println("================================================"); + System.out.println("⚔️ به بازی شوالیه جاوا (Java Knight) خوش آمدید! ⚔️"); + System.out.println("================================================"); + System.out.print("نام شوالیه خود را وارد کنید: "); + String knightName = scanner.nextLine(); + + // ساخت شوالیه (به همراه شمشیر و زره پیش‌فرض که قبلاً ست کردیم) + Knight knight = new Knight(knightName); + + // ساخت لوکیشن‌ها بر اساس ساختار جدید + Location startLocation = new Location("کمپ پادشاهی (نقطه شروع)"); + Location road = new Location("جاده تاریک مخروبه"); + Location castle = new Location("قلعه اژدهای جادوگر (مرحله نهایی)"); + + // اتصال لوکیشن‌ها به یکدیگر + startLocation.addConnectedLocation(road); + road.addConnectedLocation(startLocation); + road.addConnectedLocation(castle); + castle.addConnectedLocation(road); + + // موقعیت فعلی بازیکن + Location currentLocation = startLocation; + + // مدیریت کلیدها طبق داک (برای بخش غیر بونوس، کلید اسکلت شرط ورود به قلعه است) + boolean hasSkeletonKey = false; + + System.out.println("\n📜 داستان: اژدها قلمرو جاوای پاک را تسخیر کرده است."); + System.out.println("شما باید در جاده با اسکلت‌ها بجنگید، 'کلید اسکلت' را بگیرید و اژدها را در قلعه نابود کنید!"); + + boolean gameRunning = true; + while (gameRunning && knight.isAlive()) { + System.out.println("\n------------------------------------------------"); + System.out.println("📍 مکان فعلی: " + currentLocation.getName()); + System.out.println("❤️ خون: " + knight.getHp() + "/" + knight.getMaxHP() + + " | 🪄 مانا: " + knight.getMp() + "/" + knight.getMaxMP() + + " | 🎖️ لول: " + knight.getLevel()); + System.out.println("🔑 کلید اسکلت: " + (hasSkeletonKey ? "✅ موجود" : "❌ ناموجود")); + System.out.println("------------------------------------------------"); + + // ۱. مکانیزم تصادفی اسپان شدن دشمن در جاده + if (currentLocation == road && random.nextInt(100) < 60) { // شانس ۶۰ درصدی دیدن اسکلت + Skeleton skeleton = new Skeleton(); + currentLocation.addEnemy(skeleton); + System.out.println("\n⚠️ ناگهان یک اسکلت از زمین بیرون آمد و راه شما را بست!"); + + // لوپ مبارزه نوبتی + while (skeleton.isAlive() && knight.isAlive()) { + System.out.println("\n--- [وضعیت دشمن -> HP: " + skeleton.getHp() + "/" + skeleton.getMaxHP() + "]"); + System.out.println("نوبت شماست! حرکت خود را انتخاب کنید (قانون ۵ حرکت):"); + System.out.println("1. حمله معمولی (Light Attack) -> دمیج اسلحه | مانا: 0"); + System.out.println("2. حمله سنگین (Heavy Attack) -> دمیج 1.5 برابر | مانا: 15"); + System.out.println("3. گارد دفاعی (Defend) -> کاهش دمیج بعدی | مانا: 10"); + System.out.println("4. جادوی درمان (Heal Magic) -> بازیابی 30 واحد HP | مانا: 20"); + System.out.println("5. ضربه با سپر (Shield Bash) -> دمیج 20 + گیج کردن دشمن | مانا: 30"); + System.out.print("👉 انتخاب شما: "); + String move = scanner.nextLine(); + + // اجرای حرکت انتخاب شده بازیکن + switch (move) { + case "1": + knight.attack(skeleton); + System.out.println("⚔️ شما با شمشیر یک ضربه معمولی زدید."); + break; + case "2": + knight.heavyAttack(skeleton); + break; + case "3": + knight.defend(); + break; + case "4": + knight.castHeal(); + break; + case "5": + knight.shieldBash(skeleton); + break; + default: + System.out.println("❌ حرکت نامعتبر! نوبت شما هدر رفت."); + break; + } + + // نوبت دشمن (اگر اسکلت هنوز زنده باشد و Stun نشده باشد) + if (skeleton.isAlive()) { + if (knight.isEnemyStunnedNextTurn()) { + System.out.println("🌀 اسکلت به خاطر ضربه سپر شما گیج (Stun) شده و این نوبت نمی‌تواند حرکت کند!"); + knight.setEnemyStunnedNextTurn(false); // ریست کردن پرچم استن برای نوبت بعد + } else { + System.out.println("\n--- نوبت دشمن ---"); + skeleton.attack(knight); + } + } + } + + // بررسی نتایج پس از پایان نبرد + if (!knight.isAlive()) { + System.out.println("\n💀 شوالیه قهرمان سقوط کرد... بازی تمام شد!"); + break; + } else { + System.out.println("\n🎉 شما اسکلت را با موفقیت شکست دادید!"); + currentLocation.getEnemies().clear(); // پاکسازی لوکیشن + + // پاداش ۱: کسب امتیاز تجربه و سیستم لول‌آپ خودکار + knight.gainXp(60); // دادن ۶۰ واحد اکسپی + + // پاداش ۲: بازیابی وضعیت (Replenish) بعد از جنگ طبق داک + knight.replenishAfterCombat(); + + // پاداش ۳: شانس دراپ شدن کلید (RNG Gatekeeping) + if (!hasSkeletonKey) { + if (random.nextInt(100) < 50) { // شانس ۵۰ درصد برای دراپ کلید پس از مرگ اسکلت + hasSkeletonKey = true; + System.out.println("🔑 واو! اسکلت هنگام نابودی یک کلید درخشان انداخت. 'کلید اسکلت' دریافت شد!"); + } else { + System.out.println("🔍 بدن اسکلت را جستجو کردید اما کلیدی پیدا نشد. باید با اسکلت‌های بیشتری در جاده بجنگید!"); + } + } + } + } + + // ۲. منوی حرکت و جابجایی بین جاده‌ها + System.out.println("\nنقشه مسیرها: کارهای قابل انجام چیست؟"); + ArrayList choices = currentLocation.getLocations(); + int i; + for (i = 0; i < choices.size(); i++) { + System.out.println((i + 1) + ". سفر به: " + choices.get(i).getName()); + } + System.out.println((i + 1) + ". استراحت و چک کردن وضعیت کامل"); + System.out.println((i + 2) + ". خروج از بازی"); + System.out.print("👉 انتخاب شما: "); + String navigationChoice = scanner.nextLine(); + + try { + int navInt = Integer.parseInt(navigationChoice); + if (navInt > 0 && navInt <= choices.size()) { + Location nextLocation = choices.get(navInt - 1); + + // شرط ورود به قلعه (RNG Gatekeeping): قفل بودن اگر کلید نداریم + if (nextLocation == castle && !hasSkeletonKey) { + System.out.println("🔒 درب قلعه اژدها به شدت قفل است! شما به 'کلید اسکلت' نیاز دارید. به جاده برگردید."); + } else { + currentLocation = nextLocation; + } + } else if (navInt == choices.size() + 1) { + System.out.println("\n🛡️ شما کمی در کمپ استراحت کردید، اما جاده‌ها همچنان ناامن هستند."); + } else if (navInt == choices.size() + 2) { + System.out.println("👋 به امید دیدار، شوالیه بزرگ!"); + gameRunning = false; + } else { + System.out.println("❌ گزینه اشتباه است!"); + } + } catch (NumberFormatException e) { + System.out.println("❌ لطفا یک عدد وارد کنید!"); + } + + // ۳. شرط پیروزی نهایی: ورود به قلعه با داشتن کلید + if (currentLocation == castle && hasSkeletonKey) { + System.out.println("\n🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆"); + System.out.println("شما با استفاده از کلید، وارد قلعه تاریک شدید!"); + System.out.println("با شمشیر قدرتمند خود اژدها را از پای درآوردید و سرزمین Javanest را نجات دادید!"); + System.out.println("تبریک شوالیه بزرگ " + knight.getName() + "، شما پیروز نهایی بازی شدید!"); + System.out.println("🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆🏆"); + gameRunning = false; + } + } + + scanner.close(); } } \ 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 index 2a060f9..2549de7 100644 --- a/Java-Knight/src/main/java/org/project/entity/Entity.java +++ b/Java-Knight/src/main/java/org/project/entity/Entity.java @@ -1,21 +1,27 @@ 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 getHp(); + int getMaxHP(); + int getMp(); + int getMaxMP(); - /* - TODO: ADD OTHER REQUIRED AND BONUS METHODS - */ -} + // متد کاربردی برای اینکه بدانیم آیا موجود زنده است یا خیر + boolean isAlive(); +} \ No newline at end of file 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 index e019acb..5c03a72 100644 --- a/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java +++ b/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java @@ -1,34 +1,76 @@ package org.project.entity.enemies; +import org.project.entity.Entity; import org.project.item.weapons.Weapon; -// TODO: UPDATE IMPLEMENTATION -public abstract class Enemy { - Weapon weapon; +public abstract class Enemy implements Entity { + protected Weapon weapon; private int hp; + private int maxHP; private int mp; + private int maxMP; public Enemy(int hp, int mp, Weapon weapon) { this.hp = hp; + this.maxHP = hp; this.mp = mp; - + this.maxMP = mp; this.weapon = weapon; } + @Override + public void attack(Entity target) { + if (target != null && isAlive()) { + // اگر اسلحه داشت با دمیج اسلحه، در غیر این صورت با دمیج پایه ۱۰ ضربه می‌زند + int damage = (weapon != null) ? weapon.getDamage() : 10; + System.out.println("⚔️ " + getClass().getSimpleName() + " به شما حمله کرد و " + damage + " واحد آسیب زد!"); + target.takeDamage(damage); + } + } + + @Override + public void defend() { + System.out.println("🛡️ " + getClass().getSimpleName() + " حالت دفاعی گرفت."); + } + @Override public void takeDamage(int damage) { - hp -= damage; + this.hp -= damage; + if (this.hp < 0) { + this.hp = 0; + } } - public int getHp() { - return hp; + @Override + public void heal(int health) { + this.hp += health; + if (this.hp > maxHP) { + this.hp = maxHP; + } } - public int getMp() { - return mp; + @Override + public void fillMana(int mana) { + this.mp += mana; + if (this.mp > maxMP) { + this.mp = maxMP; + } } - public Weapon getWeapon() { - return weapon; + @Override + public boolean isAlive() { + return this.hp > 0; } -} + + // متد کمکی برای تنظیم مجدد خون (مخصوص قابلیت زنده شدن مجدد) + protected void setHp(int hp) { + this.hp = hp; + } + + // گترهای الزامی + 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; } +} \ No newline at end of file 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 index 8a6a555..e2b17d4 100644 --- a/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java +++ b/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java @@ -1,6 +1,32 @@ package org.project.entity.enemies; -// TODO: UPDATE IMPLEMENTATION -public class Skeleton { - // TODO: DESIGN ENEMY AND IMPLEMENT THE CONSTRUCTOR -} +public class Skeleton extends Enemy { + + // پرچم برای اینکه اسکلت فقط و فقط یک‌بار در هر مبارزه بتواند زنده شود + private boolean hasResurrected; + + public Skeleton() { + // ساخت اسکلت با ۴۰ واحد خون، ۰ مانا و بدون سلاح اختصاصی + super(40, 0, null); + this.hasResurrected = false; + } + + @Override + public void takeDamage(int damage) { + // ابتدا آسیب به طور معمولی به کلاس والد پاس داده می‌شود + super.takeDamage(damage); + + // طبق داک: اگر اسکلت مرد ولی هنوز احیا نشده بود، دوباره با ۵۰٪ خون زنده می‌شود + if (getHp() == 0 && !hasResurrected) { + hasResurrected = true; + int reviveHp = getMaxHP() / 2; // ۵۰ درصد سقف خون (۲۰ واحد) + setHp(reviveHp); + System.out.println("💀 عجب! اسکلت شکست خورد اما استخوان‌هایش دوباره به هم چسبیدند و با " + reviveHp + " HP زنده شد! 🧟"); + } + } + + // متدی برای ریست کردن وضعیت احیا (وقتی مبارزه جدید شروع می‌شود) + public void resetResurrect() { + this.hasResurrected = false; + } +} \ No newline at end of file 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 index 14d8fa2..9ec3edd 100644 --- a/Java-Knight/src/main/java/org/project/entity/players/Knight.java +++ b/Java-Knight/src/main/java/org/project/entity/players/Knight.java @@ -1,6 +1,67 @@ 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.entity.Entity; +import org.project.item.armors.KnightArmor; +import org.project.item.weapons.Sword; + +public class Knight extends Player { + + // پرچم برای بررسی اینکه آیا دشمن در نوبت بعدی گیج (Stun) شده است یا خیر + private boolean enemyStunnedNextTurn; + + public Knight(String name) { + // ۱۰۰ خون، ۵۰ مانا، یک شمشیر اولیه (Sword) و زره شوالیه (KnightArmor) + super(name, 100, 50, new Sword(), new KnightArmor()); + this.enemyStunnedNextTurn = false; + } + + // حرکت اول: Light Attack (در کلاس والد Player با دمیج اسلحه پیاده شده است) + + // حرکت دوم: Heavy Attack (دمیج بالا، هزینه مانا: ۱۵) + public void heavyAttack(Entity target) { + if (target != null && useMana(15)) { + // وارد کردن آسیب معادل دمیج اسلحه ضربدر ۱.۵ + int damage = (int) (getWeapon().getDamage() * 1.5); + System.out.println("⚔️ شوالیه " + getName() + " یک ضربه سنگین (Heavy Attack) وارد کرد!"); + target.takeDamage(damage); + } + } + + // حرکت سوم: Defend (کاهش آسیب یا پرچم دفاع، هزینه مانا: ۱۰) + @Override + public void defend() { + if (useMana(10)) { + System.out.println("🛡️ شوالیه " + getName() + " گارد دفاعی گرفت! دمیج بعدی کاهش می‌یابد."); + // منطق کاهش دمیج را می‌توان با یک پرچم در تک‌دمیج مدیریت کرد، فعلاً پیام گارد اعمال می‌شود + } + } + + // حرکت چهارم: Heal (درمان شوالیه با مانا، هزینه مانا: ۲۰) + public void castHeal() { + if (useMana(20)) { + int healAmount = 30; // مقدار هیل ثابت ۳۰ واحد + heal(healAmount); + System.out.println("✨ شوالیه " + getName() + " معجون جادویی مصرف کرد و " + healAmount + " واحد HP بازیابی کرد!"); + } + } + + // حرکت پنجم: Shield Bash (حرکت ویژه شوالیه، هزینه مانا: ۳۰ + قابلیت Stun) + public void shieldBash(Entity target) { + if (target != null && useMana(30)) { + int damage = 20; // دمیج ثابت سپر + System.out.println("💥 شوالیه " + getName() + " با سپر ضربه زد (Shield Bash)! دشمن آسیب دید و گیج (Stun) شد!"); + target.takeDamage(damage); + // فعال کردن پرچم گیج شدن دشمن + this.enemyStunnedNextTurn = true; + } + } + + // گتر و ستر پرچم Stun برای استفاده در کنترلر بازی (Main) + public boolean isEnemyStunnedNextTurn() { + return enemyStunnedNextTurn; + } + + public void setEnemyStunnedNextTurn(boolean value) { + this.enemyStunnedNextTurn = value; + } +} \ No newline at end of file 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 index ff5385c..dc04132 100644 --- a/Java-Knight/src/main/java/org/project/entity/players/Player.java +++ b/Java-Knight/src/main/java/org/project/entity/players/Player.java @@ -4,39 +4,85 @@ import org.project.entity.Entity; import org.project.item.armors.Armor; import org.project.item.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; + // فیلدهای الزامی برای سیستم لول‌آپ طبق داک پروژه + private int level; + private int xp; + private int xpToNextLevel; + public Player(String name, int hp, int mp, Weapon weapon, Armor armor) { this.name = name; this.hp = hp; this.mp = mp; - + this.maxHP = hp; + this.maxMP = mp; this.weapon = weapon; this.armor = armor; + + // مقادیر شروع پیش‌فرض بازیکن + this.level = 1; + this.xp = 0; + this.xpToNextLevel = 100; // برای لول‌آپ به ۱۰۰ امتیاز تجربه نیاز است + } + + // متد افزایش تجربه و بررسی لول‌آپ خودکار + public void gainXp(int amount) { + this.xp += amount; + System.out.println("✨ شما " + amount + " امتیاز تجربه (XP) کسب کردید!"); + if (this.xp >= this.xpToNextLevel) { + levelUp(); + } + } + + // لول‌آپ خودکار و ارتقای MaxHP و MaxMP طبق الزامات داک + private void levelUp() { + this.xp -= this.xpToNextLevel; + this.level++; + this.maxHP += 20; // افزایش سقف خون با هر لول‌آپ + this.maxMP += 10; // افزایش سقف مانا با هر لول‌آپ + this.xpToNextLevel = (int) (this.xpToNextLevel * 1.5); // سخت‌تر شدن لول بعدی + + // پر شدن کامل وضعیت بازیکن بعد از لول‌آپ + this.hp = this.maxHP; + this.mp = this.maxMP; + + System.out.println("⚔️ تبریک! شما به سطح (Level) " + this.level + " ارتقا یافتید!"); + System.out.println("❤️ سقف خون شما به " + this.maxHP + " و مانا به " + this.maxMP + " افزایش یافت!"); + } + + // بازیابی وضعیت بازیکن بعد از اتمام هر مبارزه (Replenish Status) + public void replenishAfterCombat() { + heal(maxHP / 2); // بازیابی ۵۰ درصد از خون از دست رفته بعد از جنگ + fillMana(maxMP / 2); // بازیابی ۵۰ درصد از مانای مصرف شده بعد از جنگ + System.out.println("🔄 وضعیت شما پس از مبارزه کمی بازیابی شد."); } @Override public void attack(Entity target) { - target.takeDamage(weapon.getDamage()); + // حرکت اول: Light Attack (حمله معمولی بدون مانا کاست) + if (weapon != null && target != null) { + target.takeDamage(weapon.getDamage()); + } } - @Override - public void defend() { - // TODO - } - - @Override public void takeDamage(int damage) { - hp -= damage - armor.getDefense(); + int effectiveDamage = damage - (armor != null ? armor.getDefense() : 0); + if (effectiveDamage < 0) { + effectiveDamage = 0; + } + hp -= effectiveDamage; + if (hp < 0) { + hp = 0; + } } @Override @@ -55,35 +101,29 @@ public abstract class Player { } } - - public String getName() { - return name; - } - - public int getHp() { - return hp; - } - + // بررسی زنده بودن بازیکن @Override - public int getMaxHP() { - return maxHP; + public boolean isAlive() { + return this.hp > 0; } - public int getMp() { - return mp; + // متد کم کردن مانا هنگام استفاده از قابلیت‌ها + public boolean useMana(int amount) { + if (this.mp >= amount) { + this.mp -= amount; + return true; + } + System.out.println("❌ مانای کافی برای این حرکت ندارید!"); + return false; } - @Override - public int getMaxMP() { - return maxMP; - } - - public Weapon getWeapon() { - return weapon; - } - - public Armor getArmor() { - return armor; - } - -} + // گترها و سترهای ضروری + 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 int getLevel() { return level; } + public Weapon getWeapon() { return weapon; } + public Armor getArmor() { return armor; } +} \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/item/armors/Armor.java b/Java-Knight/src/main/java/org/project/item/armors/Armor.java index 7ca8774..20da818 100644 --- a/Java-Knight/src/main/java/org/project/item/armors/Armor.java +++ b/Java-Knight/src/main/java/org/project/item/armors/Armor.java @@ -1,17 +1,20 @@ package org.project.item.armors; -// TODO: UPDATE IMPLEMENTATION -public abstract class Armor { +import org.project.item.Item; + +public abstract class Armor implements Item { 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; + // مقداردهی سقف دفاع و دوام زره + this.maxDefense = defense; + this.maxDurability = durability; } public void checkBreak() { @@ -21,7 +24,7 @@ public abstract class Armor { } } - // TODO: (BONUS) UPDATE THE REPAIR METHOD + // این متد مربوط به بخش امتیازی (BONUS) است و دست نخورده باقی می‌ماند public void repair() { isBroke = false; defense = maxDefense; @@ -39,4 +42,4 @@ public abstract class Armor { public boolean isBroke() { return isBroke; } -} +} \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java b/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java index eb59a46..1fa2807 100644 --- a/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java +++ b/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java @@ -1,6 +1,16 @@ package org.project.item.armors; -// TODO: UPDATE IMPLEMENTATION -public class KnightArmor { - // TODO: DESIGN ARMOR'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR +import org.project.entity.Entity; + +public class KnightArmor extends Armor { + + public KnightArmor() { + // پاس دادن مقدار ۱۰ برای دفاع و ۵۰ برای دوام به سازنده کلاس Armor + super(10, 50); + } + + @Override + public void use(Entity target) { + // منطق پایه استفاده از زره روی یک موجود (در صورت نیاز به تجهیز کردن) + } } \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/item/consumables/Consumable.java b/Java-Knight/src/main/java/org/project/item/consumables/Consumable.java index 028e13d..d95d4ac 100644 --- a/Java-Knight/src/main/java/org/project/item/consumables/Consumable.java +++ b/Java-Knight/src/main/java/org/project/item/consumables/Consumable.java @@ -1,8 +1,8 @@ package org.project.item.consumables; -// TODO: UPDATE IMPLEMENTATION -public abstract class Consumable { - /* - TODO: ADD OTHER REQUIRED AND BONUS METHODS - */ -} +import org.project.item.Item; + +// این کلاس پایه برای تمام آیتم‌های مصرفی (مثل معجون‌ها) است +public abstract class Consumable implements Item { + // ویژگی‌ها و متدهای غیر بونوس و پایه در اینجا قرار می‌گیرند +} \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/item/consumables/Flask.java b/Java-Knight/src/main/java/org/project/item/consumables/Flask.java index c0e7a6d..762590e 100644 --- a/Java-Knight/src/main/java/org/project/item/consumables/Flask.java +++ b/Java-Knight/src/main/java/org/project/item/consumables/Flask.java @@ -2,15 +2,17 @@ package org.project.item.consumables; import org.project.entity.Entity; -// TODO: UPDATE IMPLEMENTATION -public class Flask { - /* - THIS IS AN EXAMPLE OF A CONSUMABLE DESIGN. - */ +public class Flask extends Consumable { + + public Flask() { + // سازنده پیش‌فرض برای ساخت فلاسک هیل + } - // TODO: UPDATE USE METHOD @Override public void use(Entity target) { - target.heal(target.getMaxHP() / 10); + if (target != null) { + // هیل کردن هدف به اندازه یک دهم (۱۰ درصد) از سقف خون او + target.heal(target.getMaxHP() / 10); + } } -} +} \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/item/weapons/Sword.java b/Java-Knight/src/main/java/org/project/item/weapons/Sword.java index 96226ee..e1331ae 100644 --- a/Java-Knight/src/main/java/org/project/item/weapons/Sword.java +++ b/Java-Knight/src/main/java/org/project/item/weapons/Sword.java @@ -1,26 +1,22 @@ package org.project.item.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 class Sword extends Weapon { + private int abilityCharge; public Sword() { - // TODO: DESIGN SWORD'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR + // فراخوانی سازنده کلاس والد (Weapon) با آسیب ۱۵ و مانا کاست ۰ + super(15, 0); + this.abilityCharge = 0; } - // TODO: (BONUS) UPDATE THE UNIQUE ABILITY + // این متد مربوط به بخش امتیازی است و بدون تغییر باقی می‌ماند public void uniqueAbility(ArrayList targets) { abilityCharge += 2; for (Entity target : targets) { target.takeDamage(getDamage()); } } -} +} \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/item/weapons/Weapon.java b/Java-Knight/src/main/java/org/project/item/weapons/Weapon.java index cb9fcf2..b9a1701 100644 --- a/Java-Knight/src/main/java/org/project/item/weapons/Weapon.java +++ b/Java-Knight/src/main/java/org/project/item/weapons/Weapon.java @@ -1,16 +1,12 @@ package org.project.item.weapons; import org.project.entity.Entity; +import org.project.item.Item; -// TODO: UPDATE IMPLEMENTATION -public abstract class Weapon { +public abstract class Weapon implements Item { 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; @@ -18,7 +14,9 @@ public abstract class Weapon { @Override public void use(Entity target) { - target.takeDamage(damage); + if (target != null) { + target.takeDamage(damage); + } } public int getDamage() { @@ -28,8 +26,4 @@ public abstract class Weapon { public int getManaCost() { return manaCost; } - - /* - TODO: ADD OTHER REQUIRED AND BONUS METHODS - */ -} +} \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/location/Location.java b/Java-Knight/src/main/java/org/project/location/Location.java index b0b4b98..78cea23 100644 --- a/Java-Knight/src/main/java/org/project/location/Location.java +++ b/Java-Knight/src/main/java/org/project/location/Location.java @@ -1,19 +1,33 @@ package org.project.location; import org.project.entity.enemies.Enemy; - import java.util.ArrayList; public class Location { private String name; + private ArrayList locations; // لیست مسیرهای متصل به این مکان + private ArrayList enemies; // لیست دشمنان موجود در این مکان - private ArrayList enemies; - - public Location(ArrayList locations, ArrayList enemies) { - this.locations = locations; - this.enemies = enemies; + // سازنده اصلی کلاس لوکیشن + public Location(String name) { + this.name = name; + this.locations = new ArrayList<>(); + this.enemies = new ArrayList<>(); } + // متد کاربردی برای متصل کردن یک مسیر به این لوکیشن (دو طرفه یا یک طرفه) + public void addConnectedLocation(Location location) { + if (!this.locations.contains(location)) { + this.locations.add(location); + } + } + + // متد اضافه کردن دشمن به لوکیشن + public void addEnemy(Enemy enemy) { + this.enemies.add(enemy); + } + + // گترهای الزامی public String getName() { return name; } @@ -25,4 +39,4 @@ public class Location { public ArrayList getEnemies() { return enemies; } -} +} \ No newline at end of file diff --git a/Java-Knight/target/classes/org/project/Main.class b/Java-Knight/target/classes/org/project/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..0155452c749971970d35c6636a62fc7e30c24bf4 GIT binary patch literal 8547 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 literal 0 HcmV?d00001 diff --git a/Java-Knight/target/classes/org/project/entity/enemies/Enemy.class b/Java-Knight/target/classes/org/project/entity/enemies/Enemy.class new file mode 100644 index 0000000000000000000000000000000000000000..49a5037159fd55f4dfc44ab78d36164573ea97a2 GIT binary patch literal 2884 zcmai0U2has7=F%vO}m|KOBY&8KiKlwF46^5z!nOn6uQs_v{(fEVA>tpp}RZl?iB5f zi3vt7NW9@fjWKFWibPUDK*8uG7yg1-xbvR)4~);58QN_bA!+A5=gj-Q&+~qqclNJ; zAN&bm7^Nrz2r3Av2qPlUcu~8grE*$fDs^JwqCRN}MD`j5!x|6>cK3|eq6W1JqAKd3 z3M9~oEoN_69`Nf1w>jJ)~jfcR^hz%(a1@8vPwmhJPG8B za=Ti^nx_gGN1;WT&k27z@i@FY+>rCW!zyf)=JU=W+IS-}<+-RN1Ctg*Q=sSw7TWy;o! zI%zb_)X9=ju*R&CuH{KAfUPQC#x{W(dLGJY<+4D$yT?^`vhEyGHHGa8cBt5iR|FcC zs^S^NXg_A;i#h$cmM6Q_%bXCnC>T_65JLj3)g|!y zXV_^Yfv82sPqQEDPWOyAL10+Mb68-rpZjM6k&5Z`3wx$#Tp%=LW|_%`QKO(ApUqF` zrBm8Ojwel{=A@Pz*Gh)mdxs%w+Fvdbi z(n>6`K-+UH1Y%>-aYie8tRh+cf?minm}yk;`SYg2q>QM}*6|HNvYI zCXAG_BQx?|x<{F%qYRJaO>pm*zy|hOb=~|fANK~#+ zp>oBZw{LQ1e{cWt_^N$9Vc)hFx@thAo+sb_@#OdKJWn_6`O0PcM#5gGd_tT1kFO>k zE!elXxzXDY!BiB}Fce&rO~v|bT)JmQ;gUI{r`+Cm@6BOt(lSdNXSuJ=VD09<;GYAwwjtQ6!elaB=oWZ z-os7L#NNR z(81MFzD>FwaSWr}NgK&XI4j8|;H)IuAWt(m?s2)seUR_^wm!t3bz72W?m%hF%ItITHENPUu9u=|ax%IZQEXwZyBS^5aoy~iFY<43 zVsiO2x6Q;kwTL$5p>?`w=RGtc#(qFuQc54tUV^6hYhXK*x3dbga}l%?Z#m_aNh4?n zLC5_;8`}ulNFezi_dw%3S{dmsg6<~h9)kA$59sNYp!}iX<@F$?Y&Y39$~RC#^9Tih za_Gt4kkteRs)`fyf{`JF5vV)B>5R7*gBW0%Wt}3<1zB0?A(|YjA{klCOvGz^fiu`Z zPO>YxN7=9-H*u-o;2!udMlT8U=yTFE)ei~?sNr)wez}l1uaxRZIBhB>k5d;+HMQl2;kdBy+iZJKmC_ zYJM+x&2@b9R^y*Z&2^y@T^bTP4nb!))o$^YheAczLb?t^&jRMO^1qUKR||WG*$AATRwoj^HRmtSsbojUkdu<&^%IjzOjGB>fEkVR}|6 zPw03@QN?@(?!pk>)iA7M1O`LjZNA7&n>%H*u;f!(MCR5d!$7`qV!7t5XF0MUJ;AG) zeyZhrI!jSQ0}ylfW6A)sWPYLYm>o0sIVF zO?k7aFayc`6sfsJuCzw8Ziy<=o3|YCRlPbdyqkR9CQX0dEpmH~dzRX_lu@~0QCz3r zXySjgBtzx%#Gu2?rq*Nf&f9vi{d?xWzT z5}t(jf{kFE4#T^_Y6BBIZfIA-VPl;0ms4_(HXNf?@36NwJ(o zw<1iM3F>Qe0;YITx*lDcU)tN&0yguV=1$2L{#f31EA?7te|Ot7Zy4TOs)+;O-?ibt zo>%uc(>`@AiY&M70^L_?tDbWl;bm>^`@+|drGeO&(?OwXm}D6Ke<)2!GcSzNmFu8u z!f2&;fTRe?F}zRfIoeGiN)phM?n_444p=(!JG2ebbl|+w6CO|(_Yk_t{sQgvrUgul z(~ia-eJ!@1$V%ZarcdsmJH3s=4{$cU1?>Thbd-omH4w9}q=&X~d=n>!o>73<#%bj+ z(r`EojpV}=;!%2425=n5=xrFp7)j&wbf^Ff!j2H;B0eC8zKlcSH;Gi Ar~m)} literal 0 HcmV?d00001 diff --git a/Java-Knight/target/classes/org/project/entity/players/Knight.class b/Java-Knight/target/classes/org/project/entity/players/Knight.class new file mode 100644 index 0000000000000000000000000000000000000000..42a30671ab2dec7d308ab9434c14236e48309fe3 GIT binary patch literal 2845 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 literal 0 HcmV?d00001 diff --git a/Java-Knight/target/classes/org/project/item/armors/KnightArmor.class b/Java-Knight/target/classes/org/project/item/armors/KnightArmor.class new file mode 100644 index 0000000000000000000000000000000000000000..73f305938e9d544b5695c33d20a60cbba24cf902 GIT binary patch literal 480 zcma)2O-lnY5Pj3#ZriomwSHVgK}2XhxFCp!iXc*h9O7JT1>nI~2>}xZM=SEND(8kKjSuD&RM{&+xz+2n`xR6PN55(AQZ*XeLg}^IeS&|ZpCqA?s8rrBW&>#+#bC-e%|s8y zv@eWuxVZG~SY?Fc0hfWATMu0A1u$Avp6tdcgmu#!@hR~hrN;i*$&fRz& z;(~B%>_+UYadn{^Rf^nHbz91;P_>x-#vvlY&DrH=?jZOx^Qs6*sw=f<%S_po>n99T zlgnZ)t#CXCawY5za{K!}#6wYhrIZfNrNtBJGdj}WqRLXX!#eAqqnl9f1V dAh!Vsx1X~Mc;j-dJEEcK=m4eG_yl6B{N^&Fmvs_7CxOCx< z66eMu7D2O^M{>@`Oy>RL&v^6DC-Y2f(ift literal 0 HcmV?d00001 diff --git a/Java-Knight/target/classes/org/project/item/weapons/Sword.class b/Java-Knight/target/classes/org/project/item/weapons/Sword.class new file mode 100644 index 0000000000000000000000000000000000000000..0eae0cc64f06dfc608aa053e5472dd1c3aae331e GIT binary patch literal 1078 zcmaJ=TW=CU6#fR5E-Xu1DaBswMZ5vMELQ7{rlzSiA))wysnI6~x}np;E-r($KgCC% zd^XXV`e1zaZ}=~aQO_)(C1PJ@&N*|=cfRw@%-5fvJ_FdoJp%y*b!a9+7-E=ny_(hZ z+$I#V{?0J8CLAHx8A9noA+r-f7!e(Yi6~5l+5gs;4_$AUA;v4B zF67bX9`|ZC11lI9#)ytl6Xy_T7~AJBxz(1UZf$rTKPrlrWC#-%k4x8MNTxHzzd40& zJRd~@<2sTi&SQch{%;C{zQrcE-+}0A5QeJ>)feXk19%rypCCh z$*=gZd7dVF|X7q5-++{Uf-3Qw@C?V>dG-^LS5Q=W6pYl<&M|)*Z!P*(!*3|@M$*Tw3 zyxE;SQWiCb%eF`2tPY&!Y(zDxQFhy2)qW_H!iKNavU)6ZgJJp%0Hc*2Gg$$$L%2q3 zn!Ni6k_E)Fqa(qOVAoC@ z_UU`*q2~m(aE#dY;t9qWUSo=kNro?&DJ^A>F?WJX0lfY7P4&~D`Xz}P=+794BZV>Q zkbs48zwbPur|85&&S#bDGN69Ajum2ZgK9hMROBW_Rw)ui;D`E*iSL-hEeZs1n~v`I G*4^Lbe*U8X literal 0 HcmV?d00001 diff --git a/Java-Knight/target/classes/org/project/item/weapons/Weapon.class b/Java-Knight/target/classes/org/project/item/weapons/Weapon.class new file mode 100644 index 0000000000000000000000000000000000000000..d7631ed73c21f55ede73360a2e7e92440979770f GIT binary patch literal 839 zcmaJ;T~8B16g_vl?b7aU3zZL{2vh}^lDIzr;|pT4Nx=t5jgQkZsSE9Hvz==EPrjH) zj6U$l13!vzXSznJ#Fx1rbI&<<&fMJox&m;BpaKg82eyYIN`(1y@kxXOk@UlN-E-Mf zgwm@xiPdXDA=vGdF^95)iU$`SVKdG8;V4V>WEd+s3_nXTN|SN;-b6;9iJ|CA0!12I z^-$BmxuHnJK{{407EpKa$ipI*2&?xAWujvBB|J2NP*LJSzRBtAAlmIXSRpLkhnO8A zUW8B#A|4^w2k9B>*V=I+k0-;f%uYpjz@2(K?TJB0WU;RErma54V?wk259{p9_Suig zm{~T0nbDb@_qBdWiL5W#$i{yL3I2%^y^A9;$`>g!=J#XS`H0|h=P0+0-8e}nSx>%= z^;6ub-7od;*-iG@0%4g?OaBx9w54t5Xmh`a$9%4G^?~~ZjnF*@!(csS36oz#?;fe{244F&|Y55Io<}#;TTl#MA8vb7EJDi`Gx1ePT z&@xp+x4<%W&KHe@-d+>`k=R0$37;AiRXKfz=ea`2QL7g<`BzRX!&@@V6~pIE2Xa2b R_Jd&mZ*b#5@Q#sqaR+$NmVE#K literal 0 HcmV?d00001 diff --git a/Java-Knight/target/classes/org/project/location/Location.class b/Java-Knight/target/classes/org/project/location/Location.class new file mode 100644 index 0000000000000000000000000000000000000000..6de52cfef4ad7b7540f44d3fb989db9a0e3d0a66 GIT binary patch literal 1506 zcma)+?M@Rx6o%jF2W^)vRM>(F2qI`(l=TxaB_vAlSH&MS82LA}n>tu#$uc$Rt#}oh zh$NbL0bZ2xob47`vWjUkduI2X=RF@Y{q_6%PXOCkw~#9n7kVg61twn}FO3On}V4`-8 zt(!pURyBh$fywZ7$EddZJP2gBrjCt;Jd!MP#l{3C1#*4vu|Tm08jh&4chSZaduKfD z9V+jbF;{I|!*zjd!`DVC&4AKCD!mG;Sk5o+2w(rHp+C}C~0?_lJADGLy1N`EALWAxBMpMG+tBM+vyzcd%+vI-wu0BU2pHo zK=D3$nKJJcRXu-6vH}iOz2$37bM%_$^II%k63HoL`vVfl*Ntp^cqNY_{VZX_ngo`I zQL%+HEzP~?3M>vO$GX$BTb|hokC;;`4@@>{n1D?V{c@-g(|xZCCrDsD{>%T2*&+=t zl1`mK^?x|A)$ob2>V79^crO)CG~Z8rm9GhI(kV~SrA^XGmyfIjUl0h~2<>^=(-k<| zFJOf1G{sRf$)g!Y0t=N>h|0dx} zxChe2%Y3Hr9*WxuDwNCTQpq902t2?;^5UWgg9{gfmtul@(|bg~$FUISBBb