ข้ามไปที่เนื้อหาหลัก

เรื่องที่แนะนำ

คู่มือ Java ฉบับทันสมัย (อัปเดตล่าสุดปี 2025)

 คู่มือ Java ฉบับทันสมัย (อัปเดตล่าสุดปี 2025) บทนำ Java ยังคงเป็นภาษายอดนิยมที่ได้รับความนิยมอย่างต่อเนื่องตั้งแต่ยุค 1990 จนถึงปัจจุบัน ในปี 2025 Java ได้ก้าวหน้าอย่างมากทั้งด้านภาษาหลักและเครื่องมือสนับสนุน ล่าสุด Java 24 ได้เปิดตัวออกมาแล้ว และ Java 21 เป็นเวอร์ชัน LTS (Long-Term Support) ที่แนะนำให้ใช้งานสำหรับระบบจริงในระยะยาว บทความนี้จะช่วยให้คุณเข้าใจภาพรวมของ Java เวอร์ชันล่าสุด รวมถึงฟีเจอร์เด่น โครงสร้างภาษาที่ควรรู้ และแนวทางการพัฒนา Java ยุคใหม่ ภาพรวมเวอร์ชัน Java ล่าสุด เวอร์ชัน สถานะ วันเปิดตัว Java 24 เวอร์ชันล่าสุด มีนาคม 2025 Java 21 เวอร์ชัน LTS ล่าสุด กันยายน 2023 Java 17 LTS รุ่นก่อนหน้า กันยายน 2021 Java 11 LTS เก่า กันยายน 2018 โครงสร้างพื้นฐานของภาษา Java คลาสและอ็อบเจกต์ : โครงสร้างหลักของโปรแกรม Java Primitive Types : int, double, char, boolean เป็นต้น Control Statements : if, switch, while, for, do-while Methods : การแยกโค้ดเป็นหน่วยที่นำกลับมาใช้ซ้ำได้ Array และ Collection : จัดเก็บและจัดการข้อมูลหลายรายการ Exception Handling : try-catch-finally OOP Co...

สอนสร้างเกมส์แนวภาระกิจด้วย Spring Boot

 การออกแบบเกมแนวเนื้อเรื่องที่ต้องทำภารกิจต่างๆ เพื่อปลดล็อคด่านถัดไปเป็นการสร้างประสบการณ์ที่ท้าทายและสนุกสนานให้กับผู้เล่นผ่านการเล่าเรื่องที่มีเส้นทางการพัฒนาเป็นลำดับ ซึ่งภารกิจต่างๆ จะเป็นตัวขับเคลื่อนให้ผู้เล่นรู้สึกมีความสำเร็จทุกครั้งที่ผ่านภารกิจ และทำให้พวกเขาต้องทำงานหนักเพื่อค้นหาวิธีที่จะปลดล็อคด่านใหม่ๆ ดังนั้นการออกแบบเกมในลักษณะนี้ต้องคำนึงถึงหลายปัจจัยในการสร้างความดึงดูดใจและความท้าทายให้กับผู้เล่น

1. การสร้างเนื้อเรื่องที่น่าสนใจ

การออกแบบเกมแนวเนื้อเรื่องควรเริ่มต้นจากการสร้างโลกและเรื่องราวที่น่าสนใจ ซึ่งจะช่วยดึงดูดผู้เล่นให้มีความสนใจติดตามเรื่องราวไปจนถึงด่านสุดท้าย ตัวละครและสถานการณ์ในเกมจะต้องมีความหลากหลายและมีพัฒนาการที่เชื่อมโยงกับภารกิจที่ผู้เล่นต้องทำ โดยอาจมีองค์ประกอบของความลึกลับ ความตื่นเต้น หรือแม้แต่การแก้ปริศนา

2. การออกแบบภารกิจ

ภารกิจในเกมต้องมีความหลากหลายและท้าทาย เพื่อให้ผู้เล่นรู้สึกมีความพยายามที่จะไปถึงด่านถัดไป โดยอาจแบ่งออกเป็นหลายประเภท เช่น

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

