Pacman: ตาจะหาทางกลับไปยังหลุมสัตว์ประหลาดได้อย่างไร


321

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

ในการดำเนินการของฉันฉันใช้งานโซลูชันที่เรียบง่าย แต่น่ากลัว ฉันเขียนรหัสอย่างหนักในทุก ๆ มุมซึ่งควรนำทิศทาง

มีวิธีใดที่ดีกว่าหรือดีที่สุด? อาจเป็นรุ่นทั่วไปที่ใช้กับการออกแบบระดับต่าง ๆ ได้หรือไม่


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

3
@ ทำเครื่องหมายขึ้นอยู่กับคำจำกัดความของคุณที่มุม หากเป็นการเชื่อมต่อแบบ T แม้ว่าคุณจะไปที่เส้นบนสุดก็ถือว่าใช้ได้
Thorbjørn Ravn Andersen

1
@ Thorbjørn: ฉันไม่ได้พูดถึงทางแยก ลองดูที่บอร์ดนี้: en.wikipedia.org/wiki/File:Pac-man.png หากผีเคลื่อนที่ไปทางขวาและวางตำแหน่งที่จุดที่สองจากด้านล่างซ้ายมันจะไม่เจอจุดตัดใด ๆ ชั่วขณะหนึ่ง นั่นจะทำให้มันเดินทางไปอีก 10 สแควร์สถ้ามันหันหลังไปทางซ้าย (ซ้าย) และเข้าสู่เส้นทางที่สั้นที่สุด
Mark Peters

6
โซลูชันของคุณใช้จุดอ้างอิง (หรือเศษขนมปัง) และฉันคิดว่านั่นเป็นเทคนิคที่ใช้กันทั่วไปเพื่อเร่งความเร็วในการค้นหาเส้นทางอัลกอริทึม
Nick Dandoulakis

1
ขอบคุณสำหรับคำตอบทั้งหมด! ฉันเพิ่งติดกับวิธีแก้ไขปัญหาก่อนหน้าของฉันและเข้ารหัสทิศทางทุกมุม หากต้องการทำแบบทั่วไปจำเป็นต้องมีไฟล์ leveldesigner / a level ที่กำหนดข้อมูลนี้ในการกำหนดระดับ
RoflcoptrException

คำตอบ:


152

ที่จริงแล้วฉันบอกว่าวิธีการของคุณเป็นวิธีที่ยอดเยี่ยมมากโดยมีค่าใช้จ่ายเกือบเป็นศูนย์เมื่อเทียบกับการค้นหาเส้นทางประเภทใด

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

แก้ไข (11 สิงหาคม 2010): ฉันเพิ่งถูกอ้างถึงหน้ารายละเอียดมากในระบบ Pacman: Pac-Man Dossierและเนื่องจากฉันมีคำตอบที่ยอมรับได้ที่นี่ฉันรู้สึกว่าฉันควรปรับปรุง บทความดูเหมือนจะไม่ครอบคลุมการกระทำของการกลับไปที่บ้านสัตว์ประหลาดอย่างชัดเจน แต่ระบุว่าเส้นทางโดยตรงใน Pac-Man เป็นกรณีดังต่อไปนี้:

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

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

3
ใช่หรือถ้ามีเครื่องมือสำหรับสร้างแผนที่เป็นส่วนหนึ่งของสิ่งนั้น
Kylotan

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

6
ขอบคุณ ฉันคิดว่าป่วยติดกับวิธีนี้ ไม่มีใครรู้ว่ามันทำใน Pacman ดั้งเดิมหรือไม่
RoflcoptrException

4
ไม่ฉันไม่ คำถามเดิมใช้คำนั้น แต่ก็ไม่ผูกพันตามกฎหมาย
Kylotan

85

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


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

1
เพื่อประหยัดพื้นที่ (สำหรับโลกที่มีขนาดใหญ่ขึ้นหรือระบบที่ จำกัด ) คุณสามารถบันทึกทิศทางการเดินทางได้ทุกสี่แยกแทนที่จะบันทึกค่าสำหรับทุกไทล์ นี่คือสิ่งที่ OP แนะนำ
BlueRaja - Danny Pflughoeft

BlueRaja: แน่นอน แต่มันซับซ้อนกว่าที่จะทำและผลลัพธ์ไม่เหมาะสม - ผีจะกินระหว่างทางแยกสองแห่งดังนั้นเขาอาจวิ่งไปในทิศทางที่ผิดไปชั่วระยะเวลาหนึ่ง โซลูชันของฉันทำงานได้ดีบนen.wikipedia.org/wiki/HP_200LXดังนั้นจึงมีข้อ จำกัด มากขึ้น
Erich Kitzmueller

