การสร้างเกมแบบ 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
ออกแบบคลาสพื้นฐาน
- Fighter: คลาสสำหรับนักมวยไทย (ชื่อ, พลังโจมตี, พลังป้องกัน, พลังชีวิต)
- FightEngine: คลาสสำหรับจำลองการต่อสู้ระหว่างนักมวย
- SchedulerService: ใช้จัดการการต่อสู้ทีละวินาทีด้วย
@Scheduled
- Controller: สำหรับรับคำสั่งเริ่มเกมและดูผลลัพธ์
ตัวอย่างโค้ด นี่คือโครงสร้างตัวอย่าง:
public class Fighter {
private String name;
private int attackPower;
private int defensePower;
private int health;
private int trainingLevel;
private int dietQuality;
private int ritualEffectiveness;
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;
}
}
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() {
int damage1 = Math.max(0, fighter1.calculateEffectiveAttack() - fighter2.calculateEffectiveDefense() + random.nextInt(5));
fighter2.takeDamage(damage1);
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!";
}
}
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);
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);
}
}
}
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);
}
}
ความคิดเห็น
แสดงความคิดเห็น