อัลกอริทึมสำหรับการคำนวณเส้นทางกระสุนไปยังเป้าหมายที่มีค่าสูงสุด 2 แฉลบ


21

ขออภัยสำหรับชื่อที่ไม่ดี แต่ฉันไม่มีวิธีที่ดีกว่าในการเขียนวลี ...

ดังนั้นจึงมีเกมที่น่าตื่นตาตื่นใจนี้โดยนินเทน (ใช่!) บน Wii เรียก WiiPlay มี 9 minigames อยู่ในนั้นและหนึ่งในรายการโปรดของฉันเรียกว่าถัง! . มันเกี่ยวกับการทำลายรถถังศัตรู COM โดยไม่ทำลายตัวเอง นี่คือภาพหน้าจอของระดับ:

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

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

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

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

ฉันได้ข้อสรุปว่า 2 จุดที่กระสุนเด้งกระสุนอยู่เสมอด้านใดด้านหนึ่งของสี่เหลี่ยมด้านขนานหรือกลายเป็นจุดยอดตรงข้ามของรูปสี่เหลี่ยมด้านขนาน รถถังศัตรูที่ยิงและรถถังผู้เล่นที่มันเล็งไม่จำเป็นต้องเป็นจุดยอดอีก 2 จุด แต่แน่นอนว่ามันวางอยู่บนเส้น colinear ทั้งสองด้านของสี่เหลี่ยมด้านขนาน นี่คือภาพประกอบของ 4 วิธีที่เป็นไปได้ที่สามารถสร้างสี่เหลี่ยมด้านขนาน:

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

HOR-VERหมายถึงกระสุนนัดแรกชนผนังแนวนอนจากนั้นก็ชนกำแพงแนวตั้ง

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

นอกจากนี้ฉันไม่แน่ใจว่าการไหลทั่วไปของอัลกอริทึม อัลกอริทึมใช้โครงสร้างใด ๆ 2 ต่อไปนี้หรือฉันผิดทั้งสองอย่างนี้หรือไม่?

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

ในความคิดของฉันอัลกอริทึมนี้ยากที่จะคิดออกเพราะ:

  • กระสุนสามารถยิงได้ในทุกทิศทาง และ
  • มีหลายจุดบนผนังใด ๆ เช่นเดียวกับในคณิตศาสตร์ที่มีหลายจุดในบรรทัด

แต่คน Nintendo สร้างมันขึ้นมาดังนั้น ... ใครที่มีความคิด


เพื่อตรวจสอบคุณกำลังถามว่าจะทำสิ่งนี้ได้อย่างไรไม่ใช่ว่า Nintendo เลือกที่จะทำสิ่งนั้นจริง ๆ ใช่มั้ย
Ixrec

@lxrec คุณขวาสนใจเพียงในทางที่เป็นไปได้ที่จะทำมันไม่ได้เป็นวิธีที่พวกเขาทำมัน
สวัสดีทุกคน

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

2
ในขณะที่มีหลายมุม“ อนันต์” คุณสามารถลดระดับลงไปเป็นคลาสเทียบเท่า สายตาและแสงของ Nicky Caseเป็นตัวอย่างที่ยอดเยี่ยมของการแสดงเงาระหว่างรูปหลายเหลี่ยม - ซึ่งเป็นปัญหาของคุณอย่างแน่นอนยกเว้นว่าคุณกำลังใช้เส้นทางกระสุนมากกว่ารังสีแสงและรังสีของคุณอาจสะท้อนถึงสองครั้ง โปรดทราบว่าการสะท้อนนั้นไม่สำคัญกับ AI - การสะท้อนนั้นขยายแนวสายตาออกไป แต่สิ่งนี้หมายความว่าวัตถุเดียวกันอาจมองเห็นได้จากหลายมุม
amon

@Mandrill ฉันเกรงว่าคุณจะไม่ได้รับคำถามของฉัน ฉันถามว่ารถถังศัตรูสามารถกำหนดเส้นทางกระสุนที่กระทบรถถังผู้เล่นได้อย่างไร
สวัสดีทุกคน

คำตอบ:


9

