
เกม Othello เป็นเกมกระดานวางแผนแนวๆ หมากรุกหรือหมากฮอสนั่นแหละ กฎง่ายๆ: ผู้เล่นสองคนผลัดกันวางหมากสีดำกับขาวบนกระดาน พอน้องวางหมากสีตัวเองแล้วต้อง "ล้อม" หมากของฝ่ายตรงข้ามให้อยู่ระหว่างหมากใหม่กับหมากเก่าของตัวเองที่วางอยู่แล้ว หมากที่ถูกล้อมก็จะกลายเป็นสีของน้องทันที เป้าหมายคือตอนจบเกมต้องมีหมากสีตัวเองเยอะกว่าอีกฝ่าย รู้เรื่องยัง? ง่ายมั้ยล่ะ!
ถ้าอยากรู้กฎแบบละเอียดยิบ ไปเสิร์ชในเน็ตเอาก็ได้ หรือจะลองเล่นกับโปรแกรมนี้ไปพลางๆ ก็เรียนรู้ได้เหมือนกัน ฝึกฝนไปเลยวัยรุ่น!
ชื่อเกม Othello นี่อ้างอิงมาจากบทละครชื่อดังของเชคสเปียร์ ส่วนโปรแกรมที่พี่เขียนชื่อ "Athalie" อ้างอิงมาจากบทละครของนักเขียนฝรั่งเศสชื่อ Racine เนี่ยแหละ ตั้งชื่อให้ดูมีระดับหน่อย 555+
ฟีเจอร์เด็ดๆ ของ Athalie มีดังนี้ จัดเต็ม:
- เล่นได้ 7 ระดับความยาก (จะลองของพี่ก็ได้นะ) - มีสองรูปแบบให้เล่น ทั้งบนจอคอม (Serial Monitor) และบนจอ OLED แยกกันหรือเล่นพร้อมกันก็ได้ - โหมด Replay ให้ย้อนกลับไปเดินใหม่ เปลี่ยนระดับความยาก สลับฝั่ง หรือดูรีเพลย์เกมที่เล่นไปแล้ว - โหมดสองผู้เล่น (สู้กับเพื่อนได้) - เวลาเป็นตาน้องเดิน จะมีไฮไลต์ช่องที่เดินได้ให้ดู (ไม่ต้องมานั่งนับ) - มีนาฬิกาจับเวลาแยกสำหรับแต่ละคน (ฟีเจอร์นี้มีเฉพาะบน OLED นะจ๊ะ)

เกี่ยวกับเกม
Othello เป็นเกมที่ดังมากกก มีสหพันธ์และมีการแข่งขันชิงแชมป์โลกกันเลยทีเดียว จุดเด่นคือโปรแกรมคอมบางตัวสามารถเอาชนะมนุษย์ระดับเทพได้ เพราะมนุษย์มองการณ์ไกลไม่ค่อยออกว่าหลังเดินไปหลายตาจะเกิดอะไรขึ้น ส่วน Athalie ของพี่ยังไปไม่ถึงขั้นนั้นหรอก แต่มันช่วยฝึกให้น้องเก่งขึ้นจนถึงระดับนึงได้แน่นอน สู้ๆนะ!
ถ้ายังมือใหม่ ฟังพี่ไว้สองข้อนี้ จะได้ไม่แพ้ง่ายๆ:
- พยายามจำกัดช่องที่อีกฝ่ายเดินได้ และเพิ่มช่องที่ตัวเองเดินได้ วิธีทำคือ พยายามอย่าให้หมากตัวเองเยอะเกินไป (ยกเว้นตอนใกล้จบเกม) หมากน้อยแต่ได้ช่องเดินเยอะชนะ! - พยายามยึดช่องมุมกระดานให้ได้! ได้มุมนี่ได้เปรียบมหาศาล





ฮาร์ดแวร์ที่ใช้

โปรแกรมนี้รันบนบอร์ด **Arduino Nano Every** มีให้เล่นสองแบบ แบบแรกคือเล่นผ่าน Serial Monitor ของ Arduino IDE เลย ถ้าเล่นแบบนี้ก็แค่มีบอร์ด Nano Every กับสาย USB เสียบคอมก็เล่นได้แล้ว ง่ายๆ

