สอนสร้าง Text base มวยไทย Simulator ด้วย Spring Boot 

การสร้างเกมแบบ text-based "ค่ายมวยไทย Simulator" ด้วย Spring Boot สามารถใช้เทคนิคการทำงานแบบ scheduled tasks เพื่อแสดงการต่อสู้ทีละวินาทีและตัดสินผลแพ้ชนะได้ โดยใช้ Spring Scheduling (@Scheduled) และโครงสร้าง REST API สำหรับการโต้ตอบหรือแสดงผลเกม

ขั้นตอนในการออกแบบ

  1. สร้างโครงสร้าง Spring Boot Project

    • ใช้ Spring Initializer เพิ่ม dependencies:
      • Spring Web
      • Spring Boot DevTools
      • Spring Scheduler
  2. ออกแบบคลาสพื้นฐาน

    • Fighter: คลาสสำหรับนักมวยไทย (ชื่อ, พลังโจมตี, พลังป้องกัน, พลังชีวิต)
    • FightEngine: คลาสสำหรับจำลองการต่อสู้ระหว่างนักมวย
    • SchedulerService: ใช้จัดการการต่อสู้ทีละวินาทีด้วย @Scheduled
    • Controller: สำหรับรับคำสั่งเริ่มเกมและดูผลลัพธ์
  3. ตัวอย่างโค้ด นี่คือโครงสร้างตัวอย่าง:

    // Fighter.java
    public class Fighter {
        private String name;
        private int attackPower;
        private int defensePower;
        private int health;
    
        // ปัจจัยที่ส่งผล
        private int trainingLevel;         // 1 - 100
        private int dietQuality;           // 1 - 100
        private int ritualEffectiveness;   // 1 - 100
    
        public Fighter(String name, int attackPower, int defensePower, int health, int trainingLevel, int dietQuality, int ritualEffectiveness) {
            this.name = name;
            this.attackPower = attackPower;
            this.defensePower = defensePower;
            this.health = health;
            this.trainingLevel = trainingLevel;
            this.dietQuality = dietQuality;
            this.ritualEffectiveness = ritualEffectiveness;
        }
    
        public int calculateEffectiveAttack() {
            return attackPower + (trainingLevel / 10) + (dietQuality / 20);
        }
    
        public int calculateEffectiveDefense() {
            return defensePower + (trainingLevel / 15) + (ritualEffectiveness / 25);
        }
    
        public void takeDamage(int damage) {
            this.health -= damage;
            if (this.health < 0) this.health = 0;
        }
    
        public boolean isAlive() {
            return this.health > 0;
        }
    
        public String getName() {
            return name;
        }
    
        public int getHealth() {
            return health;
        }
    }
    
    // FightEngine.java
    import java.util.Random;
    
    public class FightEngine {
        private Fighter fighter1;
        private Fighter fighter2;
        private Random random = new Random();
    
        public FightEngine(Fighter fighter1, Fighter fighter2) {
            this.fighter1 = fighter1;
            this.fighter2 = fighter2;
        }
    
        public String simulateRound() {
            // Fighter 1 attacks Fighter 2
            int damage1 = Math.max(0, fighter1.calculateEffectiveAttack() - fighter2.calculateEffectiveDefense() + random.nextInt(5));
            fighter2.takeDamage(damage1);
    
            // Fighter 2 attacks Fighter 1
            int damage2 = Math.max(0, fighter2.calculateEffectiveAttack() - fighter1.calculateEffectiveDefense() + random.nextInt(5));
            fighter1.takeDamage(damage2);
    
            return String.format(
                    "%s attacks %s for %d damage! %s attacks %s for %d damage! Remaining health - %s: %d, %s: %d",
                    fighter1.getName(), fighter2.getName(), damage1,
                    fighter2.getName(), fighter1.getName(), damage2,
                    fighter1.getName(), fighter1.getHealth(),
                    fighter2.getName(), fighter2.getHealth()
            );
        }
    
        public boolean isFightOver() {
            return !fighter1.isAlive() || !fighter2.isAlive();
        }
    
        public String getWinner() {
            if (!fighter1.isAlive()) return fighter2.getName();
            if (!fighter2.isAlive()) return fighter1.getName();
            return "No winner yet!";
        }
    }
    
    // SchedulerService.java
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Service;
    
    @Service
    public class SchedulerService {
        private FightEngine fightEngine;
    
        public SchedulerService() {
            Fighter fighter1 = new Fighter("Muay A", 15, 10, 100, 80, 90, 85); // Training, Diet, Ritual
            Fighter fighter2 = new Fighter("Muay B", 14, 12, 100, 75, 88, 80);
            this.fightEngine = new FightEngine(fighter1, fighter2);
        }
    
        @Scheduled(fixedRate = 1000)
        public void simulateFight() {
            if (fightEngine.isFightOver()) {
                System.out.println("Fight is over! Winner: " + fightEngine.getWinner());
            } else {
                String roundResult = fightEngine.simulateRound();
                System.out.println(roundResult);
            }
        }
    }
    
    // MuayThaiSimulatorApplication.java
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MuayThaiSimulatorApplication {
        public static void main(String[] args) {
            SpringApplication.run(MuayThaiSimulatorApplication.class, args);
        }
    }

ความคิดเห็น

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

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