3. การปลดล็อคด่านใหม่

การปลดล็อคด่านใหม่ต้องมีระบบที่ทำให้ผู้เล่นรู้สึกว่าต้องทำภารกิจให้สำเร็จเพื่อที่จะไปต่อได้ อาจจะเป็นการใช้ระบบคะแนน, ระดับประสบการณ์, หรือทรัพยากรที่ผู้เล่นได้จากการทำภารกิจ ในบางกรณี การปลดล็อคด่านใหม่สามารถขึ้นอยู่กับความสามารถในการแก้ไขปัญหาหรือความคิดสร้างสรรค์ของผู้เล่น

4. ความท้าทายและความสำเร็จ

การออกแบบภารกิจที่มีความท้าทายแต่ไม่ยากจนเกินไป เป็นสิ่งสำคัญที่ทำให้ผู้เล่นรู้สึกถึงความสำเร็จเมื่อพวกเขาผ่านด่านต่างๆ ได้ เกมควรมีระดับความยากที่เพิ่มขึ้นตามลำดับ เพื่อให้ผู้เล่นไม่รู้สึกเบื่อหน่ายและสามารถพัฒนาไปพร้อมๆ กับเนื้อเรื่อง

5. การใช้ทรัพยากรและระบบรางวัล

ในการออกแบบเกมที่ต้องทำภารกิจต่างๆ การใช้ทรัพยากรเช่น ไอเทมพิเศษ หรือเครื่องมือช่วยเหลือต่างๆ เป็นวิธีที่ดีในการกระตุ้นให้ผู้เล่นทำภารกิจให้สำเร็จได้เร็วขึ้น ระบบรางวัลที่มีประสิทธิภาพจะช่วยเสริมสร้างแรงจูงใจให้ผู้เล่นทำภารกิจได้อย่างต่อเนื่อง โดยอาจมีรางวัลทั้งในรูปของไอเทม, การปลดล็อคเนื้อเรื่องใหม่, หรือแม้แต่การพัฒนาอัพเกรดตัวละคร

6. การทำให้เนื้อเรื่องและการเล่นสอดคล้องกัน

การผสมผสานระหว่างเนื้อเรื่องและการเล่นเป็นสิ่งที่สำคัญ เนื้อเรื่องที่ดีจะต้องกระตุ้นให้ผู้เล่นมีความสนใจที่จะทำภารกิจต่างๆ และให้ผู้เล่นรู้สึกว่าการเล่นในแต่ละภารกิจมีความหมายในตัวเอง สร้างความสัมพันธ์ระหว่างตัวละครในเกมและผู้เล่นให้เกิดความรู้สึกที่ลึกซึ้งและมีแรงบันดาลใจในการทำภารกิจให้สำเร็จ

7. การทดสอบและปรับสมดุล

หลังจากการออกแบบและพัฒนาเกมไปแล้ว ขั้นตอนสำคัญคือการทดสอบเกมเพื่อให้มั่นใจว่าภารกิจต่างๆ มีความสมดุลและไม่ทำให้ผู้เล่นรู้สึกเบื่อหรือท้อแท้เกินไป การปรับสมดุลระหว่างความยากของภารกิจและรางวัลที่ได้รับจะช่วยให้ผู้เล่นมีความสุขในการเล่นและกระตือรือร้นที่จะไปถึงด่านถัดไป

สรุป

การออกแบบเกมที่เน้นภารกิจเพื่อปลดล็อคด่านถัดไปนั้นเป็นการสร้างประสบการณ์ที่ท้าทายและสนุกสนาน โดยให้ผู้เล่นได้สัมผัสกับเนื้อเรื่องที่น่าสนใจและทำภารกิจที่มีความหลากหลาย การออกแบบภารกิจที่มีความหมาย และการให้รางวัลที่มีความคุ้มค่า เป็นปัจจัยที่สำคัญในการสร้างความประทับใจและดึงดูดให้ผู้เล่นเล่นเกมต่อไปเรื่อยๆ

