พงษ์ AI ที่ไม่สมบูรณ์


19

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

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

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

ขอบคุณมาก.


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

4
ฉันจะเริ่มต้นด้วยการ จำกัด ความเร็วที่ AI สามารถย้ายไม้พายและ / หรือการสร้างในช่วงเวลาที่ล่าช้า (สั้น) แบบสุ่มก่อนที่ AI จะเริ่มตอบสนองต่อการโจมตี


4
@ byte56 ฉันจะไม่เรียกมันว่าเป็นคำถามของคำถามนั้น รู้สึกเหมือนตัวอย่างที่ให้ไว้ที่นี่blog.stackoverflow.com/2011/01/…ภายใต้ "หากคุณกำลังจะปิดคำถามของผู้ใช้ในฐานะที่ซ้ำกันมันจะต้องซ้ำกันจริง" คำถามนั้นเป็นทรัพยากรที่ดี (และบางคนอาจใช้คำถามนั้นเพื่อหาคำตอบให้กับเนื้อหาที่นั่น) แต่มันไม่ได้ตอบคำถามเฉพาะของคำถามนี้ฉันไม่คิด
Tetrad

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

คำตอบ:


20

พงษ์ AI ที่ไม่สมบูรณ์แบบที่ฉันโปรดปรานที่สุดนั้นเรียบง่ายอย่างไร้ความปราณี

ลูกบอลที่มองไม่เห็น AI

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

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

นี่เป็นสิ่งที่ดีกว่าการแทรกแบบแผนอย่างมีนัยสำคัญเนื่องจากมันทำให้ AI ดูค่อนข้างฉลาด คู่ต่อสู้ที่คู่ควร นอกจากนี้ยังช่วยให้ AI เล่นตามกฎที่แน่นอนเช่นเดียวกับมนุษย์ซึ่งดูดีกว่าสำหรับผู้เล่นและทำให้งานของคุณง่ายขึ้น

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


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

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

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

หากคุณต้องการความเที่ยงตรงที่มากขึ้นคุณสามารถคำนวณตำแหน่งลูกตามรอยได้สองครั้งต่อเฟรมและลดความเร็วลงครึ่งหนึ่งสำหรับการคำนวณแต่ละครั้ง
DDR

22

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


นี้. ไม่ช่วยให้ AI รู้ว่าลูกบอลจะตีที่ใดถ้ามันสามารถเคลื่อนที่ได้พูด 3px ต่อเฟรมและต้องเลื่อนจากด้านบนไปด้านล่าง
KeithS

14

เมื่อฉันสร้างโคลน pacman เกือบ - โอ้ - ยอดเยี่ยมใน TI83 ของฉัน เครื่องคิดเลขปัญหาที่ใหญ่ที่สุดที่ฉันพบคือ "ผี" เร็วเกินไป ฉันต้องชะลอพวกเขาลงอย่างใด ดังนั้นฉันจึงใส่บาปเก่าที่ยิ่งใหญ่ (cos (tan (พิกัด x)) ไว้ที่นั่น ระดับที่ง่ายขึ้นจะทำการคำนวณนั้นสองสามครั้งและระดับที่ยากขึ้นจะทำเพียงหนึ่งในการดำเนินการ

ประเด็นคือเวลาตอบสนอง วิจัยว่าเวลาตอบสนองของมนุษย์โดยทั่วไปคืออะไรและเพิ่ม 10ms ลงไป ใช้เป็นจุดเริ่มต้น เมื่อระดับยากขึ้นให้ลบเวลาออกจากเวลาตอบสนอง ... ซึ่งอาจเป็นเรื่องง่ายThread.sleep(time);สำหรับ AI รอสักครู่ก่อนที่ AI จะเริ่มเคลื่อนไหว

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


2
คุณสามารถอธิบายได้ว่าทำไมสิ่งที่คุณใช้sin(cos(tan(x)))?
nullpotent

5
สาเหตุที่ฉันยังเด็กโง่และบน TI83 บาป (cos (tan (x))) สร้างหน่วยความล่าช้าที่ดีใน AI นอกจากนี้เพื่อความรู้ของฉันที่ดีที่สุดเครื่องคิดเลขไม่มีคำสั่งรอที่สามารถใช้มิลลิวินาที บางทีความชัดเจนบางอย่าง: ฉันไม่ได้ใช้แอสเซมบลีหรือไมโครสคริปต์หรือภาษาใด ๆ ที่คุณสามารถคอมไพล์เพื่อทำงานกับสิ่งเหล่านั้น ฉันใช้รหัสการเขียนโปรแกรมในเฟิร์มแวร์ (ปุ่ม prgm) ฉันมีรหัสสูงสุด 8 บรรทัดบนหน้าจอในเวลาใดก็ตาม ฉันจำอะไรที่ซับซ้อนไม่ได้สำหรับช่วงเวลาล่าช้า
Russell Uhl

2
ฉันเรียนรู้ที่จะเขียนโปรแกรมเกี่ยวกับรหัสในเฟิร์มแวร์ของ TI83 จากนั้นฉันก็ต้องเรียนรู้การเขียนโปรแกรมเชิงโครงสร้างอีกครั้งใน C ++ ฉันจะบอกว่า TI83 สอนให้ฉันว่าสตริงสปาเก็ตตี้คืออะไรและทำไมมันถึงไม่ดี ฉันไม่ได้ใช้คำสั่ง goto ตั้งแต่นั้นมา เวลาที่ดีแม้ว่า
ContextSwitch

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

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

6

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

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

  • เมื่อผู้ใช้โดนลูกบอล
    • AI สามารถตอบสนองทันทีและไปที่ที่ลูกจะอยู่ ถ้ามันเร็วพอมันจะไปถึงที่นั่นทันเวลา
  • เมื่อลูกบอลข้ามกลางสนาม
    • AI ต้องรอจนกว่ามันจะข้ามกลางสนามก่อนที่จะตอบสนอง

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

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

สุดท้ายคุณสามารถเล่นกับขนาดของไม้พายได้เช่นกันเพื่อเพิ่ม / ลดความยากลำบาก


2

ปัจจัยหนึ่งที่ต้องพิจารณาคือการสุ่ม - ผู้เล่นมนุษย์มีการเปลี่ยนแปลงในการเล่นอยู่เสมอดังนั้นหากคุณต้องการให้ AI ของคุณดูเหมือนมนุษย์แล้วคุณจะต้องมีการเปลี่ยนแปลงบางอย่างในการเล่นของพวกเขา

คุณสามารถตั้งค่าช่วงสำหรับ:

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

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


2

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

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

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

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


1

นี่คือรายการของตัวเลือกไม่กี่ตัวเลือกซึ่งบางส่วนได้รับการกล่าวถึงแล้ว:

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

0

ฉันทำโป่งเล็ก ๆเหมือนกัน (ใน LUA)

AI ของฉันง่ายมาก แต่ก็ไม่ได้แย่ขนาดนั้นเลย

ฉันแค่ตรวจสอบตำแหน่ง y ของลูกบอลและถ้าต่ำกว่าฉันย้ายไม้พายลงถ้าสูงกว่าฉันจะขยับไม้พายขึ้น

จากนั้นเพื่อปรับความยากลำบากฉันจะเพิ่มหรือลดระยะห่างจากลูกบอลที่ไม้พายเริ่มเคลื่อนที่

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