เมื่อมองจากมุมมองโดยตรงจะเห็นได้ว่าปัญหานี้เป็นเรื่องเล็กน้อย อย่างไรก็ตามเรากำลังเผชิญกับการสะท้อน การค้นหาอย่างถูกต้องว่าส่วนใดของฉากสามารถมองเห็นได้ยากเมื่อนำการสะท้อนกลับมาใช้เป็นส่วนหนึ่งของเครื่องตรวจจับรังสีเนื่องจากอาจทำให้พลาดช่องว่างบางส่วน “ การค้นหาแบบไบนารี่” ระหว่างมุมที่มีแนวโน้มทั้งสองนั้นยังไม่สามารถใช้งานได้: เนื่องจากการสะท้อนพื้นที่ที่มองเห็นได้ไม่ต่อเนื่องดังนั้นฮิวริสติก“ ถ้าอยู่ทางด้านขวาของ A และทางด้านซ้ายของ B จะต้องมีเป้าหมาย การแก้ปัญหาระหว่าง A และ B” ไม่ได้รับอนุญาตและจะพลาดวิธีการแก้ปัญหา "สร้างสรรค์" ฉันขอแนะนำให้ใช้การสะท้อนโดยเรียกใช้ตัวติดตามจากตำแหน่งเสมือน - ตำแหน่งที่ดูเหมือนว่ารถถังยิงของเราจะปรากฏเมื่อมองในกระจก:

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

ข้อได้เปรียบคือตอนนี้เรย์ที่มิร์เรอร์เป็นเส้นตรงที่เกิดจากตำแหน่งเสมือน ฉันพยายามแสดงเทคนิคในภาพร่างต่อไปนี้:

ยิงรอบมุม

X หมายถึงตำแหน่งการยิง (X) เป้าหมาย พื้นที่สีสามารถมองเห็นได้

  1. สายตาตรง: ไม่สามารถมองเห็นเป้าหมายได้ อย่างไรก็ตามเราสามารถเข้าถึงพื้นผิว (1) และ (2)

  2. ภาพสะท้อนเดียว มีสองตำแหน่งการยิงเสมือนจริงภายในสิ่งกีดขวาง ตำแหน่งที่ต่ำกว่ามี LOS โดยตรงไปยังเป้าหมายดังนั้นเราจึงมีวิธีการแก้ปัญหาการยิงครั้งแรกของเรา: เส้นทางกระสุนเป็นส่วนหนึ่งของรังสีระหว่างเป้าหมายและพื้นผิวกระจกด้านล่างและระหว่างจุดปะทะระหว่างรังสีกับกระจกและตำแหน่งการยิงจริง

  3. การสะท้อนสองจุด: ตำแหน่งเสมือนส่วนบนจากการสะท้อนครั้งแรกสามารถมองเห็นส่วนหนึ่งของสิ่งกีดขวางที่ต่ำกว่าผ่านพื้นผิวกระจก เนื่องจากอนุญาตให้มีการสะท้อนสองครั้งเราจึงสามารถสะท้อนตำแหน่งนี้ให้เป็นอุปสรรคที่ต่ำกว่าได้ ตำแหน่งถูกทำเครื่องหมายเป็น (I) ตำแหน่งจริง (II) ตำแหน่งเสมือนจากภาพสะท้อนแรกและ (III) ตำแหน่งเสมือนจากภาพสะท้อนที่สอง

    จาก (III) เรามี LOS โดยตรงไปยังเป้าหมาย (X) ดังนั้นเราจึงพบวิธีการยิงแบบอื่น สัญลักษณ์แสดงหัวข้อย่อยจะเป็นไปตามเส้น X – III จนกระทั่งจุดชนกันของกระจกที่สองจากนั้นไปตามเส้น III – II ระหว่างจุดชนกระจกและในที่สุดก็เป็นไปตามเส้นที่ II - I จากจุดชนกระจกแรกไปยังตำแหน่งจริง I

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

เมื่อคุณสามารถทราบได้ว่าส่วนใดของอุปสรรคที่สามารถมองเห็นได้ (และสามารถใช้เพื่อแสดงสัญลักษณ์แสดงหัวข้อย่อย) การใช้การทำมิรเรอร์ผ่านการค้นหาเชิงลึกครั้งแรกจะดูเหมือนตรงไปตรงมา ในการค้นหาพื้นผิวกระจกที่เหมาะสมเทคนิคที่ใช้ในSight & Lightของ Nicky Caseอาจถูกนำมาใช้: แทนที่จะลองใช้เวกเตอร์ 360 เส้น - ซึ่งอาจพลาดช่องว่างและยังสิ้นเปลือง - เราปล่อยรังสีไปที่ขอบของสิ่งกีดขวางเท่านั้น