ต่อไปนี้คือตัวอย่างโค้ดสำหรับสร้างเกมในแนวเนื้อเรื่องที่ต้องทำภารกิจต่างๆ เพื่อปลดล็อคด่านถัดไปด้วย Spring Boot:

1. การตั้งค่าโปรเจค Spring Boot

คุณสามารถสร้างโปรเจค Spring Boot ใหม่โดยใช้ Spring Initializr (https://start.spring.io/) หรือใช้คำสั่ง Maven/Gradle เพื่อสร้างโปรเจค

Dependencies:

  • Spring Web
  • Spring Data JPA
  • H2 Database (หรือฐานข้อมูลอื่นๆ ที่คุณต้องการ)

2. โครงสร้างของโปรเจค

src
 └── main
      ├── java
      │    └── com
      │         └── example
      │              └── missiongame
      │                   ├── MissionGameApplication.java
      │                   ├── controller
      │                   │     └── GameController.java
      │                   ├── model
      │                   │     ├── Mission.java
      │                   │     └── Player.java
      │                   ├── repository
      │                   │     ├── MissionRepository.java
      │                   │     └── PlayerRepository.java
      │                   └── service
      │                         └── GameService.java
      └── resources
           └── application.properties

3. การสร้าง Entity สำหรับ Mission และ Player

package com.example.missiongame.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Mission {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String description;
    private boolean isCompleted;

    // Constructors, getters, and setters
    public Mission() {
    }

    public Mission(String name, String description) {
        this.name = name;
        this.description = description;
        this.isCompleted = false;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean isCompleted() {
        return isCompleted;
    }

    public void setCompleted(boolean completed) {
        isCompleted = completed;
    }
}
package com.example.missiongame.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Player {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private int level;
    private Long currentMissionId;

    // Constructors, getters, and setters
    public Player() {
    }

    public Player(String name) {
        this.name = name;
        this.level = 1;
        this.currentMissionId = null;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public Long getCurrentMissionId() {
        return currentMissionId;
    }

    public void setCurrentMissionId(Long currentMissionId) {
        this.currentMissionId = currentMissionId;
    }
}

4. Repository สำหรับ Mission และ Player

package com.example.missiongame.repository;

import com.example.missiongame.model.Mission;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MissionRepository extends JpaRepository<Mission, Long> {
}
package com.example.missiongame.repository;

import com.example.missiongame.model.Player;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PlayerRepository extends JpaRepository<Player, Long> {
}

5. บริการ (Service) ที่จัดการเกม

package com.example.missiongame.service;

import com.example.missiongame.model.Mission;
import com.example.missiongame.model.Player;
import com.example.missiongame.repository.MissionRepository;
import com.example.missiongame.repository.PlayerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class GameService {

    @Autowired
    private MissionRepository missionRepository;

    @Autowired
    private PlayerRepository playerRepository;

    public Mission getNextMissionForPlayer(Long playerId) {
        Player player = playerRepository.findById(playerId).orElse(null);
        if (player == null) return null;

        Long nextMissionId = player.getCurrentMissionId() == null ? 1L : player.getCurrentMissionId() + 1;
        return missionRepository.findById(nextMissionId).orElse(null);
    }

    public String completeMission(Long playerId, Long missionId) {
        Player player = playerRepository.findById(playerId).orElse(null);
        Mission mission = missionRepository.findById(missionId).orElse(null);
        if (player == null || mission == null) return "Invalid player or mission";

        if (!mission.isCompleted()) {
            mission.setCompleted(true);
            missionRepository.save(mission);
            player.setCurrentMissionId(missionId + 1);  // Move to next mission
            playerRepository.save(player);
            return "Mission completed! Proceed to the next.";
        }

        return "Mission already completed!";
    }
}

6. Controller สำหรับการรับคำขอ (Requests)

package com.example.missiongame.controller;

import com.example.missiongame.model.Mission;
import com.example.missiongame.service.GameService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

    @Autowired
    private GameService gameService;

    @GetMapping("/next-mission/{playerId}")
    public Mission getNextMission(@PathVariable Long playerId) {
        return gameService.getNextMissionForPlayer(playerId);
    }

    @PostMapping("/complete-mission/{playerId}/{missionId}")
    public String completeMission(@PathVariable Long playerId, @PathVariable Long missionId) {
        return gameService.completeMission(playerId, missionId);
    }
}

7. การตั้งค่า application.properties

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true

8. เริ่มต้นการทำงาน

เมื่อทุกอย่างถูกตั้งค่าแล้ว คุณสามารถเริ่มต้นการทำงานด้วยคำสั่ง mvn spring-boot:run หรือ ./gradlew bootRun และทดสอบการใช้งาน API:

  • GET /game/next-mission/{playerId}: ดึงภารกิจถัดไปสำหรับผู้เล่น
  • POST /game/complete-mission/{playerId}/{missionId}: เสร็จสิ้นภารกิจและปลดล็อคภารกิจถัดไป

ตัวอย่างนี้เป็นโครงสร้างที่เรียบง่าย แต่สามารถพัฒนาต่อได้ด้วยการเพิ่มฟีเจอร์เช่นการสร้างการบันทึกความคืบหน้า การจัดการกับภารกิจที่ซับซ้อน และการตั้งค่าระบบระดับต่างๆ เพื่อให้เหมาะกับเกมที่คุณออกแบบ

การออกแบบระบบภารกิจ (Mission) ผูกกับฉาก (Scene), ตัวละคร NPC และบทสนทนา (Dialogue)

ในการพัฒนาเกมที่มีภารกิจในเนื้อเรื่อง (Story-based Missions) การเชื่อมโยงภารกิจกับฉาก (Scene), ตัวละคร NPC (Non-Playable Character) และบทสนทนา (Dialogue) เป็นสิ่งที่ช่วยเพิ่มความลึกซึ้งให้กับการเล่าเรื่องและประสบการณ์ของผู้เล่น การผูกระบบเหล่านี้เข้าด้วยกันช่วยให้ผู้เล่นรู้สึกมีส่วนร่วมและเชื่อมโยงกับโลกในเกมได้มากขึ้น

1. Mission (ภารกิจ)

ภารกิจเป็นการกำหนดเป้าหมายที่ผู้เล่นต้องทำให้สำเร็จในแต่ละขั้นตอนของเกม ภารกิจเหล่านี้มักจะถูกกำหนดให้ต้องทำบางอย่างเพื่อที่จะปลดล็อกด่านหรือฉากถัดไปในเกม ตัวอย่างเช่น การช่วย NPC, การเก็บไอเท็ม หรือการเอาชนะศัตรู

คุณสมบัติของ Mission:

  • ชื่อและคำอธิบาย: ใช้เพื่อระบุภารกิจและวิธีการทำให้สำเร็จ
  • สถานะการทำภารกิจ: เช่น เสร็จสมบูรณ์หรือยังไม่เสร็จ
  • ผูกกับ Scene: ภารกิจมักจะผูกกับฉากในเกมที่มีการดำเนินการ เช่น ฉากที่ผู้เล่นจะพบ NPC หรือเหตุการณ์สำคัญ

2. Scene (ฉาก)

ฉากเป็นพื้นที่หรือสถานที่ที่ผู้เล่นจะเข้าไปทำภารกิจต่างๆ มันประกอบไปด้วยการจัดการ NPC, วัตถุ, ภารกิจ และบทสนทนาต่างๆ ฉากเป็นสิ่งที่สามารถเปลี่ยนแปลงไปตามความคืบหน้าของผู้เล่น เช่น เมื่อทำภารกิจในฉากหนึ่งเสร็จ ฉากใหม่จะเปิดขึ้นและนำไปสู่ภารกิจใหม่

คุณสมบัติของ Scene:

  • ชื่อและคำอธิบาย: ใช้บรรยายลักษณะของฉาก
  • มี NPC: NPC ที่เกี่ยวข้องกับภารกิจต่างๆ จะอยู่ในฉากนี้
  • การเปลี่ยนฉาก: เมื่อภารกิจในฉากเสร็จ ผู้เล่นอาจถูกย้ายไปยังฉากใหม่ที่มีภารกิจถัดไป

3. NPC (ตัวละครที่ไม่สามารถเล่นได้)

NPC คือตัวละครในเกมที่ผู้เล่นไม่สามารถควบคุมได้ แต่นักพัฒนาจะใช้ NPC ในการเล่าเรื่องและทำให้โลกในเกมมีชีวิตชีวา NPC มักจะมอบภารกิจ, ให้ข้อมูล, หรือมีบทสนทนากับผู้เล่น

คุณสมบัติของ NPC:

  • ชื่อและบทบาท: NPC มีบทบาทที่เฉพาะเจาะจงในเกม เช่น เจ้าของร้าน, ผู้ช่วย, หรือศัตรู
  • ผูกกับ Scene: NPC อยู่ในฉากใดฉากหนึ่งและผู้เล่นจะพบ NPC ในขณะที่ทำภารกิจในฉากนั้น
  • บทสนทนา: NPC มักจะพูดคุยกับผู้เล่น และบทสนทนาเหล่านี้อาจจะเป็นการให้คำแนะนำหรือบอกใบ้เกี่ยวกับภารกิจ

4. Dialogue (บทสนทนา)

บทสนทนาเป็นส่วนสำคัญที่ทำให้การเล่าเรื่องในเกมมีความน่าสนใจ โดยมักจะใช้บทสนทนาเพื่อเชื่อมโยงการทำภารกิจให้สำเร็จหรือเล่าถึงเหตุการณ์ในเกม บทสนทนาของ NPC จะทำให้ผู้เล่นมีความรู้สึกว่าภารกิจนั้นสำคัญ และเพิ่มความรู้สึกเชื่อมโยงกับตัวละครในเกม

คุณสมบัติของ Dialogue:

  • ข้อความ: เนื้อหาของบทสนทนา เช่น คำพูดจาก NPC หรือข้อมูลที่จำเป็นสำหรับผู้เล่น
  • เชื่อมโยงกับ NPC: บทสนทนามักจะเกิดขึ้นระหว่าง NPC และผู้เล่นในช่วงเวลาต่างๆ ของการทำภารกิจ
  • มีผลต่อการดำเนินเรื่อง: บทสนทนาบางครั้งอาจมีผลต่อการตัดสินใจหรือการเปลี่ยนแปลงในภารกิจ

การผูก Mission กับ Scene, NPC และ Dialogue

ในเกมที่มีภารกิจ การผูกภารกิจกับฉาก, NPC และบทสนทนาเป็นสิ่งที่ทำให้การเล่าเรื่องมีความลึกซึ้งมากขึ้น โดยเฉพาะอย่างยิ่งในเกมที่ต้องการให้ผู้เล่นมีส่วนร่วมในเนื้อเรื่องผ่านการทำภารกิจ:

  • Mission ผูกกับ Scene: ภารกิจในเกมมักจะเกี่ยวข้องกับฉากที่ผู้เล่นอยู่ การผูกภารกิจกับฉากช่วยให้ผู้เล่นเข้าใจว่าในฉากนั้นจะมีสิ่งที่ต้องทำอะไรบ้าง
  • NPC ใน Scene: NPC ที่อยู่ในฉากนั้นๆ จะมอบภารกิจหรือบทสนทนาที่สำคัญในการขับเคลื่อนเนื้อเรื่อง
  • บทสนทนาจาก NPC: เมื่อผู้เล่นทำภารกิจเสร็จหรือทำการตัดสินใจสำคัญ NPC อาจมีบทสนทนาที่ทำให้ผู้เล่นเข้าใจสถานการณ์ที่เกิดขึ้นหรือแนะนำภารกิจใหม่

ตัวอย่างโค้ด

1. Mission

package com.example.missiongame.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Mission {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String description;
    private boolean isCompleted;

    @ManyToOne
    private Scene scene;  // ผูกภารกิจกับฉาก

    // Constructor, getters, and setters
    public Mission() {
    }

    public Mission(String name, String description, Scene scene) {
        this.name = name;
        this.description = description;
        this.isCompleted = false;
        this.scene = scene;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean isCompleted() {
        return isCompleted;
    }

    public void setCompleted(boolean completed) {
        isCompleted = completed;
    }

    public Scene getScene() {
        return scene;
    }

    public void setScene(Scene scene) {
        this.scene = scene;
    }
}

2. NPC

package com.example.missiongame.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class NPC {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String role;

    @ManyToOne
    private Scene scene;  // NPC ผูกกับ Scene

    // Constructor, getters, and setters
    public NPC() {
    }

    public NPC(String name, String role, Scene scene) {
        this.name = name;
        this.role = role;
        this.scene = scene;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public Scene getScene() {
        return scene;
    }

    public void setScene(Scene scene) {
        this.scene = scene;
    }
}

3. Scene

package com.example.missiongame.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Scene {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String description;

    // Constructor, getters, and setters
    public Scene() {
    }

    public Scene(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

4. Service สำหรับการจัดการภารกิจ

ใน GameService คุณสามารถเพิ่มการดึงภารกิจที่เกี่ยวข้องกับฉาก และการทำภารกิจให้เสร็จสมบูรณ์ได้:

package com.example.missiongame.service;

import com.example.missiongame.model.Mission;
import com.example.missiongame.model.Player;
import com.example.missiongame.repository.MissionRepository;
import com.example.missiongame.repository.PlayerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class GameService {

    @Autowired
    private MissionRepository missionRepository;

    @Autowired
    private PlayerRepository playerRepository;

    public Mission getNextMissionForPlayer(Long playerId) {
        Player player = playerRepository.findById(playerId).orElse(null);
        if (player == null) return null;

        // ค้นหาภารกิจถัดไปจาก Scene ที่ผู้เล่นอยู่
        return missionRepository.findBySceneIdAndIsCompleted(player.getCurrentSceneId(), false); // ตัวอย่างการค้นหาภารกิจถัดไป
    }

    public String completeMission(Long playerId, Long missionId) {
        Player player = playerRepository.findById(playerId).orElse(null);
        Mission mission = missionRepository.findById(missionId).orElse(null);
        if (player == null || mission == null) return "Invalid player or mission";

        if (!mission.isCompleted()) {
            mission.setCompleted(true);
            missionRepository.save(mission);
            player.setCurrentSceneId(mission.getScene().getId()); // เปลี่ยนฉาก
            playerRepository.save(player);
            return "Mission completed! Proceed to the next scene.";
        }

        return "Mission already completed!";
    }
}

5. Controller สำหรับการจัดการภารกิจ

เพิ่ม endpoint สำหรับการทำภารกิจให้เสร็จ:

package com.example.missiongame.controller;

import com.example.missiongame.service.GameService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

    @Autowired
    private GameService gameService;

    @PostMapping("/complete-mission/{playerId}/{missionId}")
    public String completeMission(@PathVariable Long playerId, @PathVariable Long missionId) {
        return gameService.completeMission(playerId, missionId);
    }
}

สรุป

การผูกภารกิจ (Mission) กับฉาก (Scene) จะทำให้โครงสร้างของระบบง่ายขึ้น เพราะฉากจะถือว่าเป็นที่ตั้งของ NPC, ภารกิจ และบทสนทนาต่างๆ ที่เกี่ยวข้องกับภารกิจนั้นๆ ซึ่งช่วยให้การจัดการภารกิจในแต่ละฉากมีความสมเหตุสมผลและสามารถขยายฟีเจอร์ได้ง่ายในอนาคต

 

 

ความคิดเห็น

บทความที่ได้รับความนิยม