pinball

ในโลกของเกมอาร์เคดที่เต็มไปด้วยความซับซ้อนทางกลไกอย่าง “พินบอล” (Pinball) ความท้าทายที่แท้จริงไม่ได้อยู่ที่การโยนลูกให้กระเด้งเท่านั้น แต่คือการจัดการสถานะ (State Management) และการคำนวณคะแนนที่เปลี่ยนแปลงตลอดเวลา ซึ่งเป็นโจทย์ที่ยอดเยี่ยมสำหรับการนำระบบฐานข้อมูลเชิงสัมพันธ์อย่าง PostgreSQL มาประยุกต์ใช้

ในฐานะ System Architect เรามองว่าเกมพินบอลคือระบบจำลองสถานการณ์ (Simulation System) ที่มีกฎเกณฑ์ที่เข้มงวด การจะจำลองการเคลื่อนที่ของลูก การชนกับขอบเขต (Bumpers) และการสะสมคอมโบ (Combo) ให้แม่นยำนั้น จำเป็นต้องใช้พลังในการจัดการข้อมูลที่สูง ซึ่ง PostgreSQL ด้วยคุณสมบัติขั้นสูง เช่น JSONB และ Stored Procedures จึงเป็นเครื่องมือที่เหมาะสมที่สุด

การออกแบบ Schema สำหรับระบบ Pinball

หัวใจของการจำลองเกมคือการสร้างตารางที่สามารถเก็บข้อมูลสถานะของเกมได้ (Game State) เราต้องเก็บข้อมูลมากกว่าแค่คะแนนรวม แต่รวมถึงสถานะปัจจุบันของลูก (Ball Status), พลังงานที่เหลือ (Power Level), และชุดคอมโบที่กำลังดำเนินอยู่

SQL

-- ตารางหลักสำหรับเก็บสถานะเกม (Game State) และคะแนน
CREATE TABLE pinball_session (
    session_id SERIAL PRIMARY KEY,
    current_score INTEGER DEFAULT 0,
    ball_status VARCHAR(50) DEFAULT 'idle',
    combo_count INTEGER DEFAULT 0,
    last_hit_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ตารางสำหรับบันทึกการชน (Hit Log) เพื่อคำนวณโบนัส
CREATE TABLE hit_log (
    log_id SERIAL PRIMARY KEY,
    session_id INTEGER REFERENCES pinball_session(session_id),
    hit_type VARCHAR(50), -- เช่น 'bumper', 'ramp', 'target'
    points_awarded INTEGER
);

การอัปเดตสถานะและคะแนนด้วย PostgreSQL

เมื่อลูกชนกับเป้าหมายใดเป้าหมายหนึ่ง (เช่น Bumper) ระบบจะต้องทำ 3 อย่างพร้อมกัน: 1) อัปเดตคะแนนรวม 2) เพิ่มค่า Combo 3) บันทึกเหตุการณ์การชน

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

SQL

BEGIN;

-- 1. อัปเดตคะแนนและสถานะเกม
UPDATE pinball_session
SET 
    current_score = current_score + 150,
    combo_count = combo_count + 1,
    ball_status = 'active'
WHERE session_id = 1;

-- 2. บันทึกเหตุการณ์การชน (Hit Log)
INSERT INTO hit_log (session_id, hit_type, points_awarded) 
VALUES (1, 'bumper', 150);

COMMIT;

การจัดการข้อมูลซับซ้อนด้วย JSONB

สำหรับเกมที่ซับซ้อนอย่างพินบอล การเก็บข้อมูลพารามิเตอร์หลายตัวพร้อมกัน เช่น ตำแหน่ง (X, Y), ทิศทาง (Direction), และพลังงาน (Power) ควรใช้ประเภทข้อมูล JSONB ของ PostgreSQL เพื่อความยืดหยุ่นในการขยายระบบในอนาคต

SQL

-- ตัวอย่างการอัปเดตตำแหน่งและพลังงานของลูก
UPDATE pinball_session
SET 
    game_state_jsonb = jsonb_set(
        game_state_jsonb, 
        '{position}', 
        jsonb_build_object('x', 50, 'y', 10)
    ), 
    power_level = power_level - 5
WHERE session_id = 1;

บทสรุป

การจำลองเกมพินบอลด้วย PostgreSQL ไม่เพียงแต่แสดงให้เห็นถึงความสามารถในการจัดการธุรกรรม (Transaction Management) เท่านั้น แต่ยังเน้นย้ำถึงความยืดหยุ่นในการออกแบบระบบฐานข้อมูลที่สามารถรองรับตรรกะทางธุรกิจที่ซับซ้อนได้ ไม่ว่าจะเป็นการคำนวณคะแนนแบบเรียลไทม์ การจัดการสถานะที่เปลี่ยนแปลงตลอดเวลา หรือการจัดเก็บข้อมูลเชิงโครงสร้างที่ยืดหยุ่นด้วย JSONB ทำให้ PostgreSQL เป็นรากฐานที่แข็งแกร่งสำหรับการสร้างระบบเกมจำลองที่ซับซ้อน

Exit mobile version