ขั้นตอนการสร้างอาคารของพื้นที่เฉพาะ


15

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

มันค่อนข้างง่ายในการเขียนเครื่องกำเนิดสี่เหลี่ยมแบบสุ่มขั้นพื้นฐานเพื่อให้ตรงตามข้อกำหนดเหล่านี้ แต่เป้าหมายของเราคือโรงงานมีความซับซ้อนมากขึ้นอาจประกอบด้วย 2, 3, หรือ 4 สี่เหลี่ยมตัดกันเพื่อสร้างรูปร่างที่ซับซ้อนมากขึ้น (คิดว่า L อาคารรูปตัว U และ O)

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

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

ขอบคุณล่วงหน้า!

แก้ไข: เมื่อฉันพูดว่าเอาต์พุต "ดี" หรือ "ไม่ดี" เอาต์พุตที่ไม่ดีจะเป็นเอาต์พุตใด ๆ ที่มีพื้นที่ใช้งานไม่ได้โดยผู้เล่น รูปร่างของโรงงาน จำกัด ที่ผู้เล่นสามารถวางเครื่องจักรโรงงานเช่นสายพานลำเลียง ตามหลักการแล้วโรงงานไม่ควรมีพื้นที่ที่กว้างเพียง 1-2 บล็อกรูปร่างไม่ควรเป็นสี่เหลี่ยมขนาดใหญ่หนึ่งหรือสองรูปที่มีเส้น 1-2 บล็อก "ห้อย" ออกไปด้านหนึ่ง ผลผลิตที่ดีจะเป็นที่ที่พื้นที่ทั้งหมดนั้น "ใช้งานได้" ดังนั้นพื้นที่ทั้งหมดจะต้องกว้างอย่างน้อย 3-4 บล็อก ผลลัพธ์ที่ดีไม่จำเป็นต้องมีความซับซ้อนเสมอไป (1 หรือ 2 รูปสี่เหลี่ยมก็โอเค) แต่ก็ควรมีโอกาสพอสมควรหากมีรูปสี่เหลี่ยมมากกว่า 1-2 รูป

คำตอบ:


7

คุณสามารถใช้สร้างไว้ล่วงหน้าpolyominoesรูปร่างเมตาเพื่อสร้างการแบ่งประเภทของอาคาร

สมมุติว่าระยะทางต่ำสุดที่คุณยอมรับได้คือ 3 ช่วงตึก จากนั้นหน่วยการสร้างที่ยอมรับได้ที่เล็กที่สุดที่เราจะพิจารณาคือ 3x3 เพื่อความสะดวกฉันจะเรียกมันว่าเซลล์ & มันมีพื้นที่ 9 ช่วงตึก จากนั้นนำพื้นที่เริ่มต้นเป้าหมายของคุณมาหารด้วยพื้นที่เซลล์ ใช้ค่าเริ่มต้นที่คุณให้เราได้รับ 3.333; ดังนั้น 3 เซลล์จะให้คุณน้อยกว่าที่คุณต้องการ & 4 เซลล์จะให้คุณมากกว่านี้

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

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

เพื่อแสดงว่าเราเลือกที่จะปัดเศษลง นี่คือโพลีโม่ 3 ขนาดทั้งหมด (ไม่รวมการหมุน / การพลิก):

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

สมมติว่าเราสุ่มเลือกรูปร่าง L และใช้การหมุนแบบสุ่มอาคารของคุณจะมีเค้าโครงดังต่อไปนี้:

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

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

1) ใช้ขนาดเซลล์อื่น เช่น 3x4, 4x4 เป็นต้น

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

3) ตัดสิ่งปลูกสร้างออกเพื่อทำให้ใหญ่ขึ้น ย้อนกลับไปที่ตัวอย่างถ้าคุณใช้ 3 เซลล์อาคารของคุณจะมีพื้นที่ 27 สี่เหลี่ยมทำให้คุณสั้นโดย 3 จากนั้นคุณสามารถสแกนปริมณฑลเพื่อหาที่ตั้งเพื่อกาวกลุ่มสี่เหลี่ยมขนาด 1x3 ตราบใดที่กลุ่มการแต่งหน้าของคุณมีอย่างน้อย AxB โดยที่ A เป็นระยะทางขั้นต่ำที่ยอมรับได้อย่างน้อยที่สุดผลลัพธ์ของคุณจะไม่ละเมิดข้อ จำกัด ระยะทางขั้นต่ำที่ยอมรับได้ สร้างตัวอย่างข้างต้นต่อไปนี้เป็นภาพประกอบของผลลัพธ์ที่เป็นไปได้:

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

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

ความเห็นอื่น ๆ :

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


16

วิธีง่ายๆในการสร้างตัวกำเนิดโพรซีเดอร์คือ:

  1. สร้างสิ่งต่าง ๆ แบบสุ่ม
  2. เรียกใช้ฟังก์ชันที่ตรวจสอบว่าเอาต์พุตดีหรือไม่
  3. ถ้าผลลัพธ์ไม่ดีไปที่ขั้นตอนที่ 1

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