5
(ฉันมาสาย ... ) ใช่การเติมน้ำท่วมเป็นสิ่งที่ดี แต่คุณไม่จำเป็นต้องใช้จำนวนเต็มเพียงแค่ทิศทาง (สองบิต) ในแต่ละตารางเพื่อชี้ไปที่สี่เหลี่ยมถัดไปเพื่อใช้
Matthieu M.

Matthieu: ใช่นั่นจะเป็นการเพิ่มประสิทธิภาพที่เป็นไปได้
Erich Kitzmueller

42

สำหรับทางเลือกให้กับขั้นตอนวิธี pathfinding แบบดั้งเดิมมากขึ้นคุณสามารถดูที่ (เหมาะสมชื่อ!) กรูปแบบ Pac-Man กลิ่น Antiobject

คุณสามารถกระจายกลิ่นสัตว์ประหลาดรอบหลุมเขาวงกตเมื่อเริ่มต้นและมีตาตามกลับบ้าน

เมื่อมีการตั้งค่ากลิ่นค่าใช้จ่ายรันไทม์ต่ำมาก


แก้ไข:น่าเศร้าที่บทความวิกิพีเดียถูกลบไปแล้วดังนั้นWayBack Machine เพื่อช่วยเหลือ ...


2
นี่จะเป็นคำตอบของฉัน มันเหมือนกับ ammoQ's เป็นหลัก แต่ฉันจำได้เสมอเกี่ยวกับ pacman
Luke Schafer

ดูเหมือนว่าบทความวิกิพีเดียนั้นตายแล้ว / ถูกลบไปแล้ว ผลการค้นหา google อันดับสูงสุดคือหัวข้อนี้ แต่ฉันคิดว่าสิ่งนี้ใกล้เข้ามา
David

2
ฉันสับสนสักครู่ แต่ก็เข้าใจได้ทันทีว่า "กลิ่น" หมายความว่าอะไร มันเป็นวิธีที่ยอดเยี่ยมในการอธิบายสิ่งต่าง ๆ ในสนามสเกลาร์!
Steven Lu


18

โซลูชันที่เรียบง่ายใด ๆ ที่ทำงานได้คือการบำรุงรักษาเชื่อถือได้และทำงานได้ดีพอเป็นทางออกที่ดี ฟังดูเหมือนว่าคุณจะพบทางออกที่ดี ...

โซลูชันการค้นหาเส้นทางมีแนวโน้มที่จะซับซ้อนกว่าโซลูชันปัจจุบันของคุณและดังนั้นจึงมีแนวโน้มที่จะต้องมีการดีบัก มันอาจจะช้ากว่าด้วย

IMO หากยังไม่พังอย่าแก้ไข

แก้ไข

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

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

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


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

เขาวงกตยังสามารถสร้างขึ้นได้ (ฉันมีอัลกอริทึมที่สร้าง pacman mazes ที่ดูดี) ดังนั้นบิตของระบบอัตโนมัติคือวิธีการที่จะไป
Erich Kitzmueller

"... หรือผู้ใช้สามารถออกแบบได้" ในกรณีนี้คุณมีพันล้านเขาวงกต
phuzion

@phuzion - ฉันรู้ว่า อย่างไรก็ตามมีความแตกต่างระหว่างทั้งสองกรณี หากเป็น OP ที่สร้าง bazzilion mazes แสดงว่าไม่สะดวกที่จะต้องสร้างเส้นทางด้วยมือ ถ้าเป็นผู้ใช้ ... หมายถึงว่า OP ต้องเขียนเอกสารให้ทำการแก้ไขปัญหาที่ไม่สิ้นสุดของเขาวงกตของผู้ใช้งาน, ทำการร้องเรียนอย่างไม่มีที่สิ้นสุดเกี่ยวกับความเป็นมิตรและอื่น ๆ ในคำอื่น ๆเหตุผลสำหรับการดำเนินการสร้างเส้นทางอัตโนมัติที่แตกต่างกัน
สตีเฟ่นซี

14

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

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


ฉันชอบวิธีนี้มากและฉันจะลองวิธีนี้
RoflcoptrException

5
สิ่งนี้ไม่ถูกต้อง หากพวกเขาทั้งหมดตามอัลกอริทึมนี้พวกเขาจะท้ายไล่เขาไฟล์เดียว พฤติกรรมของผีแต่ละตัวนั้นแตกต่างกัน คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่บทความ Wikipedia
ตัวแบ่ง

5

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


ใช่ฉันมีตรรกะที่จะไล่ล่า Pacman ดำเนินการแล้ว แต่ฉันก็ไม่พอใจกับมัน;)
RoflcoptrException

