บทนำ — ทำไมต้องใช้ AI สร้างเนื้อเรื่องเกม?

ผมเคยพัฒนาเกมเล็กๆ หลายตัว และปัญหาที่ใหญ่ที่สุดคือการเขียนบทสนทนา ยิ่งเกมมีตัวละครหลายตัว มีทางเลือกเยอะ ยิ่งต้องเขียนสคริปต์มากขึ้นแบบทวีคูณ สมมติมี 5 ทางเลือก แต่ละทางเลือกแตกออกไปอีก 3 ทาง คุณจะต้องเขียนบทสนทนาถึง 5×3 = 15 เวอร์ชัน ยังไม่รวมถ้าผู้เล่นกลับมาทางเดิมอีก วันนี้ผมจะสอนคุณสร้างระบบที่ใช้ AI สร้างเนื้อเรื่องและบทสนทนาแบบแยกทางโดยอัตโนมัติ ตั้งแต่เริ่มต้นเลย ไม่ต้องมีความรู้เรื่อง API มาก่อนก็ทำได้ สิ่งที่คุณต้องมีคือบัญชี สมัครที่นี่ ซึ่งมีราคาถูกมากเมื่อเทียบกับ OpenAI โดยคิดเป็นอัตรา ¥1=$1 ประหยัดได้ถึง 85% พร้อมรองรับ WeChat และ Alipay สำหรับคนไทย

หลักการทำงานของระบบ

ระบบที่เราจะสร้างมี 3 ส่วนหลัก: ลองนึกภาพว่าระบบทำงานแบบนี้: ผู้เล่นเดินเข้าป่า → AI สร้างเหตุการณ์ "พบชาวป่าหลงทาง" → มีทางเลือก 3 ทาง (ช่วย / เดินผ่าน / ขโมยของ) → แต่ละทางแตกออกเป็นเนื้อเรื่องใหม่

ขั้นตอนที่ 1 — เตรียมเครื่องมือและสร้างโปรเจกต์

ก่อนอื่นให้คุณสร้างโฟลเดอร์สำหรับโปรเจกต์ และสร้างไฟล์ Python ไว้ในนั้น ผมจะใช้ชื่อว่า game_story_system.py สำหรับคนที่ยังไม่รู้ว่า Python คืออะไร ให้เข้าไปดาวน์โหลดได้ที่ python.org เลือกเวอร์ชัน 3.10 ขึ้นไป ติดตั้งแบบเดิมๆ ไม่ต้องเปลี่ยนอะไร หลังติดตั้งเสร็จ เปิด Command Prompt (กด Windows+R พิมพ์ cmd) แล้วพิมพ์คำสั่งติดตั้งไลบรารี:
pip install requests
ไลบรารี requests จะช่วยให้โค้ดของเราสามารถคุยกับ API ได้

ขั้นตอนที่ 2 — เขียนโค้ดเชื่อมต่อ HolySheep AI

มาถึงส่วนสำคัญแล้ว นี่คือโค้ดพื้นฐานที่สุดในการเชื่อมต่อกับ AI
import requests
import json

ตั้งค่าการเชื่อมต่อกับ HolySheep AI

API_KEY = "YOUR_HOLYSHEEP_API_KEY" # ใส่ API Key ที่ได้จากการสมัคร BASE_URL = "https://api.holysheep.ai/v1" def call_ai(prompt, system_instruction=""): """ส่งข้อความไปถาม AI และรับคำตอบกลับมา""" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } messages = [] # ถ้ามีคำสั่งระบบ (เช่น บอกว่า AI คือใคร) ก็ใส่ก่อน if system_instruction: messages.append({"role": "system", "content": system_instruction}) # ใส่คำถามของผู้ใช้ messages.append({"role": "user", "content": prompt}) data = { "model": "gpt-4.1", # ใช้โมเดล GPT-4.1 ซึ่งราคาถูกมาก "messages": messages, "temperature": 0.8 # ยิ่งสูงยิ่งสร้างสรรค์ แต่อาจเพี้ยน } response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=data ) if response.status_code == 200: result = response.json() return result["choices"][0]["message"]["content"] else: return f"เกิดข้อผิดพลาด: {response.status_code}"

ทดสอบการเชื่อมต่อ

print("กำลังทดสอบการเชื่อมต่อ...") result = call_ai("ทักทายสั้นๆ ว่า AI พร้อมทำงานหรือยัง") print(result)
หลังจากใส่ API Key ที่ได้จากการสมัคร สมัครที่นี่ แล้ว รันโค้ดนี้ ถ้าขึ้นข้อความตอบกลับจาก AI แสดงว่าเชื่อมต่อสำเร็จ

ขั้นตอนที่ 3 — สร้างระบบสร้างเนื้อเรื่อง (Plot Generator)

