สมมติว่าคุณมี hexmap ของn
เซลล์ทั้งหมดและp
ผู้เล่นที่p <= n
วิธีที่ดีที่สุดในการจัดการกับปัญหานี้คือการกระจายแบบ round-robinผ่านทางเซลลูลาร์ออโตมาตา (CA)
initialisation
สุ่ม (และ / หรือใช้ฮิวริสติกบางส่วนหรืออื่น ๆ เช่นระยะทางจากศูนย์กลางแผนที่) เลือกเซลล์เริ่มต้นสำหรับผู้เล่นแต่ละคน ตั้งแต่p <= n
นี้ไม่ควรเป็นปัญหา
ออโตเซลลูล่าร์
คุณต้องการการเชื่อมต่อเต็มรูปแบบระหว่างเซลล์ฐานสิบหกของคุณ ฉันขอแนะนำอาร์เรย์ 6 เพื่อนบ้านต่อเซลล์:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
การใช้อาร์เรย์ขนาดคงที่ช่วยให้แนวคิดของทิศทางภูมิประเทศระหว่างเซลล์มีอยู่ซึ่งรายการหรือเวกเตอร์จะไม่ปรากฏขึ้น ฉันแนะนำสิ่งนี้เพราะมันอาจทำให้การนำทางบางอย่างง่ายขึ้น
นอกจากนี้คุณยังสามารถจัดเก็บ hexmap ของคุณในอาร์เรย์ 2D โดยมีออฟเซ็ตต่อแถว อย่างไรก็ตามวิธีนี้อาจใช้งานง่ายกว่าการจัดเก็บอาเรย์เพื่อนบ้านต่อเซลล์เพียงเล็กน้อยเนื่องจากการชดเชยทางเรขาคณิตในแถวอื่น ๆ
ตรวจสอบให้แน่ใจว่าทุกเซลล์เชื่อมต่อกับทุกสิ่งที่เป็นเพื่อนบ้าน คุณสามารถทำสิ่งนี้ทีละแถวแต่ละเซลล์ในขณะที่คุณสร้าง hexmap เต็ม ป.ล. ถ้าคุณต้องการ hexmap ที่ไม่มีขอบเขตคุณจะสามารถลบแต่ละเซลล์และอ้างอิงไปยังเซลล์เหล่านั้นเพื่อสร้างช่องว่างด้านลบเพื่อให้คุณสามารถสร้างเค้าร่างแผนที่อินทรีย์
การกระจายแบบวนรอบ
pseudocode:
count number of neutral cells in entire map, minus those starting cells taken by players
while neutral cells remain (or while true)
for each player
if player has not yet reached expected territory size in cells
for each cell already constituting this player's territory
if territory can grow by one cell into a neutral neighbour
grow into neighbour
reduce neutral cell count for entire map by one
if no more neutral cells remain in map
break out of outermost while loop immediately
else
continue to next player immediately
begin game
อัลกอรึทึมนี้จะให้โอกาสผู้เล่นแต่ละคนในการขยายอาณาเขตของตนด้วยวิธีหนึ่งในแบบโรบินรอบโดยที่อาณาเขตของผู้เล่นยังคงมีพื้นที่การเติบโตที่ถูกต้อง ถ้าผู้เล่นบางอย่างจะถูกบล็อกจากการเจริญเติบโตต่อไปอัลกอริทึมจะแม้นี้ยังคงเติบโตในดินแดนของผู้เล่นที่จะยังคงมีพื้นที่ปลูกที่ถูกต้อง คุณสามารถ จำกัด ผู้เล่นทุกคนให้อยู่ในจำนวนเซลล์เท่ากันทันทีที่มีผู้เล่นคนใดคนหนึ่งถึงขีด จำกัด แต่ก็น่าจะง่ายพอที่คุณจะเข้าใจได้ถ้าต้องการ
สิ่งนี้จะให้ "อาณาเขตบ้าน" ขนาดใหญ่ที่สุดสำหรับผู้เล่นแต่ละคน หากคุณต้องการให้มีพื้นที่ "เกาะ" นอกจากนี้เพื่อที่จะเติมโควต้าการนับเซลล์สำหรับผู้เล่นนั้นจากนั้นเมื่อผู้เล่นหมดพื้นที่ในท้องถิ่นที่จะเติบโตคุณสามารถเลือกเซลล์เริ่มต้นใหม่จากรายการเซลล์ที่เป็นกลางและ ดำเนินการตามกระบวนการ "การเติบโต" เดียวกันจากที่นั่น ด้วยวิธีนี้คุณจะจบลงด้วยชุดเกาะขนาดใหญ่ที่สอดคล้องกันสำหรับผู้เล่นแต่ละคนแทนที่จะเป็นเสียงแบบสุ่ม