excel sudoku

สอนทำเกม Sudoku ( Excel Sudoku)

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

กติกาเบื้องต้นเกม Sudoku

excel 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 ตัวหนังสือให้อยู่ตรงกลางทั้งแนวนอนและแนวตั้ง จะได้สวยๆ

สอนทำเกม Sudoku ( Excel Sudoku) 1

กำหนดเงื่อนไข ว่าให้ใส่ได้แค่เลข 1-9 เท่านั้น

เราจะทำโดยใช้ Data Validation โดยเลือกพื้นที่ตาราง 9×9 แล้วไปที่ Ribbon Data=> Data Validation =>Data Validation…

ใน Allow ให้เลือก Whole Number (จำนวนเต็ม) Between Minimum=1 Maximum=9
sudoku-2

สร้างตัวตรวจสอบว่าแต่ละแถวมีเลข 1-9 กี่ตัว

ใช้ COUNTIF มาช่วย =COUNTIF(แต่ละแถว,แต่ละเลข1-9)

ในที่นี้ผมเขียนว่า 

=COUNTIF($C3:$K3,M$2)

เพราะ C3:K3 ผมคือแถวแรก ส่วน M2 ผมคือเลข 1

พอ copy ไปยังช่องอื่น สูตรจะใช้ได้โดยอันโนมัติ เพราะผม Lock คอลัมน์ไว้ที่คอลัมน์ C กับ K (เพื่อไล่ไปแต่ละแถวลงไปข้างล่าง) ส่วนช่อง M2 ล๊อคแถวไว้ เวลา Copy ไปจะได้ไล่ไปยังเลข 2-9 ต่อไปได้

สอนทำเกม Sudoku ( Excel Sudoku) 2

สร้างตัวตรวจสอบว่าแต่ละคอลัมน์มีเลข 1-9 กี่ตัว

ใช้ COUNTIF มาช่วย =COUNTIF(แต่ละคอลัมน์,แต่ละเลข1-9)

ในที่นี้ผมเขียนว่า

=COUNTIF(C$3:C$11,$B13)

เพราะ C3:C11 ผมคือคอลัมน์แรก ส่วน B13 ผมคือเลข 1

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

สอนทำเกม Sudoku ( Excel Sudoku) 3

สร้างตารางตรวจเช็คการใส่ข้อมูลซ้ำ ในแต่ละ Zone 3×3 อันใหญ่ 

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

โดยที่เราต้องเขียนสูตร 9 ครั้ง แยกแต่ละ Block ใหญ่ที่เป็นขนาด 3×3

สอนทำเกม Sudoku ( Excel Sudoku) 4

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

สอนทำเกม Sudoku ( Excel Sudoku) 5

ใน 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 แปลว่ามีการทำผิดกติกาครับ

สอนทำเกม Sudoku ( Excel Sudoku) 6

ทำการ Link ไปแสดงผลด้านบน พร้อมใส่ Conditional Format ให้สวยงาม

เช่น ถ้า 3 ช่องนั้น SUM ได้มากกว่า 0 ให้เขียนว่า ไม่ ok เป็นต้น
ในที่นี้ผมเขียนว่า 

=IF(M23>0,"ไม่ok","ok") 

โดย M23 ผมเป็นช่องที่เช็คผลรวมความผิดปกติ

สอนทำเกม Sudoku ( Excel Sudoku) 7

สุดท้ายก็เช็คว่ากรอกครบทุกช่องแล้วหรือยัง ถ้าครบ 81 ช่องแล้วและยัง Ok อยู่ก็ถือว่าจบเกมครับ ^^
ในที่นี้ ผมเขียนเพิ่มไปว่า 

=IF(M23>0,"ไม่ok",IF(COUNT(C3:K11)=9*9,"จบเกม","ok"))

การเตรียมการก่อนให้ผู้เล่นเริ่มเล่นเกมจริง

ทีนี้ ก็สามารถใส่เลขเริ่มต้น ตามแต่ละ Puzzle ที่ได้มาได้เลย

เพื่อความสะดวก และไม่ให้สับสนว่าเลขไหนเป็นเลขเริ่มต้น เลขไหนเป็นเลขที่ให้ผู้เล่นเพิ่มทีหลัง อาจใช้วิธี Fill สี หรือ ทำสีอักษรให้ต่างจากปกติก็ได้

เทคนิคการเลือกพื้นที่เฉพาะที่เป็นเลขเริ่มต้นของเรา
ให้เลือกพื้นที่ทั้งหมดในตาราง => Ctrl+G => Special => Constant => มันจะเลือกเฉพาะที่มีการกรอกข้อมูลเริ่มต้นไปแล้ว

จากนั้นค่อยใส่สี หรืออะไรให้ต่างจากปกติ แล้วค่อยซ่อนแถวและคอลัมน์ที่เป็นตัวทดของเราไปซะ เพื่อความสะอาดตาด้วยการเลือก แถว หรือ column แล้วคลิ๊กขวา => Hide

สอนทำเกม Sudoku ( Excel Sudoku) 8

เพื่อความสะดวกในการลบเลขที่ให้ผู้เล่นเพิ่มเข้าไปเพื่อเริ่มเกมใหม่ เราอาจจะ 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

สอนวิธีเขียน

แบบที่ 2 แก้โดยใช้ VBA

ลอง search Google ว่า Excel Sudoku Solver VBA ดูครับ