วันนี้ผมจะมาแนะนำวิธีใช้ Excel สร้างเกม Sudoku (Excel Sudoku) อย่างง่ายขึ้นมา โดยที่จะมำให้ Excel ไฟล์นี้สามารถตรวจสอบได้ว่าเลขที่เราใส่ลงไปผิดกติกาของเกม Sudoku หรือไม่ แต่อันนี้จะไม่ฉลาดพอที่สามารถเฉลยเกม Sudoku ได้นะครับ ถ้าอยากได้แบบนั้นเดี๋ยวมี Link ให้อีกทีนึงท้ายบทความครับ
สารบัญ
กติกาเบื้องต้นเกม Sudoku

- มีตาราง 9 x 9
- ใส่ได้แค่เลข 1-9
- ใส่เลขห้ามซ้ำกัน
- ในแต่ละแถว
- ในแต่ละคอลัมน์
- ในแต่ละกรอบตาราง Block ใหญ่ 3 x 3 (เหมือนที่ตีกรอบหนาไว้)
- จะมีเลขใส่มาให้เบื้องต้นบางส่วนก่อน ถ้าเกมง่ายๆก็จะใส่มาให้เยอะหน่อย ถ้าเกมยาก ก็จะใส่มาให้น้อย
- เราจะเล่นเกม โดยมีเป้าหมายคือ ใส่เลขต่อให้ครบทุกช่อง โดยไม่ทำผิดกติกาข้างบน ถ้าทำได้ก็ถือว่าจบเกม
วิธีสร้างตัวตรวจกติกาเกม Sudoku
โหลดไฟล์ตัวอย่างได้ที่นี่
- ไฟล์ก่อนกรอกเลข (แสดงสูตรให้เห็น) sudoku-inwexcel(.xlsx)
- ไฟล์หลังกรอกเลข (ซ่อนสูตร + lock cell พร้อมให้ user เล่น) sudoku-inwexcel2(.xlsx)
Concept : เช็คว่ามีการทำผิดกติกาหรือไม่ ไล่ตามกติกาที่เขียนข้างบน แล้วนับว่ามีการทำผิดกติกากี่อัน/กี่ครั้ง จากนั้นนำผลการนับที่ได้มารวมกัน ถ้าสรุปแล้วมากกว่า 0 แสดงว่ามีการทำผิดกติกา
สร้างตารางขนาด 9×9
โดยปรับให้ขนาดของแถวและคอลัมน์ให้กว้างพอๆ กันตามรูป โดยให้เว้นช่องรอบนอกไว้เล็กน้อย เราจะเอาไว้เขียนสูตรเพื่อตรวจสอบความถูกต้อง ดังนั้นผมจึงเริ่มมุมซ้ายบนที่ช่อง C3 ครับ และอาจจัด Format ตัวหนังสือให้อยู่ตรงกลางทั้งแนวนอนและแนวตั้ง จะได้สวยๆ

กำหนดเงื่อนไข ว่าให้ใส่ได้แค่เลข 1-9 เท่านั้น
เราจะทำโดยใช้ Data Validation โดยเลือกพื้นที่ตาราง 9×9 แล้วไปที่ Ribbon Data=> Data Validation =>Data Validation…
ใน Allow ให้เลือก Whole Number (จำนวนเต็ม) Between Minimum=1 Maximum=9
สร้างตัวตรวจสอบว่าแต่ละแถวมีเลข 1-9 กี่ตัว
ใช้ COUNTIF มาช่วย =COUNTIF(แต่ละแถว,แต่ละเลข1-9)
ในที่นี้ผมเขียนว่า
=COUNTIF($C3:$K3,M$2)
เพราะ C3:K3 ผมคือแถวแรก ส่วน M2 ผมคือเลข 1
พอ copy ไปยังช่องอื่น สูตรจะใช้ได้โดยอันโนมัติ เพราะผม Lock คอลัมน์ไว้ที่คอลัมน์ C กับ K (เพื่อไล่ไปแต่ละแถวลงไปข้างล่าง) ส่วนช่อง M2 ล๊อคแถวไว้ เวลา Copy ไปจะได้ไล่ไปยังเลข 2-9 ต่อไปได้

