ฉันกำลังสร้างการใช้งานMiniMaxอย่างง่ายในภาษาโปรแกรม Elixir เนื่องจากมีเกมความรู้ที่สมบูรณ์แบบมากมาย (tic toe, connect-four, หมากรุก, หมากรุกเป็นต้น) การใช้งานนี้อาจเป็นกรอบในการสร้างเกม AIs สำหรับเกมเหล่านี้
อย่างไรก็ตามปัญหาหนึ่งที่ฉันกำลังเผชิญคือวิธีการจัดเก็บสถานะของเกมอย่างถูกต้องในภาษาที่ใช้งานได้ เกมเหล่านี้ส่วนใหญ่เกี่ยวข้องกับกระดานเกมสองมิติซึ่งการดำเนินการดังต่อไปนี้เป็นประจำ:
- อ่านเนื้อหาของตำแหน่งบอร์ดเฉพาะ
- อัปเดตเนื้อหาของตำแหน่งกระดานเฉพาะ (เมื่อส่งคืนความเป็นไปได้ในการย้ายครั้งใหม่)
- พิจารณาเนื้อหาของสถานที่หนึ่งแห่งขึ้นไปที่เชื่อมต่อกับตำแหน่งปัจจุบัน (เช่นตำแหน่งแนวนอนแนวตั้งหรือแนวทแยงถัดไปหรือก่อนหน้า)
- พิจารณาเนื้อหาของสถานที่เชื่อมต่อหลายแห่งในทิศทางใด
- พิจารณาเนื้อหาของไฟล์ทั้งหมดจัดอันดับและเส้นทแยงมุม
- การหมุนหรือการมิเรอร์บอร์ด (เพื่อตรวจสอบความสมมาตรที่ให้ผลลัพธ์แบบเดียวกับที่คำนวณแล้ว)
ภาษาที่ใช้งานได้ส่วนใหญ่ใช้รายการที่เชื่อมโยงและ Tuples เป็นแบบเอกสารสำเร็จรูปพื้นฐานของโครงสร้างข้อมูลหลายองค์ประกอบ อย่างไรก็ตามสิ่งเหล่านี้ดูเหมือนจะทำให้งานแย่มาก:
- รายการที่เชื่อมโยงมีเวลาค้นหา O (n) (เชิงเส้น) นอกจากนี้เนื่องจากเราไม่สามารถ 'สแกนและอัปเดตบอร์ด' ในการกวาดบนกระดานเพียงครั้งเดียวการใช้รายการดูเหมือนจะไม่สามารถทำได้
- Tuplesมีเวลาค้นหา O (1) (คงที่) อย่างไรก็ตามการแสดงบอร์ดเป็น tuple ที่มีขนาดคงที่ทำให้ยากในการย้ำผ่านอันดับไฟล์ไฟล์ diagonals หรือสี่เหลี่ยมต่อเนื่องชนิดอื่น ๆ นอกจากนี้ทั้ง Elixir และ Haskell (ซึ่งเป็นภาษาที่ใช้งานได้สองภาษาที่ฉันรู้จัก) ไม่มีไวยากรณ์ในการอ่านองค์ประกอบที่nของ tuple สิ่งนี้จะทำให้เป็นไปไม่ได้ที่จะเขียนโซลูชันแบบไดนามิกที่สามารถใช้ได้กับบอร์ดที่มีขนาดตามอำเภอใจ
Elixir มีโครงสร้างข้อมูลแผนที่ในตัว (และ Haskell มีData.Map
) ที่ให้การเข้าถึงองค์ประกอบ O (log n) (ลอการิทึม) (ลอการิทึม) ตอนนี้ฉันใช้แผนที่พร้อมสิ่งx, y
อันดับที่เป็นตัวแทนของตำแหน่ง
สิ่งนี้ 'ใช้งานได้' แต่รู้สึกผิดที่ทำผิดกฎเกี่ยวกับแผนที่ด้วยวิธีนี้ถึงแม้ว่าฉันจะไม่รู้ว่าทำไม ฉันกำลังมองหาวิธีที่ดีกว่าในการจัดเก็บบอร์ดเกมสองมิติในภาษาโปรแกรมที่ใช้งานได้