# Tic Tac Toe กับ AI ที่ไม่มีวันแพ้
Tic Tac Toe เป็นเกมคลาสสิกที่ผู้เล่นสองฝ่าย (X และ O) ผลัดกันวางสัญลักษณ์บนตาราง 3x3 โดยมีเป้าหมายเพื่อเรียงสัญลักษณ์ให้ครบ 3 ช่องในแนวนอน แนวตั้ง หรือแนวทแยง โปรเจ็กต์นี้พัฒนาขึ้นโดยใช้ **Vanilla JavaScript** และออกแบบให้มีโครงสร้างแบบโมดูล (Modules) เพื่อความยืดหยุ่นและขยายได้ง่าย โดยมีจุดเด่นคือการเพิ่ม **AI ที่ไม่มีวันแพ้** ซึ่งใช้ Minimax Algorithm เพื่อคำนวณการเคลื่อนไหวที่ดีที่สุด
## คุณสมบัติหลัก
- **ผู้เล่น vs AI**: ผู้เล่นเป็น "X" และ AI เป็น "O" โดย AI จะเล่นทันทีหลังจากผู้เล่นวางสัญลักษณ์
- **AI ที่ไม่มีวันแพ้**: AI ใช้ Minimax Algorithm เพื่อรับประกันว่าจะชนะหรืออย่างน้อยเสมอในทุกเกม
- **โครงสร้างแบบโมดูล**: แยกโค้ดเป็นส่วน ๆ (Game และ UI) เพื่อให้อ่านง่ายและขยายได้
- **ความปลอดภัย**: ป้องกัน XSS โดยใช้ `textContent` แทน `innerHTML`
- **ประสิทธิภาพ**: การจัดการ DOM ที่มีประสิทธิภาพและลดการคำนวณที่ไม่จำเป็น
- **Responsive Design**: ตารางและ UI ปรับขนาดได้ตามหน้าจอ
- **ไม่พึ่งพาไลบรารี**: ใช้ Vanilla JavaScript ล้วน ๆ รองรับการใช้งานบน Apache และ Nginx
## วัตถุประสงค์
โปรเจ็กต์นี้ถูกออกแบบมาเพื่อ:
- แสดงตัวอย่างการใช้ JavaScript ที่มีโครงสร้างแบบโมดูล
- นำเสนอการใช้งาน Minimax Algorithm ในเกมแบบ Turn-based
- สร้างโค้ดที่เข้าใจง่าย ขยายได้ และเหมาะกับการใช้งานจริง
- ให้ AI สามารถนำไปปรับใช้ในโปรเจ็กต์อื่น ๆ ได้
## วิธีการติดตั้ง
1. ดาวน์โหลดไฟล์ `index.html` จากโปรเจ็กต์นี้
2. วางไฟล์ในโฟลเดอร์ที่เซิร์ฟเวอร์ (เช่น Apache หรือ Nginx) สามารถเข้าถึงได้ หรือเปิดโดยตรงในเบราว์เซอร์
3. ไม่ต้องติดตั้งอะไรเพิ่มเติม เนื่องจากใช้ Vanilla JavaScript และไม่มี Dependency
## วิธีใช้งาน
1. เปิดไฟล์ `index.html` ในเบราว์เซอร์ (เช่น Chrome, Firefox)
2. คลิกที่ช่องในตาราง 3x3 เพื่อวางสัญลักษณ์ "X"
3. AI จะวาง "O" อัตโนมัติหลังจากคุณภายใน 0.5 วินาที
4. เล่นต่อไปจนกว่าจะมีผู้ชนะหรือเสมอ:
- หากเรียงครบ 3 ช่องก่อน คุณ (X) จะชนะ
- หาก AI (O) เรียงครบ 3 ช่องก่อน AI จะชนะ
- หากเต็มตารางโดยไม่มีผู้ชนะ เกมจะเสมอ
5. กดปุ่ม "Reset Game" เพื่อเริ่มเกมใหม่
## รายละเอียดการออกแบบ
### โครงสร้างโค้ด
- **Game Module**: จัดการตรรกะของเกม เช่น การตรวจสอบผู้ชนะ การเคลื่อนไหวของผู้เล่นและ AI และ Minimax Algorithm
- **UI Module**: จัดการการแสดงผลและการโต้ตอบกับผู้ใช้ เช่น การอัปเดตตารางและข้อความสถานะ
- โมดูลทั้งสองแยกจากกันตามหลักการ **SOLID** (Single Responsibility) ทำให้สามารถปรับปรุงส่วนใดส่วนหนึ่งได้โดยไม่กระทบส่วนอื่น
### Minimax Algorithm
- AI ใช้ Minimax เพื่อคำนวณการเคลื่อนไหวที่ดีที่สุด:
- คะแนน +10 ถ้า AI ชนะ
- คะแนน -10 ถ้าผู้เล่นชนะ
- คะแนน 0 ถ้าเสมอ
- อัลกอริทึมนี้รับประกันว่า AI จะไม่แพ้ โดยจะเลือกตำแหน่งที่ทำให้ชนะได้ทันที หรือบังคับให้เสมอหากไม่มีทางชนะ
### ความปลอดภัยและประสิทธิภาพ
- ใช้ `textContent` เพื่อป้องกัน XSS
- Minimax คำนวณเฉพาะช่องว่างที่มีอยู่ ลดการใช้ทรัพยากร
- การอัปเดต DOM ทำเฉพาะเมื่อจำเป็น
### UI/UX
- ตาราง 3x3 มี Hover Effect เพื่อความชัดเจน
- ข้อความสถานะเปลี่ยนตามเทิร์นของผู้เล่นและ AI
- ดีเลย์ 0.5 วินาทีของ AI ทำให้เกมดูเป็นธรรมชาติ
## การขยายในอนาคต
- เพิ่มระดับความยาก (เช่น ทำให้ AI เล่นแบบสุ่มบางครั้ง)
- ปรับขนาดตารางเป็น 4x4 หรือใหญ่กว่า
- เพิ่มระบบคะแนนหรือการบันทึกสถิติ
- ปรับแต่ง UI เช่น เปลี่ยนสีหรือเพิ่มอนิเมชัน
## ข้อจำกัด
- AI ออกแบบมาให้ไม่มีวันแพ้ ดังนั้นผู้เล่นจะชนะได้ก็ต่อเมื่อ AI ไม่มีทางเลือกอื่น ซึ่งเกิดขึ้นได้ยาก
- รองรับเฉพาะตาราง 3x3 ในเวอร์ชันปัจจุบัน
## เครดิต
พัฒนาโดยใช้แนวทางการออกแบบที่เน้นความยืดหยุ่นและประสิทธิภาพตามข้อกำหนดของ JavaScript Framework ที่มีโครงสร้างแบบโมดูล โดย xAI
## วันที่สร้าง
21 มีนาคม 2568 (March 21, 2025)
---
หากมีคำถามหรือต้องการปรับปรุงโปรเจ็กต์เพิ่มเติม แจ้งมาได้เลย!