การร่ายเวทย์ - วิธีเพิ่มประสิทธิภาพความเสียหายต่อวินาที


23

ลองนึกภาพเรามีพ่อมดที่รู้เวทย์บางอย่าง แต่ละคาถามี 3 คุณสมบัติ: ดาเมจ, เวลาเย็นลงและเวลาร่าย สิ่งที่มาตรฐาน RPG สวย

เวลาคูลดาวน์: ระยะเวลา (t) ที่ใช้ก่อนที่จะสามารถใช้คาถานั้นได้อีกครั้ง คาถาจะ "คูลดาวน์" ทันทีที่มันเริ่มร่าย

ระยะเวลาร่าย: ระยะเวลา (t) ที่ใช้ในการใช้คาถา ในขณะที่ตัวช่วยสร้างกำลังทำการร่ายคาถาอย่างอื่นไม่สามารถร่ายและไม่สามารถยกเลิกได้

คำถามคือคุณจะสร้างความเสียหายให้มากที่สุดด้วยคาถาต่าง ๆ ได้อย่างไร?

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

ตัวอย่างเช่น,

  1. Fireball: 3000 ดาเมจ, ระยะเวลาร่าย 3 วินาที, 6 วินาทีทำให้เย็นลง

  2. Frostbolt: 20 ดาเมจ, ระยะเวลาร่าย 4 วินาที, 4 วินาทีทำให้เย็นลง

  3. Fireblast: 3 ดาเมจ, ระยะเวลาร่าย 3 วินาที, 3 วินาทีทำให้เย็นลง

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

ในตัวอย่างต่อไปนี้เป็นกรณีของ "over casting" และ "Waiting" ข้อความแสดงแทน


ทำไมฉันต้องทำ 1-3-1 ในสถานการณ์นี้ ทำไมไม่ 1-2-1 ทำไมไม่ 1-2-3-1 ซึ่งมีประสิทธิภาพมากกว่า 1-3-1-X ถ้า 1-3-1 เพียงอย่างเดียวจะไม่ฆ่าเป้าหมาย

@Joe Wreschnig: ขอบคุณที่ชี้ให้เห็น เป็นความผิดพลาดในตัวอย่างของฉัน ทำให้ง่ายขึ้นเพียง 2 รายเท่านั้น
aaronfarr

1
โลภในการเลือก dps คาถาสูงสุดที่มีอยู่เมื่อใดก็ตามที่เป็นไปได้ ไม่สนใจตรรกะอื่น ๆ เช่น ที่รอ.
aaronfarr

1
เพียงเพื่อโคลนน้ำ พิจารณาคาถาที่สร้างความเสียหาย แต่ใช้เวลา 50 วินาทีในการร่าย มันคือ dps / dpct คือ∞ แต่ไม่ควรเลือกถ้าเป้าหมายสามารถสังหารด้วยวิธีการอื่นในเวลาน้อยกว่า 50 วินาที
deft_code

1
คุณควรเชื่อมโยงไปยัง dupe ที่math.stackexchange.com/questions/10414/…
Sparr

คำตอบ:


23

AI ทั้งหมดคือการค้นหา!

เมื่อคุณเข้าไปในความกล้าหาญของ AI มันน่าทึ่งว่ามันมีการค้นหามากน้อยเพียงใด

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

เสียบพารามิเตอร์เหล่านี้เข้ากับUniform Cost Search (UCS) และ presto รับประกันแผนการต่อสู้ที่ดี ยิ่งไปกว่านั้นถ้าคุณสามารถค้นหาฮิวริสติกค้นหาด้วยA *หรือ IDA * และคุณจะได้คำตอบเดียวกันเร็วกว่ามาก

ข้อได้เปรียบที่มากกว่าในการใช้ UCS คือสามารถค้นหาลำดับการส่งที่ดีที่สุดสำหรับสถานการณ์ที่ซับซ้อนกว่าที่คุณให้ไว้กับตัวแปรเพียง 3 ตัวเท่านั้น ด้านอื่น ๆ ที่สามารถเพิ่มได้อย่างง่ายดาย:

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

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


2

นี่เป็นปัญหาการเพิ่มประสิทธิภาพแบบ combinatorial โดยเฉพาะ เมื่อจำนวนคาถาเพิ่มขึ้นความยากในการค้นหาคาถารวมกัน / รูปแบบที่เหมาะสมจะเพิ่มขึ้นอย่างมีนัยสำคัญ ฮิวริสติกแบบเดียวกับที่ใช้สำหรับปัญหาเป้จะมีประโยชน์ในการแก้ปัญหานี้


1

คุณต้องคิดในแง่ของ 'ความเสียหายต่อหน่วยเวลาร่าย' (DPCT) - ตัวอย่างเช่นลูกไฟที่มีระยะเวลาร่าย 3 วินาทีและทำดาเมจ 3000 ดาเมจจะทำ 1,000 DPCT

ถ้าคุณต้องรอ 3 วินาทีก่อนที่จะทำการคูลดาวน์มันจะลดลงเป็น 500 DPCT (ดาเมจ 3000 ดาเมจ, หารด้วย 6 วินาทีรวมถึงการรอ)

