# ⚔️ پروژه بازی شوالیه جاوا (Java Knight)

یک بازی نقش‌آفرینی نوبتی (Turn-based RPG) با المان‌های روگ‌لایک (Roguelike) که به صورت متنی در ترمینال اجرا می‌شود. این پروژه با هدف پیاده‌سازی دقیق اصول شیءگرایی (OOP) در جاوا توسعه یافته است.

---

## 📜 داستان بازی: افسانه جاوانست (Javanest)
برای قرن‌ها، سرزمین جاوانست در صلح و آرامش بود، تا اینکه اژدهای جادویی حمله کرد و قلمرو را در تاریکی مطلق فرو برد. اژدها با نفرینی شوم، مردم بی‌گناه را به موجودات وحشتناکی مثل اسکلت‌ها تبدیل کرد. اژدها درب قلعه نفوذناپذیر خود را قفل کرد و کلید آن را نزد این موجودات پنهان نمود. اکنون وظیفه شماست که در نقش شوالیه، به جاده بزنید، کلید را از اسکلت‌ها پس بگیرید و با ورود به قلعه، اژدها را شکست داده و صلح را بازگردانید!

---

## 🎯 ویژگی‌های اصلی پیاده‌سازی شده (بخش‌های پایه و الزامی)

### ۱. رعایت کامل اصول شیءگرایی (OOP Principles)
* **Interfaces & Abstract Classes:** استفاده از اینترفیس `Entity` به عنوان هسته اصلی تمام موجودات زنده بازی و کلاس‌های انتزاعی `Player`، `Weapon` و `Enemy` برای جلوگیری از تکرار کد (Code Duplication).
* **Encapsulation:** تمام ویژگی‌های حساس (مانند HP، MP و دمیج) به صورت `private` یا `protected` تعریف شده‌اند و دسترسی به آن‌ها از طریق متدهای گتر و ستر استاندارد انجام می‌شود.
* **Polymorphism & Overriding:** بازنویسی متدهای حیاتی مانند `takeDamage` و `attack` در فرزندان مختلف برای ایجاد رفتارهای منحصربه‌فرد (مانند سیستم محاسباتی زره بازیکن).

### ۲. قانون ۵ حرکت مبارزه بازیکن (The Rule of Five)
در هر نوبت از مبارزه، بازیکن دقیقاً ۵ انتخاب استراتژیک با مدیریت مانا (Mana) در اختیار دارد:
1. **Light Attack:** حمله معمولی با شمشیر (بدون هزینه مانا).
2. **Heavy Attack:** حمله سنگین با دمیج ۱.۵ برابر (هزینه مانا: ۱۵).
3. **Defend:** گرفتن گارد دفاعی برای کاهش آسیب‌های بعدی (هزینه مانا: ۱۰).
4. **Heal Magic:** استفاده از جادوی درمان برای بازیابی ۳۰ واحد از خون (هزینه مانا: ۲۰).
5. **Shield Bash:** ضربه کوبنده با سپر که علاوه بر دمیج، دشمن را **Stun (گیج)** کرده و نوبت بعدی او را می‌سوزاند (هزینه مانا: ۳۰).

### ۳. مکانیزم ویژه اسکلت (Skeleton Resurrect)
اسکلت‌ها دارای قابلیت منحصربه‌فرد احیا هستند. یک بار در هر مبارزه، اگر خون اسکلت به صفر برسد، نابود نمی‌شود؛ بلکه استخوان‌هایش دوباره به هم می‌چسبند و با **۵۰٪ از سقف خون خود (Max HP)** به میدان نبرد بازمی‌گردد.

### ۴. سیستم لول‌آپ و بازیابی خودکار (Leveling & Replenish)
* **ارتقای سطح:** با شکست دادن اسکلت‌ها، بازیکن امتیاز تجربه (XP) کسب می‌کند. با رسیدن XP به ۱۰۰، بازیکن لول‌آپ شده و سقف HP و MP او به طور خودکار افزایش می‌یابد.
* **بازیابی وضعیت:** پس از پایان هر مبارزه، متد `replenishAfterCombat` بخشی از خون و مانای مصرف شده بازیکن را بازیابی می‌کند تا برای نبرد بعدی آماده شود.

### ۵. قفل جاده و شانس دریافت کلید (RNG Gatekeeping)
ورود به قلعه اژدها در ابتدا کاملاً قفل است. بازیکن باید در جاده با اسکلت‌ها بجنگد. پس از مرگ هر اسکلت، شانس (Random) دراپ شدن کلید بررسی می‌شود. تا زمانی که بازیکن موفق به دریافت **«کلید اسکلت»** نشود، سیستم اجازه ورود به مرحله نهایی را به او نخواهد داد.

---

## 🏗️ ساختار درختی پکیج‌های پروژه (Project Structure)

```text
src/
└── org/
    └── project/
        ├── Main.java (کنترلر اصلی و لوپ بازی)
        ├── entity/
        │   ├── Entity.java (اینترفیس پایه)
        │   ├── enemies/
        │   │   ├── Enemy.java (کلاس انتزاعی دشمنان)
        │   │   └── Skeleton.java (مکانیک اسکلت)
        │   └── players/
        │       ├── Player.java (کلاس انتزاعی بازیکن)
        │       └── Knight.java (حرکات پنج‌گانه شوالیه)
        ├── item/
        │   ├── Item.java (اینترفیس آیتم‌ها)
        │   ├── armors/
        │   │   ├── Armor.java
        │   │   └── KnightArmor.java
        │   ├── consumables/
        │   │   ├── Consumable.java
        │   │   └── Flask.java
        │   └── weapons/
        │       ├── Weapon.java
        │       └── Sword.java
        └── location/
            └── Location.java (مدیریت گراف لوکیشن‌ها)
            