วิธีที่ดีที่สุดสำหรับการเขียนโปรแกรมหมากรุก? [ปิด]


15

ฉันเป็นคนที่ชอบเล่นหมากรุกและเป็นโปรแกรมเมอร์ ฉันเพิ่งตัดสินใจเริ่มสร้างโปรแกรมหมากรุกโดยใช้หมากรุกและความรู้ด้านการเขียนโปรแกรมของฉัน ดังนั้นนี่คือคำถามของฉัน:

ควรใช้ภาษาใด (ฉันคุ้นเคยกับ Java, C ++ และ Python) และวิธีการในขณะที่เขียนเอ็นจิ้นหมากรุก

คำแนะนำเล็กน้อยจะได้รับการชื่นชมมาก

แก้ไข:

ดังนั้นฉันตัดสินใจที่จะทำมันใน JavaScript ฉันดาวน์โหลดChess UI นี้จาก github และตอนนี้ฉันก็พร้อมแล้ว! ขั้นตอนแรกของฉันคือการเขียนการเคลื่อนไหวทางกฎหมายสำหรับมัน ดังนั้นใครสามารถชี้ฉันในทิศทางที่ถูกต้องได้หรือไม่? (ฉันใหม่สำหรับ jQuery แต่มีประสบการณ์ในการเขียนโปรแกรมมาก)

PS: ฉันไม่ได้พยายามสร้างเครื่องมือที่มีประสิทธิภาพมาก (ฉันรู้ว่ามันยากเกินไป) ฉันแค่อยากทำความคุ้นเคยกับกระบวนการและเรียนรู้เทคนิคใหม่ ๆ ตลอดทาง


5
ภาษาและระเบียบวิธีหลักใด ๆ ที่จะทำไม่มีอะไรพิเศษเกี่ยวกับกลไกหมากรุก (ในเรื่องนั้น)
yannis

3
ฉันจะเฉพาะเจาะจงมากขึ้นเกี่ยวกับเป้าหมาย หากคุณต้องการต้มลงไปในชุดกฎการท่องจำมันเป็นงานที่ยิ่งใหญ่ แต่โปรแกรมเมอร์คนใดก็ตามที่สามารถเรียงลำดับวิธีการที่ดุร้าย หากคุณต้องการเข้าไปในสิ่งต่าง ๆ เช่นการจดจำรูปแบบหรือการชั่งน้ำหนักของความเสี่ยงเทียบกับรางวัลนั่นคือคำตอบที่อาจได้รับน้ำผลไม้
Erik Reppen

คุณได้เช็คเอาต์ส่วนการสอนภายใต้วิกิหมากรุกเอ็นจิ้นแล้วหรือยัง สิ่งเหล่านี้ดูเหมือนจะมีความหมายเฉพาะเพื่อสอนการเขียนโปรแกรมหมากรุกและเป็นโอเพนซอร์สทั้งหมด แม้ว่าคุณจะไม่ได้ใช้ซอร์สโค้ดที่แท้จริงเอกสารก็มักจะอธิบายสิ่งที่อยู่เบื้องหลังการพัฒนา: en.wikipedia.org/wiki/Chess_engine#Categorizations
user60812

1
ส่วนที่ยากจริงๆคือการประเมินตำแหน่งที่กำหนดเพราะคุณต้องดูว่าตำแหน่ง A นั้นดีกว่าตำแหน่ง B หรือไม่เพื่อเลือก

1
ไม่ชัดเจนว่าคุณต้องการรู้อะไร คุณตัดสินใจเป็นตัวแทนของตำแหน่งหรือไม่? ถ้าเป็นเช่นนั้นขั้นตอนต่อไปคือการเขียนและทดสอบเครื่องกำเนิดย้าย ไม่แน่ใจว่าคุณคิดอย่างไรกับ jQuery
kevin cline

คำตอบ:


19

ผู้เล่นหมากรุกอันดับ 2072 ที่นี่ ฉันทำเว็บไซต์นี้ด้วยจาวาสคริปต์แท้ในช่วงสุดสัปดาห์ มันไม่ใช่เอ็นจิ้นหมากรุก (ฉันออกแบบมาเพื่อสร้างตำแหน่งการเปิดเพื่อความบันเทิงเหมือนกับเอนจิ้น Chess960 ที่ผิดปกติ) แต่มันเป็นจุดเริ่มต้น รหัสแหล่งที่มาที่นี่

