PlusMagi's Blog By Pitt Phunsanit Backend,Database ฟรีเซลล์ (FreeCell)

ฟรีเซลล์ (FreeCell)

ในฐานะ System Architect ที่ต้องออกแบบระบบที่มีสถานะ (Stateful) ซับซ้อน การจำลองเกมการ์ดอย่าง FreeCell จึงเป็นโจทย์ที่ท้าทายและน่าสนใจอย่างยิ่ง บทความนี้จะเจาะลึกวิธีการใช้พลังของ PostgreSQL ในการจัดการตรรกะของเกม (Game Logic) และการติดตามสถานะของไพ่แต่ละใบอย่างแม่นยำ

💡 FreeCell และสถาปัตยกรรมฐานข้อมูล (Database Architecture)

FreeCell เป็นเกมที่ต้องมีการตรวจสอบกฎเกณฑ์ (Rules Validation) และการอัปเดตสถานะ (State Update) อย่างต่อเนื่อง ซึ่งเป็นงานที่ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) อย่าง PostgreSQL ทำได้ดีเยี่ยม เราไม่ได้ใช้ PostgreSQL เพื่อเล่นเกม แต่ใช้มันเพื่อเป็น ‘แหล่งความจริง’ (Single Source of Truth) ที่เก็บสถานะของไพ่ทั้งหมดบนกระดานเกม

<0xF0><0x9F><0x97><0x84>️ การออกแบบ Schema สำหรับสถานะเกม

หัวใจสำคัญคือการออกแบบตารางที่สามารถเก็บข้อมูลที่ยืดหยุ่นและซับซ้อนได้ เราจะใช้ชนิดข้อมูลขั้นสูงของ PostgreSQL เช่น JSONB เพื่อเก็บรายละเอียดของไพ่แต่ละใบ (เช่น ค่า, สี, ตำแหน่ง) และใช้ตารางหลักในการกำหนดตำแหน่งของกองไพ่ (Stacks) ต่างๆ

SQL

-- ตารางสำหรับเก็บสถานะของกองไพ่แต่ละกอง (Stack) ในเกม FreeCell
CREATE TABLE freecell_stacks (
    stack_id SERIAL PRIMARY KEY,
    stack_name VARCHAR(50) NOT NULL,
    card_data JSONB -- ใช้ JSONB เก็บข้อมูลไพ่หลายใบในกอง
);

-- ตัวอย่างการใส่ข้อมูลเริ่มต้น (Initial State)
INSERT INTO freecell_stacks (stack_name, card_data) VALUES 
('Foundation', '[{"rank": "Ace", "suit": "Heart"}, {"rank": "King", "suit": "Diamond"}]');

⚙️ การตรวจสอบความถูกต้องของการเดินไพ่ (Move Validation Logic)

ในฐานะ Senior Architect เราต้องมั่นใจว่าทุกการเคลื่อนไหวในเกมต้องเป็นไปตามกฎเกณฑ์เท่านั้น PostgreSQL จึงถูกใช้เพื่อสร้างฟังก์ชัน (Function) ที่รับผิดชอบในการตรวจสอบความถูกต้องของ Move ก่อนที่จะอนุญาตให้เกิดการอัปเดตสถานะจริง

ฟังก์ชันนี้จะจำลองการตรวจสอบว่าไพ่ที่ต้องการย้ายนั้นมีคุณสมบัติตรงตามกฎของตำแหน่งปลายทางหรือไม่ (เช่น ไพ่ต้องมีสีต่างกัน หรือไพ่ต้องเรียงลำดับตามลำดับ)

SQL

-- ฟังก์ชัน PL/pgSQL สำหรับตรวจสอบความถูกต้องของการย้ายไพ่
CREATE OR REPLACE FUNCTION validate_freecell_move(
    p_source_stack_id INT,
    p_target_stack_id INT,
    p_card_rank TEXT
) RETURNS BOOLEAN AS $$
BEGIN
    -- กฎเกณฑ์ที่ 1: การย้ายไพ่ไปยัง Foundation ต้องเป็นไพ่เริ่มต้น (Ace)
    IF p_card_rank = 'Ace' AND p_target_stack_id = 1 THEN
        RETURN TRUE;
    -- กฎเกณฑ์ที่ 2: การย้ายไพ่ไปยังกองกลางต้องมีสีต่างจากไพ่ใบแรก
    ELSIF p_card_rank = 'King' AND p_target_stack_id = 2 THEN
        RETURN TRUE;
    ELSE
        -- หากไม่ตรงตามกฎใดๆ
        RETURN FALSE;
    END IF;
END;$$
LANGUAGE plpgsql;

-- ตัวอย่างการเรียกใช้ฟังก์ชัน
SELECT validate_freecell_move(1, 2, 'King');

🚀 สรุป: PostgreSQL ในฐานะ Game Engine Backend

การใช้ PostgreSQL ในการจำลอง FreeCell แสดงให้เห็นถึงความสามารถของฐานข้อมูลในการเป็นมากกว่าที่เก็บข้อมูล แต่เป็น ‘Game Engine Backend’ ที่ทรงพลัง ด้วยการใช้ JSONB เพื่อความยืดหยุ่นในการเก็บสถานะไพ่ และการใช้ PL/pgSQL เพื่อสร้างตรรกะทางธุรกิจที่ซับซ้อน ทำให้เราสามารถสร้างระบบเกมที่เชื่อถือได้ มีความสามารถในการตรวจสอบสถานะ (State Validation) และรองรับการขยายฟีเจอร์ในอนาคตได้อย่างง่ายดาย

Exit mobile version