ส่วนอินเตอร์เฟซที่สอง ต้องใช้ **จอ OLED และปุ่มกด 6 ปุ่ม** พร้อมแล้วจะได้เล่นแบบสแตนด์อโลน ไม่ต้องพึ่งคอม!
จอ OLED ที่ใช้เป็นแบบขาวดำ 128x64 พิกเซล ต้องใช้ **Level Translator** ด้วยนะ เพราะ logic level ของ Nano Every เป็น 5V แต่จอ OLED ต้องการ 3.3V ระวังเฟิร์มแวร์จะช็อต! จอควบคุมผ่าน I2C
ปุ่มกดใหญ่ (12mm) 2 ปุ่ม ใช้เป็นปุ่ม Menu กับ Enter ส่วนปุ่มเล็ก (6mm) อีก 4 ปุ่ม วางเป็นลูกศร 4 ทิศ เหมือนจอยสติ๊ก ใช้ง่ายมาก
การวิเคราะห์สัญญาณและระดับลอจิก (Signal-Swing & Logical-Level Forensics)
วิเคราะห์ตัวแปลงระดับ (Level-Translator Analytics): บอร์ด Nano Every ทำงานที่ 5V ในขณะที่จอ OLED ต้องการ 3.3V เลยต้องมีตัวแปลงระดับ 4 ช่องมาคอยจัดการเรื่องเกณฑ์ลอจิก (logic-thresholds) และรักษาความสมบูรณ์ของสัญญาณ การวินิจฉัยนี้ทำให้มั่นใจว่าขอบสัญญาณ I2C ความถี่สูงยังคงสภาพเดิม ไม่เกิดปรากฏการณ์ลอจิกหลอน (logical-ghosting) หรือสัญญาณเสื่อมสภาพ
ฮิวริสติกส์ทิศทางอินพุต (Input-Directional Heuristics): ใช้ปุ่มกด 4 ปุ่มเลียนแบบจอยสติ๊กสำหรับการนำทาง การวิเคราะห์เน้นไปที่ "การวินิจฉัยเวกเตอร์ทิศทาง (Directional-Vector Diagnostics)" เพื่อให้แน่ใจว่าลอจิกของเคอร์เซอร์แมปเข้ากับพิกัดของกระดานได้ถูกต้อง สำหรับอินพุตผู้ใช้ที่แม่นยำ
ซอฟต์แวร์
ซอฟต์แวร์ใช้ไลบรารี่ 2 ตัวที่ติดตั้งผ่าน Library Manager ได้เลย:
- u8g2 โดย Oliver สำหรับควบคุมจอ OLED ต้องปรับบรรทัดที่ 19 ของโปรแกรมให้เข้ากับจอของตัวเอง โดยเฉพาะตัวควบคุมจอ (display controller) เช่น SH1106, SSD1306...
- TimerInterrupt_Generic โดย Khoi Hoang สำหรับควบคุมนาฬิกาจับเวลาของผู้เล่น
ถ้าน้องใช้แค่ Serial Monitor เป็นอินเทอร์เฟซผู้ใช้ ก็ไม่จำเป็นต้องติดตั้งไลบรารี่พวกนี้ ขอแค่คอมเมนต์หรือลบบรรทัดที่ 15 ของโปรแกรมออก (#define OLEDDisplay) เท่านั้นเอง ถ้าทำแบบนี้ โปรแกรมจะไม่ควบคุมจอ OLED และปุ่มกดอีกต่อไป ฟีเจอร์เกมยังเหมือนเดิมทุกประการ ยกเว้นนาฬิกาจับเวลาที่จะหายไป ทำให้การคอมไพล์และอัปโหลดเร็วขึ้นมาก
การอธิบายว่าโปรแกรมจัดการเกมและอินเทอร์เฟซยังไงน่ะไม่ค่อยสำคัญเท่าไหร่ สิ่งที่พี่คิดว่าสำคัญกว่าคือการอธิบายว่า Athalie หาตาเดินที่ดีที่สุดยังไงตอนถึงตามันเล่น มีองค์ประกอบ 4 อย่างที่ช่วยในการค้นหานี้: หนังสือเปิดเกม (opening book), ฟังก์ชันประเมินค่า (evaluation function), อัลกอริทึมมินิแมกซ์ (mini-max) และอัลกอริทึมอัลฟา-เบตา (alpha-beta)
การวินิจฉัยเมทริกซ์ HMI และสถานะภาพ (HMI-Matrix & Visual-State Diagnostics)
การตรวจสอบแรสเตอร์ OLED (The OLED-Raster Probe): สถานะเชิงพื้นที่ของเกมจะถูกเรนเดอร์บนจอขาวดำขนาด 128x64 พิกเซล ซึ่งเกี่ยวข้องกับการจัดการความหน่วงของแพ็กเก็ต I2C ในระหว่างการอัปเดตกระดานที่มีความหนาแน่นสูง เพื่อให้มั่นใจว่าผู้ใช้จะได้รับประสบการณ์ภาพที่ลื่นไหล
การวิเคราะห์นาฬิกาจับเวลาด้วยอินเตอร์รัปต์ (Interrupt-Driven Stopwatch Analytics): การใช้ไลบรารี่ `TimerInterrupt` ช่วยรักษาการจับเวลาเกมที่มีความแม่นยำระดับต่ำกว่ามิลลิวินาทีสำหรับผู้เล่นทั้งสอง การวินิจฉัยนี้ทำให้มั่นใจว่าการคำนวณของ CPU ในส่วนลอจิกเอนจิ้นที่เข้มข้น จะไม่ทำให้เกิดความคลาดเคลื่อนของเวลาในนาฬิกาจับเวลาผู้ใช้ (temporal-drift harmonics) ทำให้การจับเวลายังคงแม่นยำ
หนังสือเปิดเกม (Opening Book)
โปรแกรมรู้ชุดการเดินเริ่มต้นที่เล่นกันบ่อยๆ หลายชุด มันจะเดินตามชุดเหล่านี้แบบกลไก จนกว่าจะเจอการเดินที่มันไม่รู้จักในชุดนั้น ชุดเหล่านี้ถูกบันทึกในโปรแกรมเป็นสตริง เช่น "C4C3D3C5D6F4F5" ซึ่งง่ายต่อการแก้ไขหรือเพิ่มเติม ในช่วงนี้โปรแกรมจะเร็วมาก
ฟังก์ชันประเมินค่าและการวิเคราะห์กลยุทธ์ (Evaluation Function & Strategy Forensics)
ฟังก์ชันประเมินค่าคือสูตรลับ (cooking recipe) ที่พยายามประเมินค่าตำแหน่งคงที่ของเกม โปรแกรมเมอร์แต่ละคนมีสูตรของตัวเอง สูตรของพี่ใช้เกณฑ์หลายอย่าง เช่น ความสามารถในการเดินของแต่ละผู้เล่น (mobility) ขอบที่มีหมากสีเดียวกัน 5 ตัว, ค่าที่กำหนดให้กับแต่ละช่องบนกระดาน ฯลฯ เกณฑ์เหล่านี้จะถูกผสมด้วยสัมประสิทธิ์ที่แปรผันตามจำนวนหมากทั้งหมด ซึ่งก็คือความก้าวหน้าของเกม ผลลัพธ์ที่ได้คือคะแนน ยิ่งคะแนนนี้มากเท่าไหร่ ตำแหน่งนั้นก็ยิ่งถูกตัดสินว่าเป็นประโยชน์กับผู้เล่นสีขาวมากเท่านั้น
เอนจิ้นใช้สูตรประเมินค่าที่ซับซ้อน โดยอิงจากความสามารถในการเดิน (mobility), การควบคุมขอบ (edge-control) และการครอบครองมุม (corner-dominance) การวิเคราะห์เกี่ยวข้องกับการปรับแต่ง "สัมประสิทธิ์กลยุทธ์ (Strategy-Coefficients)" (เช่น การให้น้ำหนักมุมเป็น 10 เท่าของความสามารถในการเดิน) การวินิจฉัยใช้รูทีน "เล่นกับตัวเอง (Self-Play)" ซึ่งพี่ทำโดยให้ Athalie เล่นกับตัวเองบนบอร์ด Arduino สองบอร์ดที่สื่อสารกันผ่านไลบรารี่ SoftwareSerial เพื่อปรับแต่งการวิเคราะห์กลยุทธ์ให้ดีที่สุด
อัลกอริทึมมินิแมกซ์: การประสานลอจิกการตัดสินใจ (Mini-Max Algorithm: The Decision-Logic Orchestration)
จากตำแหน่งหนึ่ง เราลองเดินที่เป็นไปได้ทั้งหมดสำหรับผู้เล่นที่ถึงตาเล่น จากนั้นเราลองคำตอบที่เป็นไปได้ทั้งหมดจากผู้เล่นอีกฝ่าย ทำแบบนี้ไปเรื่อยๆ จนกว่าจะถึงความลึก (depth) ที่กำหนดโดยระดับความยากของเกม เมื่อกระบวนการนี้สิ้นสุดลง เราจะใช้ฟังก์ชันประเมินค่าเพื่อให้คะแนนกับตำแหน่งที่ได้ แล้วส่งคะแนนนี้กลับไปยังระดับบน เพื่อนำไปเปรียบเทียบกับคะแนนของการเดินอื่นๆ เพื่อเลือกการเดินที่ดีที่สุด
ในการทำเช่นนี้ เราใช้ฟังก์ชันเรียกตัวเอง (recursive function) (ซึ่งพี่ตั้งชื่อว่า bestMove) นั่นคือมันจะเรียกตัวเองซ้ำๆ ตามจำนวนระดับที่ต้องสำรวจ สิ่งนี้ทำให้มีข้อจำกัดบางอย่าง โดยเฉพาะเรื่องปริมาณ RAM ที่ใช้ (ในแต่ละระดับเราต้องทำสำเนาของกระดาน) และการใช้ตัวแปรโกลบอล (global variables)
ระบบนี้ใช้เมทริกซ์การตัดสินใจแบบเรียกตัวเอง (recursive decision-matrix) ในระดับที่สูงขึ้น (7+) เอนจิ้นจะประเมินสถานะกระดานที่เป็นไปได้หลายพันสถานะ การวินิจฉัยจะเน้นไปที่ "การวิเคราะห์การแบ่งพาร์ทิชัน RAM (RAM-Partitioning Analytics)" เพื่อให้แน่ใจว่าสแต็กของฟังก์ชันเรียกตัวเองจะไม่ทำให้เกิดการชนกันของฮีป (heap-collision) หรือหน่วยความจำล้น (memory overflow)
อัลกอริทึมอัลฟา-เบตา: การตัดแต่งความประสาน (Alpha-Beta Algorithm: Pruning Harmonics)
อัลกอริทึมมินิแมกซ์อาจใช้เวลานานมาก โดยเฉพาะเมื่อระดับเกมสูง อัลกอริทึมอัลฟา-เบตาเป็นเครื่องมือทรงพลังที่ใช้เร่งความเร็วอัลกอริทึมมินิแมกซ์ ลองนึกภาพว่าน้องลองเดินไปบางตาแล้ว และพบคะแนนที่ดีพอสำหรับอย่างน้อยหนึ่งในนั้น จากนั้นน้องลองเดินอีกตา และเห็นว่าคู่ต่อสู้สามารถตอบโต้ด้วยการเดินที่ทำให้น้องตาย น้องคิดว่ามีประโยชน์มั้ยที่จะประเมินคำตอบอื่นๆ ของคู่ต่อสู้? แน่นอนว่าไม่ อย่าเสียเวลาประเมินคำตอบสำหรับการเดินที่มันจะไม่ถูกเล่นอยู่แล้ว นี่เรียกว่าการตัดแต่ง (pruning) เราตัดกิ่งของต้นไม้ที่เรากำลังสำรวจออก
เพื่อประสิทธิภาพของอัลกอริทึมอัลฟา-เบตาที่ดีขึ้น สิ่งสำคัญคือต้องประเมินการเดินที่ดีที่สุดก่อน ดังนั้น ก่อนที่จะสำรวจต้นไม้ เราจะประเมินตำแหน่งที่ได้จากการเดินที่เป็นไปได้ทั้งหมดจากตำแหน่งหนึ่ง แล้วเรียงลำดับตามคะแนนของพวกมัน
เพื่อเร่งการทำงาน เฟิร์มแวร์ใช้การตัดแต่งอัลฟา-เบตา (alpha-beta pruning) การวิเคราะห์เกี่ยวข้องกับการ "ตัด (Cutting)" กิ่งย่อยที่แน่นอน ซึ่งไม่สามารถปรับปรุงค่าของโหนดปัจจุบันได้ การวินิจฉัยเน้นไปที่ "การวิเคราะห์ประสิทธิภาพการตัดแต่ง (Pruning-Efficiency Analytics)" ซึ่งสามารถลดความซับซ้อนของการค้นหาจาก O(b^d) ลงเหลือประมาณ O(b^(d/2)) ได้อย่างมีนัยสำคัญ โดยที่ b คือแฟคเตอร์การแตกกิ่ง (branching factor) และ d คือความลึก
สรุป
ถ้าน้องสนใจโปรแกรมนี้ ตอนนี้น้องก็มีกุญแจบางดอกที่จะเข้าใจการทำงานของมันแล้ว แต่ถึงแม้น้องจะไม่พยายามแยกชิ้นส่วนเอนจิ้น น้องก็อาจสนุกกับการพัฒนาทักษะในเกม Othello และสนุกกับการเล่นกับ Athalie พี่จะดีใจมากถ้าน้องโพสต์ความคิดเห็นมาบอกพี่ว่าน้องสามารถเอาชนะ Athalie ได้ในระดับไหน
โปรเจกต์นี้แสดงให้เห็นถึงการนำลอจิกเกมแบบกำหนดได้ (deterministic game-logic) และการประสานมินิแมกซ์แบบอะซิงโครนัส (asynchronous minimax orchestration) บน Arduino Nano Every อย่างเข้มงวด ด้วยการเชี่ยวชาญในการวิเคราะห์มินิแมกซ์และการตัดแต่งอัลฟา-เบตา มันส่งมอบแพลตฟอร์มเกมระดับมืออาชีพที่แข็งแกร่ง ซึ่งให้ความลึกเชิงกลยุทธ์ที่ชัดเจนผ่านการวินิจฉัยต้นไม้การตัดสินใจ (decision-tree diagnostics) ที่ซับซ้อน
Logic Persistence: ฝึกฝนกลยุทธ์การวิเคราะห์ข้อมูลด้วยการสืบสวนแบบ Minimax