สร้างตัวตรวจสอบว่าแต่ละคอลัมน์มีเลข 1-9 กี่ตัว
ใช้ COUNTIF มาช่วย =COUNTIF(แต่ละคอลัมน์,แต่ละเลข1-9)
ในที่นี้ผมเขียนว่า
=COUNTIF(C$3:C$11,$B13)
เพราะ C3:C11 ผมคือคอลัมน์แรก ส่วน B13 ผมคือเลข 1
พอ copy ไปยังช่องอื่น สูตรจะใช้ได้โดยอันโนมัติ เพราะผม Lockแถวไว้ที่แถว 3 กับ 11 (เพื่อไล่ไปแต่ละคอลัมน์ทางขวา) ส่วนช่อง B13 ล๊อคคอลัมน์ไว้ เวลา Copy ไปจะได้ไล่ไปยังเลข 2-9 ต่อไปได้

สร้างตารางตรวจเช็คการใส่ข้อมูลซ้ำ ในแต่ละ Zone 3×3 อันใหญ่
โดยใช้เทคนิค คล้ายๆ ที่เขียนไว้ใน http://www.thepexcel.com/prevent-duplicate-data-entry/
แต่ว่าเราจะไม่ใช้ Data Validation แล้ว เพราะเราได้ใช้ไปแล้วในชั้นตอนแรก และผู้เล่นอาจต้องการลองใส่เลขเข้าไปก่อน ถ้าใช้ Data Validation จะไม่ยอมให้ใส่เลย อันนั้นแรงเกินไป ดังนั้นเราจะเขียนทดไว้อีกทีนึงแทนตามรูป (ขวาล่าง)
โดยที่เราต้องเขียนสูตร 9 ครั้ง แยกแต่ละ Block ใหญ่ที่เป็นขนาด 3×3

ใน Block แรก (M13) เขียนว่า =COUNTIF($C$3:$E$5,C3) แล้ว copy paste แค่ zone ตัวเอง คือ ช่อง M13 ถึง O15

ใน Block ถัดไปทางขวา (P13) เขียนว่า
=COUNTIF($F$3:$H$5,F3)
แล้ว copy paste แค่ zone ตัวเอง คือ ช่อง P13 ถึง R15
ทำแบบนี้จบครบ 9 Block
ต่อไป เราจะเช็คว่าทั้ง 3 ตารางตัวช่วยที่เราสร้างขึ้นมานั้น มีเลขอะไรที่มากกว่า 1 หรือไม่ ถ้าหากมี แสดงว่าทำผิดกติกา
โดยใช้ COUNTIF มานับว่าช่วงที่เราหามีเลขอะไรมากกว่า 1 หรือไม่นั่นเอง โดยเขียนว่า
=COUNTIF(C13:K21,">1")
=COUNTIF(M3:U11,">1")
=COUNTIF(M13:U21,">1")
จากนั้นนำผลนับที่ได้มากรวมกัน ถ้ามากกว่า 0 แปลว่ามีการทำผิดกติกาครับ

ทำการ Link ไปแสดงผลด้านบน พร้อมใส่ Conditional Format ให้สวยงาม
เช่น ถ้า 3 ช่องนั้น SUM ได้มากกว่า 0 ให้เขียนว่า ไม่ ok เป็นต้น
ในที่นี้ผมเขียนว่า
=IF(M23>0,"ไม่ok","ok")
โดย M23 ผมเป็นช่องที่เช็คผลรวมความผิดปกติ

