คุณสมบัติสำหรับการคำนวนการเข้าชมในเกมเทิร์นเบสหรือโร๊คไลค์


22

ฉันพยายามหาสูตรที่ดีในการพิจารณาการโจมตีเมื่อผู้เล่นโจมตีศัตรูใน Roguelike ฉันต้องการที่จะคิดอะไรง่ายๆ แต่ก็ยังคงเป็นความจริงกับวิธีที่ทำใน D&D หรือ Roguelikes ยอดนิยมเช่น AngBand หรือ NetHack

สิ่งที่ฉันมีจนถึงตอนนี้คือการเพิ่มความแตกต่างระหว่างผู้เล่นและคุณลักษณะของศัตรูพร้อมกับจำนวนเต็มแบบสุ่ม:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

สิ่งนี้ทำให้การเล่นเกมที่ผิดธรรมชาติ: ผู้เล่นจะไม่พลาดศัตรูที่อ่อนแอและในทางกลับกันสำหรับผู้ที่แข็งแกร่ง ไม่มีใครรู้คำแนะนำเกี่ยวกับการต่อสู้ตามคุณลักษณะที่ใช้ในการเปิดเกมตาม ฯลฯ ? ฉันควร (และฉัน) คัดลอกกฎคำต่อคำทุกคำ D & D หรือไม่

คำตอบ:


18

ฉันจะหาสิ่งที่คุณต้องการโอกาส "การันตีที่น่าพอใจ" และ "การันตีพลาด" (เช่นโอกาสที่ลูกแมวจะตีมังกรและมังกรเพื่อให้ลูกแมวพลาด) เก็บผลการสุ่มของคุณและก่อนใช้ความแตกต่างของพลังงานให้ทำเครื่องหมายการเข้าชมหากอยู่ภายในขอบเขตเหล่านั้น นั่นจะป้องกันปัญหาโอกาสตี / พลาด 100% ... แม้ว่าจะมีตัวเลือกอื่นสำหรับให้โอกาสในการเข้าชมรายละเอียดอยู่ด้านล่าง

D&D เป็นระบบ "แบน" ที่มีการกระจายความน่าจะเท่ากันในผลการหมุนที่เป็นไปได้ ระบบอื่น ๆ ใช้การแจกแจงแบบโค้งมากขึ้นซึ่งมักจะทำได้โดยการหมุนลูกเต๋าหลายลูกแล้วเพิ่มเข้าไป มันง่ายพอที่จะสร้างเส้นโค้งเช่นนี้ (rand () + rand ()) / 2 ได้ใจ)

ความเป็นไปได้อีกอย่างคือ "ระเบิดลูกเต๋า" ในระบบเช่น Shadowrun และ Savage Worlds การหมุนผลการตายสูงสุดที่เป็นไปได้จะช่วยให้คุณทำการหมุนใหม่ที่ตายและเพิ่มผลการแข่งขันใหม่ ในเกมของคุณคุณจะทดสอบเพื่อดูว่าผลการสุ่มของคุณสูงกว่าเกณฑ์ที่กำหนดหรือไม่และถ้าเป็นเช่นนั้นให้หมุนอีกครั้ง หากคุณปล่อยให้ลูกเต๋าระเบิดไปเรื่อย ๆ แม้กระทั่งพวกก๊อบลินที่ต่ำต้อยที่สุดก็มีโอกาสที่จะโจมตีพระเจ้าและคุณไม่จำเป็นต้องมีกลไก

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

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

แน่นอนว่ายังไม่ได้ทดสอบและไม่สมดุล คุณต้องการปรับจำนวนเวทมนตร์ทั้งหมดจนกว่าพวกเขาจะรู้สึกถูกต้อง

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


3
ภาษาใดที่มีประเภทตลกประกาศ? หรือมันเป็นเพียง pseudocode
tenpn

2
ฉันคิดว่ามันอาจจะเป็น Actionscript หรือ Javascript แต่อย่ารั้งฉันไว้
The Duck Communist

It's Actionscript 3 ฉันเป็นนักพัฒนา Flash
Gregory Avery-Weir

6

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

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

ฉันเห็นปัญหาอื่นซึ่งเป็นที่สูตรของคุณไม่ได้ปรับขนาดและนี่อาจเป็นสิ่งที่คุณกำลังประสบอยู่ สมมติว่า DEX, LUCK และ SPEED มีแนวโน้มที่จะเพิ่มขึ้นตลอดระยะเวลาของเกมความแตกต่างระหว่างผู้เล่นและสัตว์ประหลาดในสถิติเหล่านั้นก็จะเพิ่มขึ้นเช่นกัน ตัวอย่างเช่นถ้า DEX เกมแรกของผู้เล่นอยู่ในช่วง 4 ถึง 6 และเป็นสัตว์ประหลาดนั่นคือตัวปรับแต่งที่น่าสนใจ 10-20% หากช่วงดังกล่าวมีค่าเหมือนกับ 10 ถึง 20 ในระยะต่อมาของเกมนั่นจะขึ้นอยู่กับตัวปรับเปลี่ยน 100%

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

อีกวิธีหนึ่งคือเปลี่ยน hardcoded ที่ "10" เป็น scale ตามระดับดังนั้นอาจเป็น "10 + monster level" หรือ "10 + dungeon level" หรืออะไรบางอย่างซึ่งทำให้เพิ่มความยากลำบากเล็กน้อยในขณะที่เกมดำเนินไป สถิติของพวกเขาตาม

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

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


นี่คือคำตอบที่ดี
seanicus

3

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


0

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

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