มีภาวะแทรกซ้อนมากมายที่เกี่ยวข้องในการทำบอร์ดที่ใช้งานได้ เหล่านี้รวมถึง:

  • ขั้นแรกให้หาวิธีแสดงการเคลื่อนไหวทางกฎหมายขั้นพื้นฐาน คุณต้องทำคณิตศาสตร์ด้วยพิกัดเริ่มต้นและสิ้นสุด ตัวอย่างเช่นเมื่อมีการเคลื่อนไหวแบบโกงหนึ่งในพิกัดจะต้องเหมือนกันก่อนและหลัง ด้วยการเลื่อนของอัศวินผลรวมของค่าสัมบูรณ์ของการเปลี่ยนแปลงพิกัดจะต้องเป็น 3 และทั้งสองพิกัดจะต้องเปลี่ยน ด้วยการเคลื่อนไหวของอธิการทั้งผลรวมของพิกัดยังคงเหมือนเดิมหรือทั้งคู่จะเพิ่มขึ้นตามจำนวนที่เท่ากัน ผู้จำนำนั้นมีเล่ห์เหลี่ยมที่สุดเพราะคุณไม่เพียง แต่ต้องคิดออกว่าพวกมันสามารถเคลื่อนที่สองสแควร์สหรือหนึ่งอัน (ตรวจสอบแถวและสีแทนการเก็บจำนวนการเคลื่อนไหวที่พวกเขาทำ) แต่ต้องจัดการกับการจับภาพในแนวทแยงมุมทั้งหมดด้วย - ส่งต่อสิ่ง
  • การจับเป็นสิ่งที่ท้าทายเนื่องจากเบี้ยและตรวจสอบ คุณไม่สามารถพูดได้ว่าหากชิ้นส่วนหนึ่งย้ายไปที่ตารางของอีกชิ้นหนึ่งนั่นเป็นการจับภาพ ท้ายที่สุดแล้วผู้จำนำไม่สามารถย้ายไปที่จตุรัสอีกชิ้นหนึ่งเพื่อจับพวกเขามีวิธีพิเศษในการจับภาพ
  • คุณต้องหาวิธีที่มีประสิทธิภาพเพื่อดูว่าชิ้นส่วนของศัตรูนั้นเคลื่อนที่ไปข้างหน้าหรือไม่เพื่อที่จะตัดสินว่ามันถูกกฎหมายหรือไม่
  • ตรวจสอบเป็นสิ่งที่ท้าทายที่จะจัดการกับ หลังจากการเคลื่อนไหวทุกครั้งคุณต้องตรวจสอบสี่เหลี่ยมทั้งหมดที่ชิ้นส่วนศัตรูสามารถเข้าไปดูว่าหนึ่งในนั้นเกี่ยวข้องกับราชาของคุณหรือไม่และถ้าเป็นเช่นนั้นมันเป็นการเคลื่อนไหวที่ผิดกฎหมาย
  • Castling, en passant, promotion, Stalemate, Draws Force, Repetition - สิ่งเหล่านี้ไม่สำคัญเลยที่จะจัดการตามขนาดของปัญหา

เอ็นจิ้นหมากรุกทั้งหมดทำงานโดยดูที่ส่วนย่อยของการเคลื่อนไหวทางกฎหมายในตำแหน่งและประเมินตัวเลขเพื่อแสดงค่าที่สัมพันธ์กันโดยทำการเคลื่อนย้ายเหล่านั้นและทำสิ่งเดียวกันสำหรับตำแหน่งที่เกิดซ้ำ ปัญหาคู่ของคุณที่นี่คือ

  • วิธีเก็บข้อมูลนี้อย่างมีประสิทธิภาพ
  • วิธีดำเนินการค้นหาแบบเรียกซ้ำ - หลังจากนี้คุณไม่สามารถปล่อยให้มันดำเนินต่อไปได้ดังนั้นคุณต้องกำหนดขีด จำกัด แล้วหาวิธีการออกแบบอัลกอริทึมของคุณเพื่อทำการค้นหาที่ดีที่สุดและทั่วถึงภายในขีด จำกัด นั้น ตัวอย่างเช่นคุณต้องการตรวจสอบให้แน่ใจว่าอย่างน้อยเกิดขึ้นกับการประเมินผลบางอย่างสำหรับการเริ่มต้นแต่ละครั้งที่เป็นไปได้ แต่คุณอาจต้องการใช้เวลามากขึ้นในการประเมินการเคลื่อนไหวที่มีแนวโน้มมากกว่าแทนที่จะให้เวลาเท่ากันทุกครั้ง

