สอนสร้าง Text base มวยไทย Simulator ด้วย Spring Boot
การสร้างเกมแบบ text-based "ค่ายมวยไทย Simulator" ด้วย Spring Boot สามารถใช้เทคนิคการทำงานแบบ scheduled tasks เพื่อแสดงการต่อสู้ทีละวินาทีและตัดสินผลแพ้ชนะได้ โดยใช้ Spring Scheduling (@Scheduled) และโครงสร้าง REST API สำหรับการโต้ตอบหรือแสดงผลเกม
ขั้นตอนในการออกแบบ
สร้างโครงสร้าง Spring Boot Project
- ใช้ Spring Initializer เพิ่ม dependencies:
- Spring Web
- Spring Boot DevTools
- Spring Scheduler
- ใช้ Spring Initializer เพิ่ม dependencies:
ออกแบบคลาสพื้นฐาน
- Fighter: คลาสสำหรับนักมวยไทย (ชื่อ, พลังโจมตี, พลังป้องกัน, พลังชีวิต)
- FightEngine: คลาสสำหรับจำลองการต่อสู้ระหว่างนักมวย
- SchedulerService: ใช้จัดการการต่อสู้ทีละวินาทีด้วย
@Scheduled - Controller: สำหรับรับคำสั่งเริ่มเกมและดูผลลัพธ์
ตัวอย่างโค้ด นี่คือโครงสร้างตัวอย่าง:
// 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); } }
ความคิดเห็น
แสดงความคิดเห็น