คุณได้ระบุมาตรการบางอย่างเกี่ยวกับว่าผลลัพธ์ดีหรือไม่ นั่นน่าจะเพียงพอสำหรับคุณในการสร้างเครื่องกำเนิดที่รวดเร็วและสกปรก วางสี่เหลี่ยมโดยการสุ่มภายในพื้นที่และปฏิเสธเอาต์พุตหากมีพื้นที่ที่กว้างเพียง 1-2 บล็อก

เริ่มต้นด้วยการปรับปรุงและเพิ่มประสิทธิภาพในภายหลัง


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

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

3
ตัวฉันเองฉันไม่ได้เป็นแฟนของวิธีการสร้างที่ปฏิเสธและลองใหม่ มันเร็วพอเมื่อเครื่องมือสร้างของคุณกำลังทำสิ่งหนึ่งที่เรียบง่าย แต่สำหรับระดับเกมเรามักจะเริ่มวางคุณลักษณะเพิ่มเติมและขั้นตอนการสร้างเพื่อสร้างแผนที่ที่สมบูรณ์ยิ่งขึ้น ณ จุดนั้นความน่าจะเป็นของการกดปุ่มแผนที่ที่มีชีวิตเป็นผลคูณของความน่าจะเป็นของแต่ละขั้นตอนที่ประสบความสำเร็จซึ่งสามารถหดตัวอย่างรวดเร็ว นี่ไม่ใช่แค่ความกังวลด้านวิชาการ - ฉันได้พูดคุยกับ devs ที่ต้องใช้ระบบแคชเมล็ดพันธุ์ที่ดี / ไม่ดีเพื่อหลีกเลี่ยงเวลาที่มากเกินไปเมื่อเครื่องกำเนิดสัญญาณ pass เดียวถูกต้องโดยการก่อสร้างจะง่ายขึ้น
DMGregory

@ DMGregory ใช่ฉันสามารถเห็นได้อย่างแน่นอน เครื่องกำเนิดไฟฟ้าแบบสุ่มขั้นพื้นฐานจะทำงานได้ 99% ในเวลาไม่กี่วินาทีสำหรับกรณีของฉัน แต่ถ้าฉันต้องการเพิ่มความซับซ้อนมากขึ้นในภายหลังมันอาจช้าลงอย่างมาก มีใครรู้บ้างเกี่ยวกับแอปพลิเคชั่นการเขียนโปรแกรม / เกมในชีวิตจริงของแบบจำลองการเดาและตรวจสอบ?
user2129189

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

7

ให้ข้อ จำกัด ของ "ทุกพื้นที่มีอย่างน้อย 3-4 บล็อกกว้าง" ความคิดแรกที่ leaps ในใจของฉันเป็นสิ่งที่ดังต่อไปนี้:

  1. เลือกหนึ่งใน 3x3, 3x4, 4x3 หรือ 4x4
  2. วางบล็อกขนาดนั้นไว้ที่กึ่งกลางของกริด
  3. เลือกทิศทาง (ขึ้น, ซ้าย, ขวา, ลง)
  4. พยายามวางบล็อก 3x3 ไว้ข้างบล็อกที่วางไว้ก่อนหน้าในทิศทางนั้น
  5. หากประสบความสำเร็จด้วยความน่าจะเป็นบางอย่างลองขยายบล็อกเป็นบล็อก 4x3 ในหนึ่งในเส้นทางที่คุณไม่ได้เลือก
  6. ด้วยความน่าจะเป็นให้ย้าย a ไปยังขอบสุ่มของบล็อกที่เติม
  7. ทำซ้ำขั้นตอนที่ 3 ถึง 6 จนกระทั่งพื้นที่มีขนาดใหญ่พอ

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


4
ฉันจะทำให้สิ่งต่าง ๆ ง่ายขึ้นโดยเริ่มต้นจากบล็อก 3x3 เสมอจากนั้นเพิ่มบล็อก 3x1 ในตำแหน่งสุ่มที่แต่ละตารางอยู่ติดกับบล็อกที่มีอยู่ เมื่อเพิ่มเข้าไปในบล็อก 3x3 จะมีสี่ตำแหน่งที่เป็นไปได้ ทั้งหมดให้บล็อก 3x4 โดยมีหกตำแหน่งที่เป็นไปได้สำหรับบล็อกถัดไป จากตรงนั้นมันซับซ้อนขึ้น แต่ก็ไม่เลว
JollyJoker

0

พิจารณาใช้บูลีนไม่และสหภาพและเลือกระหว่างพวกเขาแบบสุ่ม

  1. วางสี่เหลี่ยมแบบสุ่ม
  2. วางสี่เหลี่ยมสุ่มอันที่สอง
  3. สุ่มเลือกว่าจะรวมเป็น UNION หรือ SUBTRACT วินาทีจากครั้งแรก
  4. ทำซ้ำสำหรับสี่เหลี่ยมจำนวนหนึ่ง แม้ว่าจะมีเพียงสองหรือสามคนเท่านั้นที่สามารถให้ผลลัพธ์ที่สมเหตุสมผล

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


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