ดังนั้นคุณต้องกำหนดค่าดาเมจต่อการร่ายของแต่ละเวทย์รวมถึงการรอคอยคูลดาวน์ที่เหลืออยู่ เลือกอันที่มี DPCT สูงสุดรอถ้าจำเป็นจากนั้นส่ง ทำซ้ำจนกว่าเจ้านายจะตาย :)


ปัญหาคือว่า DPCT สามารถทำให้เข้าใจผิดมาก ตัวอย่างเช่นเราเพิ่มคาถาเพิ่มอีก 2 ตัวใน Fireball: 3000 ดาเมจ, 3 วินาทีร่าย, คูลดาวน์ 6 วินาที, DPCT: 1000 คาถา # 2: 20 ดาเมจ, 4 ดาเมจ 4, 4 วินาทีคูลดาวน์, DPCT: 5 Spell # 3: 3 ดาเมจ, ร่าย 3 วินาที, คูลดาวน์ 3 วินาที, DPCT: 1 (โปรดจำไว้, คูลดาวน์เริ่มขึ้นทันทีที่ร่ายคาถา) แม้ว่าเวทย์มนตร์ # 3 มี DPCT ที่ต่ำกว่าก็จะส่งผลให้ DPS สูงขึ้น (1-3-1-3 .. .) กว่าคาถา # 2 (1-2-1-2 ... )
aaronfarr

1

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

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

โดยรวมแม้ว่า bluescrn กล่าวว่า DPCT (หรือ DPS ที่เรียกว่าในหลาย ๆ เกมที่ได้รับการปรับแต่งและพูดคุยโดยผู้เล่นที่กำลังมองหาส่วนผสมที่ดีที่สุด) เป็นองค์ประกอบหลักที่คุณจะต้องมีความสมดุลโดยเฉพาะอย่างยิ่งถ้าคุณมี สายวิจัย / ทักษะที่อนุญาตให้ผู้เล่นต่าง ๆ พัฒนาไปพร้อมกับทักษะที่แตกต่างกัน แต่ด้วยความสามารถในการทำดาเมจในจำนวนที่ใกล้เคียงกับตำแหน่งในเกม


0

คิดว่าอัลกอริทึมนี้ทำงานได้ดีสำหรับวัตถุประสงค์ของฉัน

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

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

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

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

จากนั้นจะกลายเป็นเรื่องของการเรียกใช้คาถาที่ไม่ใช่พื้นฐานทั้งหมดเพื่อค้นหาลำดับของคาถาทั้งหมดที่ไม่ละเมิดกฎ 2 ข้อ

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

ยกตัวอย่าง 2 คาถา

1: 300 ดาเมจเวลาร่าย 3 วินาทีคูลดาวน์ 10 วินาที

2: 290 ดาเมจ, เวลาร่าย 3 วินาที, คูลดาวน์ 3 วินาที

ความเสียหายส่วนใหญ่มาจากลำดับที่ 1 - 2 - 2 - 2 ซึ่งทำให้การซ้อนทับ 2 วินาทีในการโยน # 1 ที่มีศักยภาพ อย่างไรก็ตามสิ่งนี้ยังคงมีประโยชน์เพราะถ้าคุณไม่ใช้คาถาที่สาม (เช่น 1 - 2 - 2) คุณจะได้รับดาเมจ 880 ดาเมจใน 1 วินาที หากคุณร่ายคาถา # 2 พิเศษคุณจะทำ 1170 - 2 วินาทีของอันดับ 1 ซึ่งเท่ากับ 200 ดังนั้นความเสียหาย 970 จึงเป็นความเสียหายสัมพัทธ์ของคุณ


-2

คุณสามารถทำกล่องสลับสไตล์ "ความปลอดภัย" อย่างง่าย

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

สมมติว่าเวลาของคุณเสร็จในจำนวนเต็มบล็อก -

// after casting spell
int remainingTime = (coolDown - castTime);
switch(spellJustCast)
{
  // assuming the cast method will have some input validation for whether the spell
  // is off cooldown or not, pass the time as a parameter
  case 3 : castSpell1(remainingTime);
           castSpell2(remainingTime);
           break;
  case 1 : castSpell2(remainingTime);
           castSpell3(remainingTime);
           break;
  case 2 : castSpell1(remainingTime);
           castSpell3(remainingTime);
           break;
  default: System.out.println("Debug!");
           break;
}

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

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


ฉันไม่รู้จริงๆว่าคุณกำลังพยายามมาที่นี่ แต่ไม่มีเกมเอ็นจิ้นสมัยใหม่ที่มีฟังก์ชั่นเช่น castSpell1 และ castSpell2

1
@Joe Wreschnig ฉันหมายถึงพวกเขาว่าเป็นวิธีการของตัวเองในชั้นเรียนเกมที่กำหนดเองของเขานี่เป็นเพียงตัวอย่างนามธรรมไม่ใช่รายละเอียดอย่างใดอย่างหนึ่ง
kymully

1
ใช่นั่นไม่ใช่คาถาที่ทำงานในเครื่องยนต์สมัยใหม่ มีหนึ่งฟังก์ชัน castSpell ที่ใช้วัตถุที่มีการอ่านฟิลด์จากไฟล์ คำแถลงสวิทช์เช่นนั้นคงเป็นไปไม่ได้ที่จะรักษาไว้ในเอ็นจิ้นจริง

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