ฉันถือว่าคุณรู้แล้วเกี่ยวกับแนวคิดของ Min-Max, ต้นไม้และการตัดแต่ง, การแก้ปัญหาและพื้นฐานอื่น ๆ และสิ่งที่ฉันเขียนที่นี่เป็นเพียงรายละเอียดบางอย่างที่อาจถูกประเมินต่ำเกินไป
ฉันกับ บริษัท เพื่อนเขียนเครื่องมือหมากรุกของเราเองในบางครั้งที่ผ่านมา ฉันแบ่งปันปัญหาและแนวคิดที่เรามีและฉันหวังว่าคุณจะพบว่ามีประโยชน์
เนื่องจากเราทั้งคู่เป็นโปรแกรมเมอร์ Java ภาษาของเราเปลี่ยนเป็นจาวาและเราเริ่มด้วยวิธีการเชิงวัตถุ ชิ้นเป็นวัตถุกระดานเป็นวัตถุไฟล์และอันดับ (แถวและคอลัมน์ในวรรณคดีหมากรุก) เป็นวัตถุ และนี่เป็นสิ่งที่ผิด ค่าใช้จ่ายสูงมากและโปรแกรมพยายามดิ้นรนเพื่อไปให้ไกลกว่า 2 จังหวะ (4 ชั้น) ในแผนผังการค้นหา
ด้วยการค้นหาบางอย่างเราจึงมีความคิดที่ยอดเยี่ยม (ไม่ใช่ของเรา!): แสดงชิ้นส่วนและกระดานเป็นจำนวนเต็มแบบยาว (64 บิต) เรื่องนี้สมเหตุสมผลเพราะกระดานหมากรุกมี 64 ช่อง ส่วนที่เหลือเป็นการทำงานที่ฉลาดเล็กน้อย (ทำงานใกล้ cpu = เร็วมาก) ตัวอย่างเช่นลองพิจารณาเลขจำนวนเต็มไบนารี 64 บิตที่รายการนั้นแสดงสี่เหลี่ยมบนกระดานที่ชิ้นส่วนของคุณสามารถโจมตีได้ ตอนนี้ถ้าคุณเรียกใช้ตรรกะ "AND" ระหว่างตัวเลขสองตัวเช่นนี้ผลลัพธ์ที่ไม่เป็นศูนย์ระบุว่าคุณมีช่องสี่เหลี่ยมที่มีผู้โจมตี มีหลายวิธีในการนำเสนอกระดานหมากรุกและชิ้นส่วนดังนั้น:
1 - ตัดสินใจเกี่ยวกับการนำเสนอของคณะกรรมการ
จากนั้นคุณต้องการและเปิดฐานข้อมูล การเปิดตัวหมากรุกนั้นได้รับการแก้ไขแล้วมดแนะนำอย่างยิ่งให้มีและเปิดหนังสือ ในกรณีนี้คุณมีเวลามากในเกมบลิทซ์
2 - ค้นหาหนังสือเปิดตัว
เราทำสิ่งเหล่านี้ แต่เราก็ยังห่างไกลจากความดี:
3 - เอ็นจิ้นหมากรุกที่ดีควรจะเห็นการเคลื่อนไหว 6 ครั้ง (12 ชั้น) ข้างหน้า
ดังนั้นสิ่งที่เราทำในตอนนั้นคือใช้เวลาที่ตาย (ถ้าเป็นคอมพิวเตอร์ของมนุษย์กับคอมพิวเตอร์)
4 - ใช้เวลาที่ฝ่ายตรงข้ามกำลังคิดที่จะสร้างระดับของต้นไม้ของคุณ
และเราก็ยังห่างไกลจาก 12 กลุ่ม จากการศึกษาเพิ่มเติมเราค้นพบเทคนิคบางอย่าง! ตัวอย่างเช่นมีข้อเสนอแนะให้ข้ามชั้นหนึ่งของต้นไม้และเริ่มต้นจากชั้นต่อไป (เหมือนไม่มีฝ่ายตรงข้าม) แนวคิดก็คือถ้าการเคลื่อนไหวนั้นเป็นเรื่องงี่เง่าอย่างมากทำไมต้องเสียเวลาและดูว่าฝ่ายตรงข้ามตอบสนองต่อการเคลื่อนไหวนั้นอย่างไร อย่างไรก็ตามหนึ่งในเครื่องมือที่ดีควรแยกความแตกต่างระหว่างการเคลื่อนไหวแบบงี่เง่ากับการเสียสละอย่างอัจฉริยะ
5 - เรียนรู้เทคนิคการเขียนโปรแกรมสำหรับปัญหาเฉพาะนี้ (หมากรุก)
ฉันและเพื่อนของฉันในสถานะนี้ยังคงไม่ดี: / สิ่งที่เราสามารถทำได้ - และบางส่วนที่เราทำ - คือการบันทึกตำแหน่งที่คำนวณได้ หากคุณคำนวณตำแหน่งให้บันทึกในอนาคต! เช่นเดียวกับการวนซ้ำในแผนผังการค้นหา จุดคือการบันทึก / ดึงข้อมูลอย่างมีประสิทธิภาพ:
6 - บันทึกข้อมูลที่คุณสร้าง ... อย่างมีประสิทธิภาพ!
และในที่สุดก็:
7 - รหัสพร้อมการเพิ่มประสิทธิภาพสูงสุด
ปัญหานี้มีราคาแพงมากทั้งในเวลา CPU และหน่วยความจำ มันสำคัญมากที่จะต้องเขียนโค้ดของคุณอย่างมีประสิทธิภาพ โปรดจำไว้ว่าเรากำลังพูดถึงปัจจัยสาขาที่ 35 ซึ่งหมายความว่าไร้ประโยชน์ "ถ้า" ที่ไหนสักแห่งในฮิวริสติกของคุณสามารถกลายเป็น3.3792205e+18
ไร้ประโยชน์ "ถ้า" ที่ไหนสักแห่งลึกลงไปในต้นไม้ค้นหาของคุณ
การเขียนโปรแกรมหมากรุกเป็นความท้าทายที่น่าสนใจมากและถึงเวลาที่คุณสามารถทดสอบความสามารถในการเขียนโปรแกรมของคุณได้ มีอีกไม่กี่จุดที่ฉันสามารถแนะนำได้ แต่ฉันแน่ใจว่าคุณจะค้นพบพวกเขาด้วยตัวเอง มีอีกหลายจุดที่ฉันไม่รู้ แต่คุณสามารถหาได้จากอินเทอร์เน็ต!
ขอให้โชคดีและสนุก!
ป.ล. ฉันไม่รู้จักจาวาสคริปต์เป็นอย่างดี แต่มีบางอย่างกำลังบอกฉันถึงความยากลำบากของปัญหาบางทีการพิจารณาทั้งหมดที่ C ++ สามารถนำเสนอได้จะเป็นการดีกว่าที่จะวางจาวาสคริปต์ใน C ++