ทั้งหมดนี้อยู่ด้านบนของการออกแบบอัลกอริทึมในตอนแรกซึ่งมีข้อมูลมากมาย

สำหรับภาษาที่ใช้กับ (แม้ว่าฉันเดาว่าคุณตัดสินใจใช้ JavaScript แล้ว) ฉันคิดว่ามันขึ้นอยู่กับเป้าหมายของคุณมากกว่าสิ่งอื่นใด ฉันต้องการสร้างเหมืองออนไลน์ (และพัฒนา JavaScript ให้ดีขึ้น) ดังนั้น JavaScript จึงเป็นตัวเลือกของฉัน ภาษาการเขียนโปรแกรมเชิงวัตถุใด ๆ จะทำ

เมื่อคุณพอใจกับสิ่งที่คุณทำแล้วทรัพยากรต่อไปนี้อาจพิสูจน์ได้ว่ามีประโยชน์จริง ๆ :

โชคดี!


ขอบคุณมากมันช่วยฉันได้มากในการเริ่มต้น แม้ว่าจะยังมีอะไรอีกมากมายให้เรียนรู้และนำไปใช้ประโยชน์ได้ แต่เอ็นจิ้นหมากรุกไม่ง่ายที่จะเขียน แต่ฉันคิดว่ามันดีที่จะทำงานกับสิ่งที่คุณรัก!
Adnan Zahid

ฉันเห็นด้วย. ฉันต้องการมีประวัติย่อที่หลากหลายของโครงการ แต่จริงๆแล้วฉันแค่สนุกกับการพัฒนาสิ่งหมากรุกมากขึ้น
Andrew Latham

ขณะนี้โดเมน lathamcity.com มีไว้สำหรับขาย ตอนนี้รหัสมีให้บริการในเว็บไซต์อื่นหรือไม่?
IkWeetHetOokNiet

14

ปัญหาเกี่ยวกับ "โปรแกรมหมากรุก" เป็นแนวคิดคือมีหลายชิ้นที่สามารถดูดซับเวลาและไม่จำเป็นต้องสนใจคุณในขณะนี้ คุณสามารถใช้เวลาหลายปีในการทำงานกับกราฟิกหรือการค้นหาอัลฟาเบต้าหรือการสร้างภาพข้อมูลเพื่อช่วยในการพัฒนาสำหรับเครื่องมือค้นหาหรือ ... ดีมีหลายชิ้น

ฉันขอแนะนำให้หาโปรแกรมหมากรุกโอเพ่นซอร์ส (ต้องมีจำนวนมาก) และตั้งค่าเกี่ยวกับการปรับปรุงส่วนต่าง ๆ ที่คุณสนใจมากที่สุด ในที่สุดคุณอาจแทนที่โปรแกรมทั้งหมดทีละฟังก์ชั่นหรือคุณอาจเรียนรู้เพียงพอและมีแรงจูงใจที่จะทิ้งมันและออกแบบโปรแกรมของคุณเองตั้งแต่เริ่มต้น ในกรณีใด ๆ ที่สำคัญคือการเริ่มต้น "แสง" และเรียนรู้เชือกก่อนที่จะพยายามสร้างโปรแกรมทั้งหมด


โดยสอดคล้องกับหนึ่งในโปรโตคอลอินเตอร์เฟซที่จัดตั้งขึ้นคุณสามารถใช้ส่วนหน้าใด ๆ ที่มีอยู่กับเครื่องยนต์ของคุณ

ฉันหวังว่าอัลฟาเบต้าไม่ต้องใช้เวลาหลายปีในการเขียน
เควิน

1
ไม่ใช่ปีที่จะเขียน แต่ต้องรอเป็นปี :)
ddyer

9

หากคุณคุ้นเคยกับกฎของหมากรุกจุดเริ่มต้นที่ดีเกี่ยวกับเทคนิคพื้นฐานคือhttp://www.frayn.net/beowulf/theory.html ชุดวัสดุและลิงก์ที่มีอยู่มากมายคุณสามารถค้นหาได้ที่นี่: http: // chessprogramming .wikispaces.com / และรายการที่สาม: เรียนรู้จากรหัสอื่น ๆ มีลักษณะที่แหล่งที่มาของที่เจ้าเล่ห์ มันเป็นเครื่องมือโอเพนซอร์ซชั้นนำ สิ่งที่สำคัญมากคือการคิดถึงกรณีทดสอบเพื่อดูว่าคุณทำการปรับปรุงหรือไม่: เริ่มต้นตัวอย่างเช่นตำแหน่งเกมจบง่าย ๆ ที่มีตัวเลข 3 หรือ 4 ตัว