จากประสบการณ์ของฉัน (ฉันชอบเขียน pacman เพื่อความสนุก) การทำเช่นนั้นอาจทำให้ดวงตาติดอยู่นอกรูเป็นเวลานาน นั่นเป็นเพราะอัลกอริทึมการไล่ตามเส้นทางของ "ถ้า Pacman อยู่ทางเหนือไปทางเหนือ" แต่เขาวงกตอาจมี "กับดัก" ซึ่งดวงตาจะต้องไปทางใต้ก่อน ผีจะหนีไม่ช้าก็เร็ว แต่หลุมนั้นเป็นเป้าหมายที่แน่นอน (หมายเหตุ: ฉันกำลังพูดถึงเขาวงกตที่สร้างขึ้น)
Erich Kitzmueller

3

มันเป็นปัญหาที่ทำให้เข้าใจผิด สำหรับขั้นตอนวิธีการที่นิยมดูhttp://wiki.gamedev.net/index.php/A*


3

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

ค่าจะถูกคำนวณล่วงหน้าโดยใช้อัลกอริทึมที่มีอยู่


ฉันจะแนะนำสิ่งนี้ การเติมน้ำท่วมด้านนอกเริ่มต้นที่ 'monster-hole' ฉันคิดว่าคำตอบของคุณจะได้รับประโยชน์จากรูปภาพ
AjahnCharles

3

นี่คือแหล่งที่ดีที่สุดที่ฉันสามารถหาได้ว่ามันใช้งานได้จริงอย่างไร

http://gameai.com/wiki/index.php?title=Pac-Man#Respawn เมื่อผีถูกฆ่าตายดวงตาที่ถูกปลดออกของพวกเขาจะกลับสู่ตำแหน่งเริ่มต้น สิ่งนี้ทำได้โดยการตั้งค่าไทล์เป้าหมายของผีไปยังตำแหน่งนั้น การนำทางใช้กฎเดียวกัน

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

หมายเหตุด้านข้าง: ฉันไม่ได้ตระหนักว่าโปรแกรมเมอร์ pac-man ยอดเยี่ยมเพียงใดพวกเขาสร้างระบบข้อความทั้งหมดในพื้นที่ขนาดเล็กมากพร้อมหน่วยความจำที่ จำกัด มาก ... นั่นน่าทึ่งมาก


2

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


2
เพื่อเพิ่มความสมจริงยิ่งขึ้นอนุญาตให้ผีตัวเองสามารถเคลื่อนผ่านกำแพง: D
Thomas Eding

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

1
+1 สำหรับ "ผีลำดับที่สอง" - โอ้ใช่อนุพันธ์ของผีจะต้องอยู่เหนือวัตถุอันดับแรกอย่างผนัง ... :)
อัสซาด Ebrahim

2

นี่คืออนาล็อกและรหัสเทียมสำหรับแนวคิดการเติมน้ำท่วมของ ammoQ

queue q
enqueue q, ghost_origin
set visited

while q has squares
   p <= dequeue q
   for each square s adjacent to p
      if ( s not in visited ) then
         add s to visited
         s.returndirection <= direction from s to p
         enqueue q, s
      end if
   next
 next

แนวคิดก็คือมันเป็นการค้นหาแบบกว้างดังนั้นทุกครั้งที่คุณพบกับสี่เหลี่ยมจัตุรัสใหม่ที่อยู่ติดกันเส้นทางที่ดีที่สุดคือผ่าน p ฉันเชื่อ (O)


2

ฉันไม่รู้มากเกี่ยวกับวิธีที่คุณใช้เกม แต่คุณสามารถทำสิ่งต่อไปนี้:

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

บาง pseudocode:

   x = getRelativeOppositeLatitudinalCoord()
   y
   origX = x
    while(eyesNotInPen())
       x = getRelativeOppositeLatitudinalCoordofGate()
       y = getRelativeOppositeLongitudinalCoordofGate()
       if (getRelativeOppositeLatitudinalCoordofGate() == 0 && move(y) == false/*assume zero is neither left or right of the the gate and false means wall is in the way */)
            while (move(y) == false)
                 move(origX)
                 x = getRelativeOppositeLatitudinalCoordofGate()
        else if (move(x) == false) {
            move(y)
    endWhile

2

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

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

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


2

คำตอบสั้น ๆ ไม่ค่อยดี :) หากคุณดัดแปลงเขาวงกต Pac-man ดวงตาไม่จำเป็นต้องกลับมา แฮ็กบางตัวที่ลอยอยู่รอบ ๆ มีปัญหานั้น ดังนั้นมันขึ้นอยู่กับการมีเขาวงกตที่ให้ความร่วมมือ