สุดท้ายก็เช็คว่ากรอกครบทุกช่องแล้วหรือยัง ถ้าครบ 81 ช่องแล้วและยัง Ok อยู่ก็ถือว่าจบเกมครับ ^^
ในที่นี้ ผมเขียนเพิ่มไปว่า
=IF(M23>0,"ไม่ok",IF(COUNT(C3:K11)=9*9,"จบเกม","ok"))
การเตรียมการก่อนให้ผู้เล่นเริ่มเล่นเกมจริง
ทีนี้ ก็สามารถใส่เลขเริ่มต้น ตามแต่ละ Puzzle ที่ได้มาได้เลย
เพื่อความสะดวก และไม่ให้สับสนว่าเลขไหนเป็นเลขเริ่มต้น เลขไหนเป็นเลขที่ให้ผู้เล่นเพิ่มทีหลัง อาจใช้วิธี Fill สี หรือ ทำสีอักษรให้ต่างจากปกติก็ได้
เทคนิคการเลือกพื้นที่เฉพาะที่เป็นเลขเริ่มต้นของเรา
ให้เลือกพื้นที่ทั้งหมดในตาราง => Ctrl+G => Special => Constant => มันจะเลือกเฉพาะที่มีการกรอกข้อมูลเริ่มต้นไปแล้ว
จากนั้นค่อยใส่สี หรืออะไรให้ต่างจากปกติ แล้วค่อยซ่อนแถวและคอลัมน์ที่เป็นตัวทดของเราไปซะ เพื่อความสะอาดตาด้วยการเลือก แถว หรือ column แล้วคลิ๊กขวา => Hide

เพื่อความสะดวกในการลบเลขที่ให้ผู้เล่นเพิ่มเข้าไปเพื่อเริ่มเกมใหม่ เราอาจจะ Lock Cell เฉพาะที่เป็นเลขเริ่มต้นไว้ โดยจะไม่ Lock ช่องที่ให้ผู้เล่นกรอกเอง โดยทำดังนี้
เลือกพื้นที่ทั้งหมดในตาราง => Ribbon Home =>Cells =>Format =>ติ๊กเอา Lock Cell ออก (เพื่อปลดการ Lock Cell ทั้งหมดก่อน)
เลือกพื้นที่เฉพาะที่เป็นเลขเริ่มต้นของเรา มันจะเลือกเฉพาะที่มีการกรอกข้อมูลเริ่มต้นไปแล้ว จากนั้นกด
Ribbon Home =>Cells =>Format => ติ๊กให้ Lock Cell ทำงาน (เพื่อให้ Lock Cell เฉพาะที่มีการใส่เลขลงไปแล้ว) จากนั้นกด Ribbon Review => Protect Sheet
ถ้าติ๊กเอา Select Locked Cell ออก จะเป็นการห้ามให้ผู้เล่นมาเลือกช่องที่กรอกไว้แล้ว
จะใส่ Password หรือไม่ก็ได้ แล้วกด OK
เท่านี้ เวลาเล่น ก็จะไม่สามารถไม่ต้องกังวลว่าจะเผลอลบช่องที่เป็นตัวเลขเริ่มต้นแล้ว และเราก็สามารถเอาไปให้คนอื่นเล่นเกม Sudoku ของเราได้แล้วครับ
ที่นี้ถ้าใครอยากได้ตัวโปรแกรมแก้ปัญหา Sudoku แบบบอกเฉลยได้เลย ผมจะแนะนำ Link ให้ครับ
Sudoku Solver
แบบที่ 1 : แก้โดยไม่ใช้ VBA แต่ใช้ Iteration แทน
ดาวน์โหลดไฟล์
https://templates.office.com/en-us/Sudoku-puzzle-solver-TM10080972
สอนวิธีเขียน
- Building a Basic, Understandable Sudoku Solver Using Excel Iterative Calculation – Part 1/2
- Building a Basic, Understandable Sudoku Solver Using Excel Iterative Calculation – Part 2/2
แบบที่ 2 แก้โดยใช้ VBA
ลอง search Google ว่า Excel Sudoku Solver VBA ดูครับ
Leave a Reply