3

ดังที่ได้กล่าวมาแล้วไม่มีอะไรที่ยากมากเกี่ยวกับการสร้างกลไกหมากรุก บางทีคุณควรจะสนใจว่าต้องการใช้และปรับใช้แอปพลิเคชันนี้อย่างไร (ซึ่งอาจเป็นตัวกำหนดภาษาที่คุณเลือก)

หากนี่เป็นเพียงการออกกำลังกายที่สนุกสนานคุณอาจต้องการรหัสใน Javascript และปรับใช้เป็นหน้าเว็บ หากคุณไม่ต้องการทำให้มันกลายเป็นเกมหมากรุกผู้เชี่ยวชาญอย่างน้อยคนอื่น ๆ จะสามารถเล่นกับมันและซอร์สโค้ดของมัน

หากคุณต้องการเรียนรู้เทคโนโลยีเฉพาะในเวลาเดียวกันพูด WPF นี่อาจเป็นวิธีที่ดีในการฆ่านกสองตัวด้วยหินก้อนเดียว MVVM อาจ overkill สำหรับแอพนี้ แต่คุณต้องเรียนรู้อย่างน้อย

หากคุณต้องการกำหนดเป้าหมายอุปกรณ์ Android ดังนั้น Java จะเป็นตัวเลือกที่ดี ในทำนองเดียวกัน Objective-C สำหรับอุปกรณ์ iOS

ตัวเลือกภาษาที่ยาวและสั้นไม่มีอยู่ในสุญญากาศ


3

ฉันถือว่าคุณรู้แล้วเกี่ยวกับแนวคิดของ 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 ++


2

ตามการแก้ไขของคุณคุณอยู่ในขั้นตอนของการกำหนดการเคลื่อนไหว 'ถูกกฎหมาย'

มีสองวิธีในการอธิบายการเคลื่อนไหวในหมากรุก สัญกรณ์เชิงพรรณนาและเครื่องหมายเชิงพีชคณิต สิ่งที่คุณอาจต้องการคือฟังก์ชั่นที่นำชิ้นส่วนตำแหน่งเริ่มต้นและตำแหน่งสิ้นสุดเป็นพารามิเตอร์ เช่น. Knight จาก QN1 ถึง QB2 ไม่ถูกต้อง แต่ Knight จาก QN1 ถึง Q2 นั้นถูกต้อง เมื่อคิดเกี่ยวกับมันแล้วสัญลักษณ์เกี่ยวกับพีชคณิตอาจง่ายขึ้นเนื่องจากความสามารถในการคำนวณการวางตำแหน่ง 'ญาติ' ได้อย่างง่ายดาย

เพื่อให้แน่ใจว่าคุณเขียนจำนวนเงินขั้นต่ำของรหัสที่จำเป็นผมเริ่มต้นด้วยการเขียนการทดสอบฟังก์ชั่นที่แรก หากคุณใช้สัญลักษณ์ทางพีชคณิตคุณอาจไม่จำเป็นต้องทดสอบต่อชิ้น / เริ่ม / สิ้นสุด รับการทดสอบแต่ละครั้งและทำซ้ำซ้ำก่อนที่จะไปยัง 'ย้าย' ครั้งต่อไป รหัสของคุณจะจบลงด้วยความสะอาดยิ่งขึ้น

เมื่อคุณครอบคลุมการเคลื่อนไหวที่ถูกกฎหมายและผิดกฎหมายอย่างเพียงพอสำหรับแต่ละชิ้นแล้วฉันจะเริ่มเพิ่มการตรวจสอบตัวแปรอื่น ๆ (เช่นการย้ายกษัตริย์เข้าสู่เงื่อนไข 'การตรวจสอบ' และ 'การแต่งงาน')

ฉันแนะนำqunitสำหรับการทดสอบหน่วยและดอกมะลิสำหรับการทดสอบพฤติกรรมใน JavaScript


1

จริง ๆ แล้วฉันได้เขียนโปรแกรมหมากรุก เตรียมตัวสำหรับทั้งการรักษาและฝันร้าย เมื่อเพื่อนของฉันและฉันทำมันมันเป็นการแข่งขันการเขียนโปรแกรมตามกำหนดเวลาและภาษาที่เราตัดสินใจจะไปคือจาวา ฉันรู้สึกว่า Java หรือ C เป็นตัวเลือกที่ดีที่สุดของคุณ แต่ฉันเห็นว่าคุณได้ตัดสินใจใช้ Javascript แล้ว ฉันไม่สามารถเคาะมันได้เพราะฉันไม่คุ้นเคย

