กลับไปหน้ารวมไฟล์
try-to-win-against-this-othello-game-c4b71f.md

เกม Othello เป็นเกมกระดานวางแผนแนวๆ หมากรุกหรือหมากฮอสนั่นแหละ กฎง่ายๆ: ผู้เล่นสองคนผลัดกันวางหมากสีดำกับขาวบนกระดาน พอน้องวางหมากสีตัวเองแล้วต้อง "ล้อม" หมากของฝ่ายตรงข้ามให้อยู่ระหว่างหมากใหม่กับหมากเก่าของตัวเองที่วางอยู่แล้ว หมากที่ถูกล้อมก็จะกลายเป็นสีของน้องทันที เป้าหมายคือตอนจบเกมต้องมีหมากสีตัวเองเยอะกว่าอีกฝ่าย รู้เรื่องยัง? ง่ายมั้ยล่ะ!

ถ้าอยากรู้กฎแบบละเอียดยิบ ไปเสิร์ชในเน็ตเอาก็ได้ หรือจะลองเล่นกับโปรแกรมนี้ไปพลางๆ ก็เรียนรู้ได้เหมือนกัน ฝึกฝนไปเลยวัยรุ่น!

ชื่อเกม Othello นี่อ้างอิงมาจากบทละครชื่อดังของเชคสเปียร์ ส่วนโปรแกรมที่พี่เขียนชื่อ "Athalie" อ้างอิงมาจากบทละครของนักเขียนฝรั่งเศสชื่อ Racine เนี่ยแหละ ตั้งชื่อให้ดูมีระดับหน่อย 555+

ฟีเจอร์เด็ดๆ ของ Athalie มีดังนี้ จัดเต็ม:

- เล่นได้ 7 ระดับความยาก (จะลองของพี่ก็ได้นะ) - มีสองรูปแบบให้เล่น ทั้งบนจอคอม (Serial Monitor) และบนจอ OLED แยกกันหรือเล่นพร้อมกันก็ได้ - โหมด Replay ให้ย้อนกลับไปเดินใหม่ เปลี่ยนระดับความยาก สลับฝั่ง หรือดูรีเพลย์เกมที่เล่นไปแล้ว - โหมดสองผู้เล่น (สู้กับเพื่อนได้) - เวลาเป็นตาน้องเดิน จะมีไฮไลต์ช่องที่เดินได้ให้ดู (ไม่ต้องมานั่งนับ) - มีนาฬิกาจับเวลาแยกสำหรับแต่ละคน (ฟีเจอร์นี้มีเฉพาะบน OLED นะจ๊ะ)

เมนูหลัก

เกี่ยวกับเกม

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

ถ้ายังมือใหม่ ฟังพี่ไว้สองข้อนี้ จะได้ไม่แพ้ง่ายๆ:

- พยายามจำกัดช่องที่อีกฝ่ายเดินได้ และเพิ่มช่องที่ตัวเองเดินได้ วิธีทำคือ พยายามอย่าให้หมากตัวเองเยอะเกินไป (ยกเว้นตอนใกล้จบเกม) หมากน้อยแต่ได้ช่องเดินเยอะชนะ! - พยายามยึดช่องมุมกระดานให้ได้! ได้มุมนี่ได้เปรียบมหาศาล

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

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

เล่นกับบอร์ดเปล่าๆ ผ่าน Serial Monitor ก็ได้นะ

ส่วนอินเตอร์เฟซที่สอง ต้องใช้ **จอ 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

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "frenchy22"
category: "Gadgets, Games & Toys"
components:
  - "2x 12 mm pushbutton"
  - "1x Breadboard - 830 contacts"
  - "1x Voltage translator (4 channels)"
  - "4x 6mm pushbutton"
  - "1x 1.3\" OLED display I2C white"
  - "1x Arduino Nano Every with headers"
description: "Several game levels will allow you to discover the Othello game or to become a champion"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/3f43e722-01d7-4aba-a699-abef337a61a4.ino"
encryptedPayload: "U2FsdGVkX1/HfZXn9Iq24djns9IBLiQJ7+IzwNYOTMAirWvuj3yknUJ9XtI7pJBjCj8KAP/iYlfnW5wbCxuwRvEdaWy/C2HeMu9gMvZQFyU="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/try-to-win-against-this-othello-game-c4b71f_cover.jpg"
lang: "en"
likes: 0
passwordHash: "29f75336e99623d5ea5e450d0cb41200d6ccacce6ead4aabc0b2c49e0a49b141"
price: 299
seoDescription: "Test your skills against this Othello game on Arduino. Features multiple levels to help you become a champion."
tags:
  - "Games"
  - "Entertainment System"
title: "มาท้าประลอง Othello กัน! ชนะได้มั้ยล่ะวัยรุ่น?"
tools: []
videoLinks: []
views: 2344