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
This commit is contained in:
@@ -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<Location> 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<Location> 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user