ต่อไปเราจะสร้างฟังก์ชันที่ให้ AI สร้างเนื้อเรื่องใหม่ให้เกมของเรา
def generate_plot(scene_context, player_choice=""):
    """สร้างเนื้อเรื่องใหม่ตามสถานการณ์ปัจจุบัน"""
    
    prompt = f"""คุณคือนักเขียนบทเกมมืออาชีพ สร้างเนื้อเรื่องใหม่สำหรับเกมแฟนตาซี

สถานการณ์ปัจจุบัน: {scene_context}
ทางเลือกของผู้เล่น: {player_choice if player_choice else "ยังไม่มีทางเลือก"}

สร้างเนื้อเรื่องใหม่ในรูปแบบ JSON ดังนี้:
{{
    "event_name": "ชื่อเหตุการณ์",
    "description": "คำอธิบายฉาก (2-3 ประโยค)",
    "choices": [
        {{"id": 1, "text": "ทางเลือกที่ 1"}},
        {{"id": 2, "text": "ทางเลือกที่ 2"}},
        {{"id": 3, "text": "ทางเลือกที่ 3"}}
    ],
    "mood": "บรรยากาศ เช่น ตึงเครียด/สนุก/ลึกลับ"
}}

ให้แต่ละทางเลือกมีผลลัพธ์ที่แตกต่างกันอย่างชัดเจน"""

    system = "คุณเป็น AI ที่ช่วยสร้างเนื้อเรื่องเกม ตอบกลับเฉพาะ JSON เท่านั้น ห้ามอธิบายเพิ่ม"
    
    response = call_ai(prompt, system)
    
    try:
        # แปลงข้อความที่ AI ตอบกลับมาเป็นข้อมูลที่ใช้งานได้
        plot_data = json.loads(response)
        return plot_data
    except:
        # ถ้า AI ตอบมาไม่เป็น JSON ตรงๆ ลองหาในข้อความ
        import re
        match = re.search(r'\{.*\}', response, re.DOTALL)
        if match:
            return json.loads(match.group())
        return {"error": "ไม่สามารถอ่านข้อมูลได้"}

ทดสอบ

scene = "ผู้เล่นเดินเข้าป่ามืดมนพบกระท่อมประหลาด" result = generate_plot(scene, "เข้าไปในกระท่อม") print(f"เนื้อเรื่องใหม่: {result['event_name']}") print(f"บรรยากาศ: {result['mood']}")
ผลลัพธ์ที่ได้จะเป็นข้อมูลเนื้อเรื่องในรูปแบบ JSON ที่มีชื่อเหตุการณ์ คำอธิบายฉาก และทางเลือก 3 ทางพร้อมใช้งาน

ขั้นตอนที่ 4 — สร้างระบบบทสนทนาแยกทาง (Branching Dialogue)

ต่อไปคือหัวใจของระบบ — ทำให้บทสนทนาแตกออกเป็นเส้นทางต่างๆ ตามทางเลือกของผู้เล่น
class DialogueNode:
    """โหนดบทสนทนาหนึ่งจุด"""
    def __init__(self, character, text, choices=None):
        self.character = character
        self.text = text
        self.choices = choices or []  # รายการทางเลือก
        self.next_nodes = {}  # ทางเลือก -> โหนดถัดไป

class DialogueTree:
    """ระบบต้นไม้บทสนทนาทั้งหมด"""
    def __init__(self):
        self.nodes = {}  # id -> DialogueNode
        self.current_node_id = None
        self.history = []  # เก็บประวัติบทสนทนา
        
    def generate_dialogue(self, character, context, player_input=""):
        """ใช้ AI สร้างบทสนทนาใหม่"""
        
        prompt = f"""ตัวละคร: {character}
บริบทปัจจุบัน: {context}
ข้อความผู้เล่น: {player_input if player_input else "เริ่มสนทนา"}

สร้างบทสนทนาที่ตัวละครจะพูด พร้อมทางเลือก 2-3 ทางให้ผู้เล่น รูปแบบ JSON:
{{
    "character": "ชื่อตัวละคร",
    "dialogue": "บทสนทนาที่ตัวละครพูด (2-3 ประโยค)",
    "choices": [
        {{"id": 1, "text": "ทางเลือก 1"}},
        {{"id": 2, "text": "ทางเลือก 2"}},
        {{"id": 3, "text": "ทางเลือก 3"}}
    ],
    "emotion": "อารมณ์ตัวละคร เช่น ยิ้ม/เศร้า/โกรธ"
}}"""

        system = "คุณคือตัวละครในเกม ตอบเฉพาะ JSON เท่านั้น"
        
        response = call_ai(prompt, system)
        
        try:
            dialogue_data = json.loads(response)
            node = DialogueNode(
                dialogue_data["character"],
                dialogue_data["dialogue"],
                dialogue_data["choices"]
            )
            
            # สร้าง id สำหรับโหนดนี้
            node_id = f"node_{len(self.nodes)}"
            self.nodes[node_id] = node
            
            if self.current_node_id is None:
                self.current_node_id = node_id
            
            self.history.append({
                "node_id": node_id,
                "character": dialogue_data["character"],
                "dialogue": dialogue_data["dialogue"],
                "emotion": dialogue_data.get("emotion", "ปกติ")
            })
            
            return dialogue_data
            
        except:
            return {"error": "สร้างบทสนทนาล้มเหลว"}

    def get_player_choices(self):
        """ดึงทางเลือกปัจจุบัน"""
        if self.current_node_id:
            current = self.nodes[self.current_node_id]
            return current.choices
        return []

ทดสอบระบบบทสนทนา

dialogue_system = DialogueTree()

บทสนทนาแรก

result1 = dialogue_system.generate_dialogue( "พ่อมดชรา", "ผู้เล่นเดินเข้ามาในร้านเด็ดดอกไม้และเห็นพ่อมดชรานั่งอยู่", "" ) print(f"{result1['character']}: {result1['dialogue']}") print(f"อารมณ์: {result1['emotion']}") print("ทางเลือก:", result1['choices'])
จากโค้ดนี้ ทุกครั้งที่ผู้เล่นเลือกทาง ระบบจะสร้างบทสนทนาใหม่โดยให้ AI ต่อเนื่องจากสิ่งที่เกิดขึ้นก่อนหน้า

ขั้นตอนที่ 5 — ระบบจำความ (Memory System)

สิ่งสำคัญที่ทำให้เนื้อเรื่องต่อเนื่องกันคือการให้ AI จำได้ว่าเกิดอะไรมาแล้ว ไม่งั้น AI จะลืมและสร้างเนื้อเ