วิธีการใช้ศัตรูที่ชาญฉลาดในการยิงปืน?


13

ลองนึกภาพ shoot-em-up ง่ายๆสิ่งที่เราทุกคนรู้:

shoot-em-up 1

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

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

shoot-em-up ถ่วงน้ำหนัก

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

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

ดังนั้นนี่คือสิ่งที่ฉันกำลังมองหา:

ทำลายทั้งหมด shoot-em-up

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

ดังนั้นคุณจะแก้ไขปัญหานี้ได้อย่างไร ตรงกันข้ามกับเกมประเภทอื่น ๆ นี้ฉันต้องการมีศัตรูเพียงไม่กี่คน แต่มีทักษะ "มาก" แทนที่จะเป็นศัตรูที่โง่เง่า


2
คุณเคยลองใช้พฤติกรรมการขับขี่หรือไม่? มีสิ่งหนึ่งสำหรับการหลีกเลี่ยงสิ่งกีดขวางโดยเฉพาะ: red3d.com/cwr/steer/Obstacle.html
Tetrad

@ Tetrad ฉันคิดเกี่ยวกับพฤติกรรมการบังคับเลี้ยว .. เพราะพวกเขาสามารถเปลี่ยนได้อย่างดีเช่น "ลองยิงผู้เล่น" และเมื่ออันตรายเปลี่ยนไปข้างหน้าเป็น "หลบเลี่ยง" ฉันกลัวว่ารุ่น 1D (นั่นคือสิ่งที่ฉันจัดการอยู่) โดยทั่วไปการหลบเลี่ยงจะโง่เกินไปที่จะทำการตัดสินใจที่ดี ฉันอาจจะผิด
bummzack

คำตอบ:


8

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

การไล่ระดับสีควรรวม:

  • ความใกล้ชิด
  • ความเร็ว
  • ความกว้างของกระสุน
  • (ไม่บังคับ) ตำแหน่งของเป้าหมาย (ผู้เล่น)

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

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

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

IRL ฉันจะไม่รบกวนกระสุนปืนจนกว่ามันจะอยู่ในระยะที่ฉันรู้ว่าที่หลบความเร็วสูงสุดของฉันก็เริ่มยากที่จะหลีกเลี่ยง ประสบการณ์มือแรกจากการขว้างก้อนหินเป็นเด็กหนุ่ม สัญลักษณ์แสดงหัวข้อย่อยที่ x ระยะทางที่เดินทางด้วยความเร็ว y มีคะแนนอันตรายเช่นเดียวกับกระสุนที่ระยะทาง 2x เดินทางที่ 2y ดังนั้นสิ่งนี้จะต้องมีการแยกตัวประกอบอย่างถูกต้อง

วิธีปรับแต่งอัลกอริทึมสำหรับความยากลำบากของศัตรูรวมถึง

  • แนะนำเวลาแฝงในการอัพเดทกราฟ (เกิดช้าเกินไป)
  • แนะนำความไม่แน่นอนแบบสุ่มที่แปลเป็นภาษาท้องถิ่นลงในกราฟ
  • เพียงแค่ไม่ให้ศัตรูเชื่อฟังสิ่งที่กราฟบอกพวกเขาตลอดการอัพเดท (พูด 1 ถึง 10 เฟรม) เนื่องจากความเกียจคร้าน AI ที่แท้จริง

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


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

1
เฮ้ @bummzack มันเป็นเพื่อนร่วมความสุขนั่นเป็นตัวอย่างเล็ก ๆ น้อย ๆ ที่ยอดเยี่ยม! มุมมองของปัญหาเป็นเรื่องใหม่สำหรับฉันและดูน่าสนใจ - ฉันดีใจที่ได้เห็นมันใช้งานได้! ดีใจที่ได้ช่วยเหลือและขอบคุณสำหรับการแบ่งปัน
วิศวกร

7

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

    E    
B  B**B
  B***B  B
 B***B   B
B**B** B 
 B**B**BB
B*****B B
      P

E = ศัตรู
B = bullet
P = ผู้เล่น
* = ตัวเลือกเส้นทางไปยังด้านล่างของหน้าจอ

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

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


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

ไม่ควรแพงเกินไปอย่าลืมว่าคุณต้องคำนวณแถวล่างทุกรอบคุณไม่ต้องคำนวณใหม่ทั้งหมด
Qwerky

@bummzack Environment ไม่ได้ "เร็ว" อย่างน้อยก็ในแง่ของคอมพิวเตอร์ สำหรับนักพัฒนาเกมคุณควรเข้าใจว่าเกือบทุกเกมจะขึ้นอยู่กับขั้นตอนมันเป็นแค่ขนาดของขั้นตอนนั้น แต่ในแต่ละขั้นตอนสามารถทำการคำนวณได้ดังนั้นการแก้ไข Qwerky จึงเป็นสิ่งที่คุณต้องการ
Deele

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

2
นี้น่าจะเป็นที่เหมาะสมคำตอบ แต่ไม่ว่าเหตุผลหนึ่ง ในเวลาที่ศัตรูใช้ในการหาเส้นทางสนามจะมีกระสุนอีกชุดหนึ่งทำให้เส้นทางไม่สมบูรณ์ซึ่งหมายความว่าการคำนวณเส้นทางจะต้อง และการคำนวณใหม่เป็นสุนัขตัวเมีย ยิ่งกว่านั้นความคิดของคุณเกี่ยวกับ backpropagating จนถึงจุดที่ปลอดภัยทำให้ราคาแพงยิ่งขึ้น! @Nick Wiggill ฉันไม่คิดว่ามันเป็นการเพิ่มประสิทธิภาพก่อนวัยอันควรเพียงแค่การมองการณ์ไกลเพื่อให้แน่ใจว่าคุณจะไม่เตะตัวเองในเป้า
Ray Dey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.