2

ฉันขอเสนอว่าผีเก็บเส้นทางที่เขานำมาจากหลุมไปยัง Pacman ดังนั้นทันทีที่ผีตายเขาสามารถทำตามเส้นทางที่เก็บไว้นี้ในทิศทางตรงกันข้าม


2
เส้นทางนั้นน่าจะนานเกินไป
Ahmad Y. Saleh

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

1

รู้ว่าเส้นทาง pacman นั้นไม่ใช่แบบสุ่ม (เช่นแต่ละระดับที่เฉพาะเจาะจง 0-255, inky, blinky, pinky และ clyde จะทำงานในเส้นทางเดียวกันสำหรับระดับนั้น)

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


1

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


1
  1. ก่อนที่เกมจะเริ่มบันทึกโหนด (จุดตัด) ในแผนที่
  2. เมื่อมอนสเตอร์ตายจะจับจุด (พิกัด) และค้นหาโหนดที่ใกล้ที่สุดในรายการโหนดของคุณ
  3. คำนวณเส้นทางทั้งหมดที่เริ่มต้นจากโหนดนั้นไปยังรู
  4. ใช้เส้นทางที่สั้นที่สุดตามความยาว
  5. เพิ่มความยาวของช่องว่างระหว่างจุดและโหนดที่ใกล้ที่สุด
  6. วาดและเคลื่อนที่บนเส้นทาง

สนุก!


1

วิธีการของฉันมีความจำน้อยมาก (จากมุมมองของยุค Pacman) แต่คุณต้องคำนวณเพียงครั้งเดียวและใช้งานได้กับการออกแบบทุกระดับ (รวมถึงการกระโดด)

ปมฉลากครั้งเดียว

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

ฉันสมมติว่าคุณมีวัตถุที่เป็นตัวแทนของแต่ละโหนดและการเชื่อมต่อกับเพื่อนบ้านของพวกเขา โค้ดหลอกอาจมีลักษณะเช่นนี้:

public void fillMap(List<Node> nodes) { // call passing lairNodes
    int i = 0;

    while(nodes.count > 0) {
        // Label with distance from lair
        nodes.labelAll(i++);

        // Find connected unlabelled nodes
        nodes = nodes
            .flatMap(n -> n.neighbours)
            .filter(!n.isDistanceAssigned());
    }
}

เติมน้ำท่วมจากที่ซ่อน

ตาย้ายไปยังเพื่อนบ้านด้วยฉลากระยะทางที่ต่ำที่สุด

เมื่อโหนดทั้งหมดติดป้ายกำกับการกำหนดเส้นทางตาเป็นเรื่องเล็กน้อย ... เพียงแค่เลือกโหนดใกล้เคียงที่มีป้ายกำกับระยะทางที่ต่ำที่สุด (หมายเหตุ: หากมีหลายโหนดที่มีระยะทางเท่ากัน รหัสหลอก:

public Node moveEyes(final Node current) {
    return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}

ตัวอย่างที่ติดฉลากอย่างสมบูรณ์

ทำแผนที่ให้สมบูรณ์


0

สำหรับเกม PacMan ของฉันฉันได้สร้างshortest multiple path homeอัลกอริทึมขึ้นมาซึ่งทำงานได้กับสิ่งที่เขาวงกตที่ฉันมีให้ (ภายในกฎของฉัน) มันยังทำงานข้ามอุโมงค์

เมื่อโหลดระดับทั้งหมดpath home data in every crossroadจะว่างเปล่า (ค่าเริ่มต้น) และเมื่อผีเริ่มสำรวจเขาวงกตพวกเขาcrossroad path home informationจะได้รับการอัปเดตทุกครั้งที่เจอทางแยก "ใหม่" หรือจากเส้นทางที่แตกต่างกันเมื่อเจอทางแยกที่รู้จักกันใหม่


-2

pac-man ดั้งเดิมไม่ได้ใช้การค้นหาเส้นทางหรือ AI ที่หรูหรา มันทำให้ผู้เล่นเกมเชื่อว่ามีความลึกมากกว่าที่เป็นจริง แต่ในความเป็นจริงมันเป็นการสุ่ม ตามที่ระบุไว้ในปัญญาประดิษฐ์สำหรับเกม / Ian Millington, John Funge

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


ใช่มันใช้ AI บางอย่าง และใช่ Blinky ติดตาม pacman เมื่อเขาอยู่ในโหมดการไล่ล่า (เปลี่ยนเป็นครั้งคราว) ดังนั้นมันจึงเป็น AI ที่ถูกต้อง
Jean-François Fabre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.