ฉันจะปรับจำนวนและความท้าทายของศัตรูในคลื่นการโจมตีขณะที่เกมดำเนินไปได้อย่างไร


9

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

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

จนถึงตอนนี้ฉันมีบางอย่างที่คล้ายกันดังต่อไปนี้

if(Math.random() < 1 - (1/elapsed_time) && spawnTimer <= 0 ){
    spawnEnemy()
    spawnTimer = rand(); // random number between 1 and 3
}

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

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

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


เวลาที่ผ่านไปคืออะไร? มันคือสิ่งที่ผ่านมาจนถึงตอนนี้? คุณเรียกเงื่อนไขนี้บ่อยแค่ไหน?
AturSams

สวัสดีใช่เวลาที่ผ่านไปคือเวลาที่ผ่านไปตั้งแต่เริ่มเกมและสิ่งนี้เรียกว่าในการอัปเดตเกมของฉัน () ซึ่งขึ้นอยู่กับ
หน้าต่างการสอบถามแอ

คำตอบ:


3

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

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

ให้rateเป็นปริมาณของสัตว์ประหลาดที่คุณต้องการมาในทุก ๆ นาที (หรือรอบ)

อนุญาตGROWTH_RATEเป็นอัตราที่เพิ่มความยากลำบาก (ตอนนี้มันจะเป็น0.2)

rate = 10สมมติว่าคุณเริ่มต้นด้วย ตอนนี้ผู้เล่นฆ่า5มอนสเตอร์เพื่อให้คุณสามารถเพิ่มอัตราการโดยและใหม่GROWTH_RATE * 5 = 1.0rate = 11

วิธีใช้เงื่อนไขที่จะสร้างrateสัตว์ประหลาดทุกนาที:

ตั้งเวลาวางไข่ไปยังหมายเลขระหว่าง0.5การ1.0 multiplied by 60 seconds orรอบเวลาand divided byอัตรา. Also leave a0.25` โอกาสที่มอนสเตอร์ที่ไม่ได้มาจากกระบอกไม้ไผ่เมื่อเวลาถึง 0 และเวลาที่เป็นแบบสุ่มอีกครั้ง

หากrateเคยมาถึงthreshคุณต้องชะลอตัวลง ตอนนี้แทนเพิ่มขึ้นrateโดยที่คุณสามารถเพิ่มได้โดยการGROWTH_RATE 1 / math.sqrt(rate)ด้วยวิธีนี้ผู้เล่นจะไม่ถูกทำลายทันทีในการตั้งค่าที่ยากขึ้น

คุณสามารถรีเซ็ตthreshเป็นประมาณ 80% ของจำนวนrateผู้เล่นที่แพ้ในเกม

หากคุณต้องการที่จะสุ่มพลังของสัตว์ประหลาดให้ระมัดระวังเกี่ยวกับตัวจับเวลา ตัวอย่างเช่นถ้าคุณตัดสินใจว่าplayer-score(กำหนดโดยมอนสเตอร์ฆ่าเพื่อให้ห่างไกล) max-monster-strength = player-score / 1000จะใช้ในการตรวจสอบความแข็งแรงสูงสุดของมอนสเตอร์ที่สามารถวางไข่คุณสามารถทำอะไรเช่นนี้ จากนั้นสุ่ม a floatหรือdoubleระหว่าง0.0ถึง1.0และคูณผลลัพธ์ด้วยตัวเอง

float monster_power = Math.random();
monster_power *= monster_power; // Multiply result by itself
    // Makes hard monsters less frequent than weak ones
monster_power *= max_monster_strength;

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

spawn_timer *= math.sqrt(monster_power);

6

มีตัวเลือกมากมายสองตัวเลือกในการตั้งค่าปัจจุบันของคุณ:

  • ทำให้ศัตรูยากขึ้น
  • วางไข่ศัตรูได้มากขึ้น (มากขึ้นหรือมากขึ้นพร้อมกัน)

มากกว่านั้นด้วยคุณสมบัติเพิ่มเติม:

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

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


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

2

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

static const double SPAWN_CHANCE_ON_DIFFICULTY_1 = 0.01;

for (int i = 0; i < currentDifficulty; i++) {
   if(Math.random() < SPAWN_CHANCE_ON_DIFFICULTY_1 ){
       spawnEnemy()
   }
}

ในระดับความยาก 1 จะมีโอกาส 1% ที่จะวางไข่ศัตรูหนึ่งตัวต่อหนึ่งขีด

ในระดับความยาก 1,000 มันจะวางไข่ได้มากถึง 1,000 ศัตรูแต่ละคนมีโอกาสแยก 1% ซึ่งหมายความว่าโดยเฉลี่ย 10 จะวางไข่ต่อเห็บ แต่มันอาจจะมากหรือน้อย มีความเป็นไปได้ที่จำนวนที่แตกต่างกันมากจาก 10 จะวางไข่ในคราวเดียวอาจจะทั้งหมด 1,000 ก็ได้ แต่นั่นเป็นเหตุการณ์ที่ไม่น่าเป็นไปได้มากนักเนื่องจากความน่าจะเป็นที่ใช้งานได้ (เปรียบเทียบ: กฎของตัวเลขจำนวนมาก)

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

for (EnemyType enemyType: allEnemyTypes) {
    for (int i = 0; i < currentDifficulty - enemyType.getDifficulty(); i++) {
        if(Math.random() < enemyType.spawnChance() ){
            spawnEnemy(enemyType);
        }
    }
}

1
นี่เป็นการกระตุ้น แต่ควรปรับให้เหมาะสมก่อนใช้ ตัวอย่างเช่นคุณสามารถใช้ Math.random () หนึ่งครั้งเพื่อตัดสินใจว่าศัตรูจะวางไข่กี่ครั้ง หากคุณต้องการปล่อยให้โอกาสน้อยลงสำหรับศัตรูจำนวนมากคุณสามารถใช้ "การกระจายปกติ" ได้อย่างมีประสิทธิภาพยิ่งขึ้น stackoverflow.com/questions/2325472/…
AturSams
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.