การออกแบบเกมร้านขายอาหารแนว Simulator ด้วย Spring Boot

การสร้างเกมแนวร้านขายอาหารในรูปแบบ Simulator เป็นความท้าทายที่น่าสนุกสำหรับนักพัฒนา โดยตัวเกมจะต้องรองรับการจัดการองค์ประกอบต่าง ๆ เช่น คู่แข่ง ทำเล ลูกค้า จำนวนโต๊ะ แคมเปญ นักดนตรี ค่าใช้จ่าย และเหตุการณ์ที่ส่งผลกับ Entity ต่าง ๆ ทั้งหมดนี้สามารถพัฒนาได้อย่างมีประสิทธิภาพโดยใช้ Spring Boot เป็นเฟรมเวิร์กหลัก


1. โครงสร้างเกมพื้นฐาน

1.1 Entity หลัก

  1. ร้านอาหาร (Restaurant)
    • ชื่อร้าน
    • ทำเลที่ตั้ง
    • จำนวนโต๊ะ
    • รายได้
    • ค่าใช้จ่าย
  2. ลูกค้า (Customer)
    • ความพึงพอใจ
    • งบประมาณ
    • ความต้องการอาหาร
  3. คู่แข่ง (Competitor)
    • ชื่อคู่แข่ง
    • ทำเลที่ตั้ง
    • โปรโมชั่นที่ใช้งาน
  4. นักดนตรี (Musician)
    • ชื่อ
    • ค่าเช่า
    • ความสามารถเพิ่มความพึงพอใจของลูกค้า
  5. เหตุการณ์ (Event)
    • ชื่อเหตุการณ์
    • ผลกระทบต่อ Entity เช่น ราคาวัตถุดิบเพิ่มขึ้น หรืออากาศดีทำให้ลูกค้าเยอะขึ้น

1.2 ระบบ

  • การจัดการทรัพยากร เช่น การซื้อวัตถุดิบ การเพิ่มโต๊ะ และการจ้างนักดนตรี
  • แคมเปญการตลาด เช่น ส่วนลด โปรโมชั่นพิเศษ หรือโฆษณาออนไลน์
  • การปรับเปลี่ยนกลยุทธ์ เช่น แข่งขันกับร้านใกล้เคียง

2. การออกแบบระบบด้วย Spring Boot

2.1 โครงสร้างโปรเจกต์

  1. Controller
    • จัดการ API ที่เกี่ยวข้องกับการเพิ่ม/ลบ/แก้ไขข้อมูล เช่น
      • /api/restaurant
      • /api/customer
  2. Service
    • จัดการตรรกะทางธุรกิจ เช่น การคำนวณรายได้ การประเมินความพึงพอใจของลูกค้า
  3. Repository
    • ใช้ Spring Data JPA สำหรับจัดการฐานข้อมูล เช่น MySQL หรือ PostgreSQL

2.2 ตัวอย่าง Entity และ Repository

@Entity
public class Restaurant {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String location;
    private int tableCount;
    private double revenue;
    private double expenses;

    // Getter and Setter
}

@Repository
public interface RestaurantRepository extends JpaRepository<Restaurant, Long> {
}

2.3 ตัวอย่าง Service สำหรับคำนวณรายได้

@Service
public class RestaurantService {
    @Autowired
    private RestaurantRepository restaurantRepository;

    public void calculateRevenue(Long restaurantId) {
        Restaurant restaurant = restaurantRepository.findById(restaurantId).orElseThrow();
        double totalRevenue = restaurant.getTableCount() * 500; // สมมติรายได้จากโต๊ะละ 500 บาท
        restaurant.setRevenue(totalRevenue);
        restaurantRepository.save(restaurant);
    }
}

3. การจัดการเหตุการณ์แบบสุ่ม

3.1 การออกแบบ Event

@Entity
public class Event {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String impactDescription;
    private double revenueImpact;

    // Getter and Setter
}

3.2 การสุ่มเหตุการณ์

@Service
public class EventService {
    private List<Event> events = Arrays.asList(
        new Event("เทศกาลอาหาร", "ลูกค้าเพิ่มขึ้น", 0.2),
        new Event("ราคาวัตถุดิบเพิ่มขึ้น", "ค่าใช้จ่ายเพิ่ม", -0.1)
    );

    public Event getRandomEvent() {
        Random random = new Random();
        return events.get(random.nextInt(events.size()));
    }

    public void applyEvent(Event event, Restaurant restaurant) {
        double adjustedRevenue = restaurant.getRevenue() * (1 + event.getRevenueImpact());
        restaurant.setRevenue(adjustedRevenue);
    }
}

4. การใช้ WebSocket สำหรับรายงานเหตุการณ์

4.1 การตั้งค่า WebSocket

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
    }
}

4.2 การส่งข้อความเหตุการณ์

@Service
public class WebSocketEventService {
    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    public void sendEventNotification(Event event) {
        messagingTemplate.convertAndSend("/topic/events", event);
    }
}

4.3 การเชื่อมต่อ WebSocket ใน Frontend

const socket = new SockJS('/ws');
const stompClient = Stomp.over(socket);
stompClient.connect({}, () => {
    stompClient.subscribe('/topic/events', (message) => {
        const event = JSON.parse(message.body);
        console.log('Received event:', event);
    });
});

5. สรุป

เกมร้านขายอาหารแนว Simulator ที่พัฒนาด้วย Spring Boot สามารถปรับแต่งได้หลากหลายตามความต้องการ โดยโครงสร้าง Entity และ Service ช่วยให้การพัฒนามีความยืดหยุ่น การเพิ่ม WebSocket ช่วยให้ระบบสามารถรายงานเหตุการณ์แบบเรียลไทม์ สร้างประสบการณ์การเล่นเกมที่สมจริงและน่าตื่นเต้นมากยิ่งขึ้น นักพัฒนาสามารถเพิ่มฟีเจอร์อื่น ๆ เช่น การแข่งขันกับคู่แข่ง หรือการสร้างแคมเปญใหม่ ๆ เพื่อเพิ่มความหลากหลายและความสนุกให้กับเกมได้อย่างต่อเนื่อง

ความคิดเห็น

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

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