การสร้างเกม RPG ด้วย Spring Boot: การออกแบบระบบอาชีพ ไอเท็ม ศัตรู แผนที่ และระบบอื่นๆ

เกม RPG (Role-Playing Game) เป็นประเภทของเกมที่ได้รับความนิยมเพราะมีความยืดหยุ่นในการออกแบบระบบและเนื้อหา ในบทความนี้ เราจะมาดูวิธีการสร้างเกม RPG แบบง่าย ๆ ด้วย Spring Boot โดยมีฟีเจอร์สำคัญ เช่น ระบบอาชีพ ไอเท็ม ศัตรู แผนที่ รวมถึงระบบจัดการเวลา (schedule) และการสุ่มเจอศัตรู


1. การเตรียมโปรเจค

การสร้างโปรเจค Spring Boot

  • ใช้ Spring Initializr เพื่อสร้างโปรเจค
  • เลือก dependencies ที่จำเป็น เช่น:
    • Spring Web (สำหรับ REST API)
    • Spring Data JPA (สำหรับจัดการฐานข้อมูล)
    • H2 Database (ฐานข้อมูลในตัว)

โครงสร้างโปรเจค

src/main/java
├── com.example.rpg
    ├── controller
    ├── model
    ├── repository
    ├── service

2. ระบบอาชีพ (Class System)

สร้างระบบอาชีพที่ผู้เล่นสามารถเลือก เช่น นักรบ (Warrior) นักเวทย์ (Mage) และนักธนู (Archer)

Model

@Entity
public class Player {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String playerClass; // เช่น "Warrior", "Mage", "Archer"
    private int health;
    private int attackPower;
    private int defense;

    // Getters and Setters
}

Service

@Service
public class PlayerService {
    public Player createPlayer(String name, String playerClass) {
        Player player = new Player();
        player.setName(name);
        player.setPlayerClass(playerClass);

        switch (playerClass.toLowerCase()) {
            case "warrior":
                player.setHealth(150);
                player.setAttackPower(50);
                player.setDefense(30);
                break;
            case "mage":
                player.setHealth(100);
                player.setAttackPower(80);
                player.setDefense(10);
                break;
            case "archer":
                player.setHealth(120);
                player.setAttackPower(60);
                player.setDefense(20);
                break;
            default:
                throw new IllegalArgumentException("Invalid class");
        }

        return player;
    }
}

3. ระบบไอเท็ม (Item System)

สร้างไอเท็มที่สามารถเพิ่มพลังโจมตีหรือป้องกันของผู้เล่น

Model

@Entity
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String type; // เช่น "weapon", "armor"
    private int effectValue; // เพิ่มพลังโจมตีหรือป้องกัน

    // Getters and Setters
}

Service

@Service
public class ItemService {
    public Item createItem(String name, String type, int effectValue) {
        Item item = new Item();
        item.setName(name);
        item.setType(type);
        item.setEffectValue(effectValue);
        return item;
    }

    public Player equipItem(Player player, Item item) {
        if ("weapon".equals(item.getType())) {
            player.setAttackPower(player.getAttackPower() + item.getEffectValue());
        } else if ("armor".equals(item.getType())) {
            player.setDefense(player.getDefense() + item.getEffectValue());
        }
        return player;
    }
}

4. ระบบศัตรู (Enemy System)

Model

@Entity
public class Enemy {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int health;
    private int attackPower;

    // Getters and Setters
}

Service

@Service
public class EnemyService {
    public Enemy spawnEnemy() {
        Enemy enemy = new Enemy();
        enemy.setName("Goblin");
        enemy.setHealth(50);
        enemy.setAttackPower(20);
        return enemy;
    }
}

5. ระบบแผนที่ (Map System)

สร้างระบบแผนที่ที่ผู้เล่นสามารถเดินทางและสุ่มเจอศัตรู

Model

public class Map {
    private int width;
    private int height;

