โอ้ฉันรักเกมเหล่านี้!
ดังนั้นสิ่งแรกก่อนเพื่อให้คอมพิวเตอร์สามารถเล่นเกมได้จำเป็น:
- โครงสร้างที่จะทำงานกับ
- กฎที่จะเล่นโดย
- เงื่อนไขการชนะในการทำงาน
เรามาจัดการเรื่องนี้ทีละชิ้น
โครงสร้าง
เนื่องจากบอร์ดเป็นตารางขนาด 8x8 (แต่สามารถขยายได้อย่างง่ายดาย) และแต่ละพื้นที่ตารางอาจมีอยู่ในหนึ่งในห้ารัฐเท่านั้นดังนั้นให้นิยามสถานะเหล่านั้น:
[EMPTY, WHITE_PIECE, BLACK_PIECE, WHITE_PIECE_PROMOTED, BLACK_PIECE_PROMOTED]
ENUM จะ:
[0, 1, 2, 3, 4]
ตอนนี้เรารู้ว่าแต่ละพื้นที่สามารถเป็นอะไรเราต้องการวิธีที่จะเป็นตัวแทนของช่องว่างทั้งหมดหรือคณะกรรมการถ้าคุณจะ เกือบทุกภาษาที่แข็งแกร่งจะสนับสนุนอาเรย์หลายมิติ (อาเรย์ที่แต่ละองค์ประกอบเป็นข้อมูลการเก็บอาเรย์) ดังนั้นให้หย่อนรหัสต่อไปนี้เพื่อกำหนดอาเรย์ของเรา:
BOARD_ARRAY = array(8, 8)
สิ่งนี้จะทำให้เรามีอาร์เรย์ 8 x 8 ที่เราสามารถเก็บจำนวนเต็ม (enums ของเราจากก่อน):
(
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
)
ตอนนี้คุณสามารถเห็นได้แล้วว่าสิ่งนี้เริ่มมีลักษณะเหมือนกระดาน! ฉันไม่เคยเล่นตัวแปรที่กล่าวถึงในวิดีโอ youtube แต่ดูเหมือนว่าจะเริ่มต้นด้วยชิ้นส่วนสีขาว 2 แถวหนึ่งแถวจากด้านล่างและแถวสีดำ 2 แถวหนึ่งแถวจากด้านบน ซึ่งหมายความว่าเมื่อเราเริ่มเกมอาเรย์ของเราควรมีลักษณะเช่นนี้:
(
[0, 0, 0, 0, 0, 0, 0, 0],
[2, 2, 2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2, 2, 2],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
)
(โปรดจำไว้ว่า 2 หมายถึง 'BLACK_PIECE' และ 1 หมายถึง 'WHITE_PIECE')
ดังนั้นตอนนี้คอมพิวเตอร์มีโครงสร้างที่จะทำงานกับ ขั้นตอนที่ 1 เสร็จสมบูรณ์!
กฎระเบียบ
ลองจินตนาการว่าคุณมีบอร์ดจริงตั้งอยู่ต่อหน้าคุณเล่นกับผู้เล่นหลัก หากคุณพยายามที่จะย้ายหนึ่งในชิ้นส่วนของเขาคุณจะได้มือตบ หากคุณพยายามที่จะย้ายชิ้นส่วนในแบบที่คุณทำไม่ได้คุณจะได้มือตบ หากคุณพยายามที่จะโกงดี ... คุณได้รับความคิด แต่ปัญหาคือคอมพิวเตอร์ทำไม่ได้ ดังนั้นจึงเป็นหน้าที่ของเราที่จะต้องมีกฎระเบียบที่เข้มงวดในการเล่นภายใน
เราจำเป็นต้องสร้างวิธีการตรวจสอบว่าการเคลื่อนไหวใด ๆ ที่ได้รับเป็น 'ถูกกฎหมาย' ซึ่งหมายความว่าเราต้องมีวิธีในการแสดง 'ย้าย' ก่อน วิธีหนึ่งคือใช้ตำแหน่งอาเรย์ ตัวอย่างเช่นการย้ายชิ้นส่วนจาก [0, 0] ถึง [0, 1] เราสามารถสร้างฟังก์ชั่นที่จะอัปเดตบอร์ดที่ให้การย้ายนั้น ดังนั้นกลับไปหย่อน:
MY_MOVE = array( [0, 0], [0, 1] )
ด้านบนแสดงถึงหนึ่งชิ้นส่วนเลื่อนลงหนึ่งช่องว่างจากมุมด้านบนของกระดาน (สมมติว่า 0, 0 คือมุมซ้ายบน) คุณอาจสังเกตว่าฉันเลือกใช้อาร์เรย์หลายมิติสำหรับการย้าย นี่เป็นเพราะชิ้นส่วนในทางทฤษฎีอาจเคลื่อนที่เป็นจำนวนมากในคราวเดียว (สำหรับชิ้นส่วน 'กระโดด') งั้นลองทำเป็นที่ 0 1 มีชิ้นส่วนฝ่ายตรงข้ามซึ่งหมายความว่าเราจะลงจอดที่ 0, 2:
MY_MOVE = array( [0, 0], [0, 2] )
ค่อนข้างง่ายใช่มั้ย โปรแกรมควรเข้าใจว่าถ้าเราข้ามช่องว่างเรากำลังกระโดดชิ้นอื่น (หรือมิฉะนั้นเป็นการย้ายที่ผิดกฎหมายและควรโยนข้อผิดพลาด) ตอนนี้ให้กระโดดสองชิ้น:
MY_MOVE = array ( [0, 0], [0, 2], [0, 4] )
สิ่งนี้ทำให้เราสามารถอธิบายการเคลื่อนไหวใด ๆ บนกระดาน เย้! ตอนนี้เนื่องจากฉันไม่เข้าใจกฎของเกมที่เป็นปัญหาอย่างสมบูรณ์ (แม้ว่าฉันเคยเล่นหมากฮอสของแคนาดาในสมัยของฉัน) กฎหมายการย้ายที่แน่นอนนั้นจะต้องถูกกำหนดโดยคุณ กระแสที่ดีจนถึงจุดนี้จะมีลักษณะดังนี้:
FUNCTION_FIND_ALL_LEGAL_MOVES( MY_BOARD ) Returns: array ALL_LEGAL_MOVES
FUNCTION_FIND_BEST_MOVE( MY_BOARD, ALL_LEGAL_MOVES ) Returns: array MY_MOVE
FUNCTION_DO_MOVE( MY_BOARD, MY_MOVE ) Throws: error ILLEGAL_MOVE Updates: MY_BOARD
repeat from start for each turn
ข้างต้นจะถือว่าคุณสามารถวนรอบแต่ละชิ้นเพื่อค้นหาการเคลื่อนไหวทางกฎหมายทั้งหมดจากนั้นรับชุดการเคลื่อนไหวตามกฎหมายทั้งหมดเลือกอย่างใดอย่างหนึ่งที่ดีที่สุด (กลยุทธ์ที่นี่) การย้ายนั้นจะถูกนำไปใช้กับกระดานหรือเกิดข้อผิดพลาด จากนั้นผู้เล่นคนต่อไปก็จะเลี้ยว ดังนั้นเราจึงมี AI ที่รู้วิธีเล่น! จอย! กำลังเดินทางไป.
การชนะ
เกมง่ายๆนั้นยอดเยี่ยมเนื่องจากการชนะถูกกำหนดโดยสถานะที่ง่ายมาก ไม่มีชิ้นส่วนสีขาวบนกระดานใช่ไหม? ฉันเดาว่าคุณชนะแล้ว! สิ่งนี้ถูกนำไปใช้ในขั้นตอนที่ 2 เมื่อเราเลือกการเคลื่อนไหวที่ดีที่สุดเพื่อพาเราเข้าใกล้เงื่อนไขการชนะ
ในการสร้าง AI ที่ชาญฉลาดมากคุณสามารถเก็บฐานข้อมูลที่เก็บบอร์ดทุกอันที่เป็นไปได้ด้วยการย้ายที่เป็นไปได้จากทุกสถานะที่เป็นไปได้เพื่อค้นหาโซ่สู่การชนะ
คุณสามารถสร้างกลยุทธ์เช่น: หากมีชิ้นส่วนที่จะถูกกระโดดให้บันทึกชิ้นนั้นหรือถ้าชิ้นหนึ่งสามารถกระโดดได้มากกว่าหนึ่งชิ้นส่วนจะทำการกระโดดนั้น
นั่นควรให้จุดกระโดดที่ดีแก่คุณมันเป็นเพียงหนึ่งในวิธีที่เป็นไปได้อย่างไม่ จำกัด อย่างแท้จริง ในทางทฤษฎีคุณสามารถสร้างหุ่นยนต์ยักษ์เพื่อวาดด้วยดินสอสีแล้วทำการวิเคราะห์สเปกตรัมในการวาดเพื่อเลือกการเคลื่อนไหว ... แต่มันก็ไม่ได้ผลดีหรือเร็ว วิธีนี้ได้ผลในอดีตและทำงานได้ดี (: หวังว่าจะช่วยได้!
คำไม่กี่คำเกี่ยวกับการใช้งาน
ตัวตรวจสอบคือสิ่งที่เรียกว่าเกม 'ที่ถูกแก้ไข' ซึ่งเราสามารถคำนวณการเคลื่อนไหวทุกครั้งโดยไม่มีสิ่งแปลกปลอม แต่นั่นเป็นการเคลื่อนไหวทั้งหมด! ดังนั้นจึงไม่มีวิธีที่จะทำทุกอย่างด้วยตนเอง ... หากมีเพียงบาง ... โอ้ขวาเราเป็นโปรแกรมเมอร์ ปั๊มกำปั้น
SQL เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการจัดเก็บการเคลื่อนไหวที่ไม่มีที่สิ้นสุดเหล่านี้ทั้งหมด สำหรับผู้ที่ไม่มีประสบการณ์กับ SQL mySQL นั้นเป็นเซิร์ฟเวอร์ SQL แบบโอเพนซอร์สที่ใช้งานง่าย (ค่อนข้างง่าย) SQL ใช้สำหรับการจัดการฐานข้อมูล, sorta เหมือนสเปรดชีตบนเตียรอยด์ นอกจากนี้ยังสามารถเก็บข้อมูลจำนวนมากและทำงานกับมันได้อย่างรวดเร็ว
ดังนั้นเราจะใช้มันได้อย่างไร เนื่องจากเรารู้ว่าหากบอร์ดอยู่ในสภาพที่แน่นอน (แต่ละชิ้นในตำแหน่งที่แน่นอน) เราสามารถคำนวณการเคลื่อนไหวที่มีอยู่ทั้งหมดและบันทึกไว้ ตัวอย่างเช่น:
+Board State+ +All Possible Moves+ +Best Move+
([0,0,1,2,3],[3..) ([0,1],[0,2]), ([7,6],[7,7],[5..) ([7,6],[7,7])
([0,0,2,2,3],[3..) ([0,1],[0,2]), ([7,6],[7,7],[5..) ([5,5],[5,4])
([0,0,1,3,3],[3..) ([0,1],[0,2]), ([7,6],[7,7],[5..) ([4,4],[4,3])
etc...
ดังนั้นเมื่อคอมพิวเตอร์ต้องการย้ายมันก็จะค้นหาสถานะกระดาน (เก็บไว้เป็นคีย์หลัก) ในฐานข้อมูลและสามารถเลือกย้ายที่ดีที่สุด (ควรจะเอาชนะ) หรือหนึ่งในการย้ายอื่น ๆ เพื่อให้เป็นมิตรมากขึ้น AI.
เยี่ยมมากตอนนี้มาสร้างฐานข้อมูลนี้กัน ก่อนอื่นเราต้องคำนวณทุกสถานะกระดาน ซึ่งสามารถทำได้ด้วยห่วงใหญ่ที่น่ารังเกียจถ้าใครบางคนต้องการที่จะใช้เวลาและทำงานออกมามันจะยอดเยี่ยม ดูอาร์เรย์เป็นตัวเลขขนาดใหญ่หนึ่งตัวแล้วนับขึ้นไปยกเว้นในฐาน 5 (0, 1, 2, 3, 4) และเงื่อนไขว่าผู้เล่นแต่ละคนอาจมีเพียง 16 ชิ้น
ณ จุดนี้เราควรเก็บทุกสถานะกระดานและสามารถคำนวณการเคลื่อนไหวที่เป็นไปได้ทั้งหมด
เมื่อคำนวณการเคลื่อนไหวที่เป็นไปได้ทั้งหมดแล้วส่วนที่สนุกของการค้นหาเส้นทางการเคลื่อนที่ที่ดีที่สุดที่เป็นไปได้ นี่คือที่ความรู้ของฉันเริ่มสั้นและสิ่งต่าง ๆ เช่น Minimax หรือ A * เริ่มเข้ามาเล่น ขออภัยฉันไม่สามารถให้ความช่วยเหลือเพิ่มเติมได้ที่: /