ปัญหาหลักของที่นี่คือมีสถานการณ์การย้าย / ชนะจำนวนมากที่มีทุกสิ่งที่คุณจำเป็นต้องพิจารณาดังนั้นฉันขอแนะนำให้คุณเขียนสถานการณ์ที่เป็นไปได้เหล่านี้ทั้งหมดสำหรับแต่ละชิ้นก่อนที่คุณจะเริ่มเขียนโค้ดจริง เพียงแค่กระโดดเข้ามาโดยไม่ต้องวางแผนจะทำให้โครงการสนุก ๆ นี้กลายเป็นงานน่าเบื่อซ้ำซาก แต่นั่นคือสิ่งสำคัญจริงๆ เพียงวางแผนนอกรหัสก่อนและให้แน่ใจว่าคุณได้รับทุกสถานการณ์ในคราวเดียว

โชคดี


1

สำหรับการตัดสินใจของผู้เล่นคอมพิวเตอร์ส่วนหนึ่งของเกมฉันไม่สามารถแนะนำหนังสือ "ปัญญาประดิษฐ์: วิธีการที่ทันสมัย" ได้เพียงพอ (เว็บไซต์หนังสือhttp://aima.cs.berkeley.edu/ ) ขึ้นอยู่กับภูมิหลังของคุณในวิชาคณิตศาสตร์ (ทฤษฎีกราฟช่วย) มันอาจจะอยู่ในระดับสูงเล็กน้อย แต่มันถูกเขียนอย่างง่าย ๆ เพราะสิ่งทางวิชาการนี้สามารถและมันมีภาพรวมที่ทันสมัยมาก (และความลึก) ของเทคนิคต่างๆ ตัดสินใจเลือกโปรแกรมต่างๆ

มันจะชี้ให้เห็นสิ่งต่าง ๆ กับคุณเช่นการระบุเป้าหมาย (เช่นรุกฆาตหรือโมฆะ) การประเมินว่าสถานะใด (บอร์ดเลย์เอาต์) ใกล้กับเป้าหมายนั้นอย่างไรการสร้างสถานะต่าง ๆ ที่เป็นไปได้ต่อไปนี้เริ่มต้นจากสถานะปัจจุบัน วิธีการสำรวจพื้นที่ปัญหาอันยิ่งใหญ่คืออะไร

สิ่งหนึ่งที่อาจช่วยในการออกแบบอัลกอริทึม AI คือการหาวิธีตัดสินใจว่าจะเล่นแบบไหนต่อไปราวกับว่าคุณมีเวลาอยู่ทั่วโลกเริ่มจากสถานการณ์ที่ใกล้เคียงกับเกมที่ชนะ คุณปรับให้เหมาะสมเพื่อให้หาวิธีแก้ไขในระยะเวลาที่เหมาะสม (ชั่วโมง) จากนั้นหาวิธีเลือกเส้นทางที่ชนะแม้ว่าคุณจะยังไม่ได้สำรวจผลลัพธ์ทั้งหมด แต่คุณสามารถขัดขวาง "การคิด" เพื่อ มูลค่าของเวลา

จากนั้นฉันจะดูการเพิ่มประสิทธิภาพการแสดงเพื่อทำให้การคำนวณแต่ละรายการเร็วขึ้นเช่นการใช้จำนวนเต็มแบบยาวตามที่แนะนำ ไม่ว่าคุณจะทำการเปรียบเทียบได้รวดเร็วแค่ไหนหากวิธีการที่คุณสำรวจพื้นที่ปัญหานั้นไม่มีการแก้ปัญหาที่ดีมันจะต้องใช้เวลานานพอสมควร


0

คุณสามารถไปได้ทุกอย่างตามที่คุณต้องการ แต่สิ่งเหล่านี้เป็นความคิดของฉันในเรื่อง:

ฉันจะใช้ Java เพื่อให้คุณอยู่ในระดับสูงมากและมีห้องสมุดส่วนต่อประสานผู้ใช้ (AWT, Swing) ในการกำจัดโดยตรง คุณสามารถใช้วิธีการเชิงวัตถุเพื่อสร้างแบบจำลองกระดานหมากรุกและชิ้นส่วน วัตถุอื่น ๆ อาจเข้ามามีส่วนในประวัติความเคลื่อนไหวและการให้คะแนน แม้แต่ผู้เล่นก็อาจเป็นวัตถุและในอนาคตคุณอาจเพิ่มPlayerคลาสของคุณเพื่อจัดหาเครื่องเล่นคอมพิวเตอร์อัจฉริยะ

คุณอาจต้องการดูmodel-view-controller (MVC)เนื่องจากเป็นวิธีที่ดีมากในกรณีนี้เพื่อผูกวัตถุโมเดลของคุณ (โมเดลโดเมน) กับส่วนต่อประสานผู้ใช้ (มุมมอง) และอนุญาตให้ผู้ใช้จัดการกับ รุ่น (ผ่านตัวควบคุม)

คุณอาจต้องการใช้การพัฒนาที่ขับเคลื่อนด้วยการทดสอบซึ่งไม่เพียง แต่ทำให้มั่นใจว่าวิธีการทั้งหมดทำงานตามที่คุณคาดหวัง แต่ยังบังคับให้คุณเขียนโค้ดแบบแยกส่วนที่สามารถทดสอบได้


4
เอ็นจิ้นหมากรุกไม่มีส่วนเกี่ยวข้องกับ UI เพียง "ใจ" ซึ่งคำนวณการเคลื่อนไหวที่ดีที่สุด
CSE

@CSE - มันขึ้นอยู่กับความหมายของเครื่องยนต์
Daniel AA Pelsmaeker

@CSE - ในขณะที่ Adnan แก้ไขแสดงว่าเขากำลังมองหา UI อยู่ด้วย ดังนั้นคำตอบของฉันมีความเกี่ยวข้อง
Daniel AA Pelsmaeker

-8

กฎของหมากรุกนั้นค่อนข้างง่าย คุณเพียงแค่ต้องสามารถสร้างเมทริกซ์ (อาเรย์ 2 มิติ) สำหรับบอร์ดและหาวิธีเข้ารหัสแนวคิดของชิ้นส่วนกฎการเคลื่อนไหวสำหรับแต่ละชิ้นการตรวจสอบว่าการเคลื่อนไหวนั้นถูกกฎหมายและเงื่อนไขที่สัญญาณ จุดจบของเกม ไม่มีอะไรยากโดยเฉพาะเกี่ยวกับสิ่งนั้น คุณควรใช้ภาษาที่คุณคุ้นเคยมากที่สุด

ตอนนี้ถ้าคุณต้องการสร้าง AI เล่นหมากรุกที่จะรับบทเป็นหนึ่งในผู้เล่นนั่นคือสิ่งที่หากิน แต่อีกครั้งการเลือกภาษาไม่ใช่ปัญหาที่ใหญ่ที่สุดที่นี่ ทำความเข้าใจเกี่ยวกับหลักการ AI ที่เกี่ยวข้องคือ นั่นจะเป็นปัจจัยที่สำคัญกว่ามาก

(ต้องบอกว่าการตัดสินใจแบบนี้มีความเข้มข้นอย่างมากในการคำนวณและคุณอาจต้องการใช้สิ่งที่คอมไพล์ไปยังโค้ดเนทีฟแทนที่จะเป็นภาษาสคริปต์และ C ++ เป็นตัวเลือกที่แย่มากไม่ใช่เพราะมันไม่ดี - แก้ไขปัญหานี้ แต่เพียงเพราะเป็นภาษาที่แย่มากโดยทั่วไปและการพยายามนำสิ่งที่ซับซ้อนมาใช้เป็นวิธีที่ดีในการเขียนรหัสอาการปวดหัวทุกประเภทด้วยตัวคุณเอง)


15
ฉันคิดว่าคุณจะต้องเจาะจงมากขึ้นว่าทำไม C ++ ถึงไม่เหมาะกับภารกิจนี้เพื่อหลีกเลี่ยงการศักดิ์สิทธิ์ warz
Erik Reppen

9
-1 สำหรับความพยายามในการเริ่มสงครามศักดิ์สิทธิ์
Doc Brown

1
ทำไมคุณถึงคิดว่าภาษา C ++ เป็นภาษาที่แย่มาก ๆ ?
แอนโทนี่

ฉันคิดว่าคุณทำให้เขาผิด ฉันมีหนึ่งความคิดเห็นของเขา C ++ เป็นภาษาที่ดีที่จะเริ่มต้นด้วย แต่มันจะกลายเป็นความเจ็บปวดเมื่อคุณจัดการกับสิ่งที่ซับซ้อน!
Adnan Zahid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.