    public Map(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

Service

@Service
public class MapService {
    private Random random = new Random();

    public boolean encounterEnemy() {
        return random.nextInt(100) < 30; // โอกาส 30% ที่จะเจอศัตรู
    }
}

6. ระบบจัดการเวลาและ Objective

Schedule Task

@Component
public class GameScheduler {
    @Scheduled(fixedRate = 5000) // ทุก 5 วินาที
    public void progressGame() {
        System.out.println("Time is progressing in the game...");
    }
}

Objective System

public class Objective {
    private String description;
    private boolean isCompleted;

    public Objective(String description) {
        this.description = description;
        this.isCompleted = false;
    }

    public void completeObjective() {
        this.isCompleted = true;
    }
}

7. ระบบร้านค้า (Shop System)

Model

@Entity
public class Shop {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private List<Item> items;

    // Getters and Setters
}

Service

@Service
public class ShopService {
    public Shop createShop(String name, List<Item> items) {
        Shop shop = new Shop();
        shop.setName(name);
        shop.setItems(items);
        return shop;
    }

    public void buyItem(Player player, Item item) {
        // Logic การซื้อ เช่น ลดเงินจาก Player และเพิ่มไอเท็มใน inventory
        System.out.println(player.getName() + " bought " + item.getName());
    }
}

8. ระบบต่อสู้ (Battle System)

Service

@Service
public class BattleService {
    public String battle(Player player, Enemy enemy) {
        while (player.getHealth() > 0 && enemy.getHealth() > 0) {
            enemy.setHealth(enemy.getHealth() - player.getAttackPower());
            if (enemy.getHealth() <= 0) return player.getName() + " wins!";

            player.setHealth(player.getHealth() - enemy.getAttackPower());
            if (player.getHealth() <= 0) return enemy.getName() + " wins!";
        }
        return "Draw!";
    }
}

9. ระบบหัวหน้า (Boss System)

Model

@Entity
public class Boss extends Enemy {
    private String specialAttack;

    // Getters and Setters
}

Service

@Service
public class BossService {
    public Boss createBoss(String name, int health, int attackPower, String specialAttack) {
        Boss boss = new Boss();
        boss.setName(name);
        boss.setHealth(health);
        boss.setAttackPower(attackPower);
        boss.setSpecialAttack(specialAttack);
        return boss;
    }

    public String specialAttack(Player player, Boss boss) {
        player.setHealth(player.getHealth() - boss.getAttackPower() * 2); // พลังโจมตีพิเศษ
        return boss.getName() + " used " + boss.getSpecialAttack() + "!";
    }
}

10. ระบบควบคุมเกม (Game Controller) และ WebSocket

Controller

@RestController
@RequestMapping("/game")
public class GameController {

    @Autowired
    private PlayerService playerService;

    @Autowired
    private ShopService shopService;

    @Autowired
    private MapService mapService;

    @Autowired
    private BattleService battleService;

    @Autowired
    private EnemyService enemyService;

    @PostMapping("/move")
    public String movePlayer(@RequestParam int x, @RequestParam int y) {
        if (mapService.encounterEnemy()) {
            Enemy enemy = enemyService.spawnEnemy();
            return "Encountered an enemy: " + enemy.getName();
        }
        return "Player moved to position (" + x + ", " + y + ")";
    }

    @PostMapping("/shop")
    public String visitShop(@RequestParam Long playerId, @RequestParam Long itemId) {
        // Logic for visiting shop and buying items
        return "Visited the shop and bought item.";
    }

    @PostMapping("/battle")
    public String startBattle(@RequestParam Long playerId) {
        Player player = playerService.findPlayerById(playerId);
        Enemy enemy = enemyService.spawnEnemy();
        return battleService.battle(player, enemy);
    }
}

WebSocket Configuration

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/game-websocket").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }
}

สรุป

การสร้างเกม RPG ด้วย Spring Boot เป็นโครงการที่ท้าทายและสนุกสนาน โดยการวางแผนระบบต่าง ๆ เช่น อาชีพ ไอเท็ม ศัตรู ร้านค้า ระบบต่อสู้ และหัวหน้า รวมถึงการจัดการเวลาและ Objective เป็นสิ่งที่ช่วยเพิ่มความลึกให้กับเกม การเพิ่ม WebSocket เพื่อโต้ตอบแบบเรียลไทม์ยังช่วยเพิ่มประสบการณ์การเล่นอีกด้วย!

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

จากสมศรี 422R สู่หุ่นยนต๋ในยุค llm