เลือกไทล์ตามไทล์ที่อยู่ติดกัน


10

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

ใครช่วยแนะนำอัลกอริทึมสำหรับการทำเช่นนี้? เกมดังกล่าวใช้แผนที่เรียงต่อกัน 8 ทิศทาง


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

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

คำตอบ:


18

บางทีนี่อาจเป็นวิธีปกติ คุณมีรายการไพ่ที่แตกต่างกันซึ่งเป็นตัวแทนของกระเบื้องถนนในทิศทางที่เป็นไปได้ทั้งหมด จากซ้ายไปขวามุมทั้งสี่จากบนลงล่างไม่ว่าอะไรก็ตาม ตอนนี้คุณจะสร้างดัชนีไพ่เหล่านั้นด้วยไบต์ละ 8 บิตหนึ่งสำหรับแต่ละทิศทาง นี่อาจเป็น hashmap หรือโดยชื่อไฟล์ ... อย่างไรก็ตามคุณต้องการทำเช่นนี้

ดังนั้นคุณมีสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

รหัสไบต์สำหรับกระเบื้องดังกล่าวเป็น00000000 ไทล์ของคุณที่เรียงจากซ้ายไปขวา (หรือจากขวาไปซ้าย) จะเป็นดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

โค้ดไบต์สำหรับไทล์นั้นคือ1,0001000หรือ 136 อีกตัวอย่างลองดูที่จุดตัดสามทาง:

ป้อนคำอธิบายรูปภาพที่นี่

รหัสไบต์สำหรับกระเบื้องที่เป็น10101000

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

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

แก้ไข : อัปเดตรูปภาพให้มีความเส็งเคร็งน้อยลง ใช่เหล่านั้นดีกว่าก่อน


ดีมาก! ง่ายและมีประสิทธิภาพ สิ่งเดียวที่ฉันไม่เข้าใจคือวิธีที่คุณได้รับ bitmasks เหล่านั้น ตัวอย่างเช่นคุณจะได้รับ bitmask 17 จากหมายเลข 3 และ 7 อย่างไร
alekop

ไม่เป็นไรฉันเห็นว่าคุณกำลังทำอะไรอยู่ คุณกำลังตั้งค่าบิตที่ 3 และ 7 แต่คุณกำลังนับจากทางซ้ายแทนทางขวา
alekop

โอ้ว้าวน่าอายแค่ไหน ทำให้ความเป็นอมตะของฉันคึกคักขึ้น นั่นเป็นอุบัติเหตุฉันจะแก้ไขมัน!
MichaelHouse

เยี่ยมมากตอนนี้ความคิดเห็นของฉันไม่สมเหตุสมผล! : p ล้อเล่นนะขอบคุณสำหรับคำตอบของคุณ นั่นคือสิ่งที่ฉันกำลังมองหา
alekop

1
คำอธิบายที่ดี ฉันมีโพสต์บล็อกที่ครอบคลุมเทคนิคเดียวกันกับรหัสจริงและการแก้ไขไทล์ : kitsu.github.io/2016/07/18/roguelike-project-05
kitsu.eb

3

ฉันขอแนะนำให้คุณดูที่หน้าเว็บที่มีประโยชน์นี้สำหรับข้อมูลเพิ่มเติมเนื่องจากจะมีรายละเอียดที่ดีเกี่ยวกับทุกแง่มุมของสิ่งที่คุณทำรวมถึงการเพิ่มประสิทธิภาพที่เป็นไปได้: http://www.angryfishstudios.com / 2011/04 / ผจญภัยใน bitmasking /

tldr คือคุณค้นหาแต่ละเซลล์ที่อยู่ติดกันและจัดเก็บชุดค่าผสมในบิตฟิลด์ / ไบต์แล้วส่งผ่านแผนที่ที่แปลงตัวเลขจาก 0 ~ 255 เป็นค่าตั้งแต่ 0 ~ 47 ซึ่งสอดคล้องกับภาพที่ไม่ซ้ำกัน

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