ฉันไม่เข้าใจว่า "การปล่อยรังสีให้กับสิ่งกีดขวางนั้นทำได้อย่างไร" คุณหมายถึงการเริ่มต้นยิงรังสีไปยังจุดสิ้นสุดของกำแพงและค่อยๆเข้าไปข้างในจนกว่าเราจะพบทางออก? ถ้าเป็นเช่นนั้นฉันเข้าใจว่าด้วยกฎนี้การแก้ปัญหาสามารถพบได้เร็วขึ้น
สวัสดีทุกคน

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

มันยอดเยี่ยมมาก! คำแนะนำเกี่ยวกับวิธีสร้างการแสดงระดับของคุณโดยมิเรอร์โดยไม่ต้องใช้ความต้องการในเกมมากเกินไป?
retrovius

7

เพียงแค่ขยายความคิดของ Karl Bielefeldt สำหรับการสะท้อนผนัง 2 ด้าน:ป้อนคำอธิบายรูปภาพที่นี่

ได้รับ A และ B (รถถัง) ก่อนอื่นคุณต้องแสดงรายการ Wall ทั้งหมดที่ A สามารถเห็นและรายการ Wall ทั้งหมด B ที่สามารถดูได้ จากนั้นคุณสร้างคู่ที่ผนังแรกอยู่ในรายการกำปั้นและผนังที่สองแตกต่างจากผนังแรกและอยู่ในรายการที่สอง คุณต้องทำการทดสอบนี้กับกำแพงที่เป็นไปได้ทั้งหมด (เว้นแต่คุณจะหาวิธีกำจัดผู้สมัคร) เมื่อคุณพบ R และ S สำหรับผนังคู่หนึ่งที่คุณระบุ

1) ถ้า A มีการมองเห็นโดยตรงของ R

2) ถ้า R เป็นของ wall1 (ผนังเป็นเพียงเซ็กเมนต์ไม่มีทั้งบรรทัด)

3) ถ้า R สามารถเข้าถึง S ได้โดยตรง

4) ถ้า S เป็นของ wall2 (ผนังเป็นเพียงเซ็กเมนต์ไม่มีทั้งบรรทัด)

5) ถ้า S สามารถเข้าใช้งาน B ได้โดยตรง

ในการค้นหา R และ S : เนื่องจากคุณรู้จัก wall1 คุณสามารถกำหนดสมการเส้นแทนเจนต์กับ wall1 เนื่องจาก R เป็นเส้นสัมผัสแทน wall 1 คุณจึงมีความสัมพันธ์ระหว่าง 2 พิกัดของ R (จบด้วยองศาอิสระหนึ่งสำหรับ R) ในทำนองเดียวกันกับ S (คุณมีความสัมพันธ์ระหว่างพิกัด S เนื่องจากจุดนี้เป็นของ tanget บรรทัดถึง wall2) ตอนนี้คุณมีอิสระ 2 องศาและคุณต้องมีสมการอิสระเพิ่มอีก 2 ตัวเพื่อหาคำตอบ หนึ่งสมการคือ:

(AA')/(RA')=(SS')/(RS')

สมการอื่น ๆ คือ:

(BB')/(SB')=(RR')/(SR')

โปรดสังเกตว่าในสมการข้างต้น A, A ', B, B' เป็นที่รู้หรือสามารถคำนวณได้โดยตรง R 'และ S' เป็นฟังก์ชันของพิกัดของ R และ S และสมการของผนัง ฉันยังเรียนคณิตศาสตร์ไม่จบดังนั้นฉันจึงไม่รู้ว่าสมการจะเป็นอย่างไร


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

3

คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่ามุมที่ออกจากแฉลบนั้นจะต้องเหมือนกับมุมที่ป้อนเข้าไป สำหรับผนังแนวนอนที่มีพิกัด y cและสองรถถังคงที่พร้อมพิกัด(a,b)และ(d,e)มีเพียงมุมเดียวที่ตอบสนองสมการด้านล่างได้

แผนภาพของสมการ

แค่แก้เพื่อxให้ได้ระยะทางตามกำแพงที่คุณต้องเล็ง สองกำแพงทำงานเหมือนกัน คุณมีสมการสองข้อและไม่ทราบสองอย่าง


1

คุณมีไดอะแกรมที่เรียบร้อยซึ่งแสดงวิธีกำหนดทิศทางรังสีดังนั้นฉันจะให้รายละเอียดเกี่ยวกับวิธีกำหนดพื้นผิวสะท้อนคู่

ขอเรียกพื้นผิวที่จะต้องตีพื้นผิวแรกและที่สอง, B

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

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

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

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

นี่คือภาพ:

มยูข

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


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

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

-3

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


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