Làm thế nào tôi có thể mở rộng quy mô số lượng và thách thức kẻ thù trong một đợt tấn công khi trò chơi tiến triển?


9

Tôi hiện đang làm một trò chơi phòng thủ nơi kẻ thù sẽ sinh ra và tấn công quân đội của người chơi. Nó tương tự như một trò chơi Tower Defense, ngoại trừ chỉ có một cấp độ. Kẻ thù sẽ tiếp tục sinh sản cho đến khi cuối cùng người dùng chết hoặc anh ta tích lũy được một đội quân đủ lớn để họ quét sạch bất kỳ kẻ thù nào sinh sản ngay lập tức (hy vọng nó sẽ đủ thách thức để điều này không xảy ra).

Điều tôi đang vật lộn vào lúc này là làm thế nào để trò chơi này ngày càng khó hơn và xác suất kẻ thù sinh sản về cơ bản cuối cùng đạt 100%.

Cho đến nay tôi đã có một cái gì đó tương tự như sau

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

Nhưng có vẻ như quá thống nhất để bắt đầu. Hiện tại tôi chỉ sinh ra một loại kẻ thù, ý tưởng là những kẻ thù khó nhằn hơn sẽ sinh ra khi thời gian cũng trôi qua.

Tôi cũng nghĩ rằng tôi cần phải ngẫu nhiên spawnTimerthêm một chút nữa và làm cho việc đó nhanh hơn khi thời gian trôi qua, nhưng tôi không thể thấy được suy nghĩ của mình về logic của tôi trong toàn bộ phần này. Có ai có thể giúp với một ý tưởng sơ bộ của loại công thức này?

Tôi hiện đang sử dụng javascript để viết trò chơi, nhưng rõ ràng đó là về khái niệm này.


Thời gian trôi qua là gì? Có phải đó là thông qua cho đến bây giờ? Bạn có thường gọi tình trạng này không?
AturSams

Xin chào, vâng, xin lỗi thời gian đã trôi qua là thời gian trôi qua kể từ khi trò chơi bắt đầu và điều này được gọi trong chu kỳ cập nhật trò chơi của tôi dựa trên window.requestAnimationFrame
TommyBs

Câu trả lời:


3

Chức năng bạn chọn không có khả năng phù hợp với mục đích của bạn. Đầu tiên, nếu bạn đi theo con đường này, một điều kiện ngẫu nhiên thất bại sẽ dẫn đến sự chậm trễ trước lần tiếp theo bạn tung xúc xắc. Ngoài ra, không có khả năng giữ bộ đếm thời gian sinh sản trong phạm vi không đổi tốt cho mục tiêu của bạn.

Hãy threshlà một ngưỡng khó khăn mà bạn nghĩ là cao. Chúng tôi sử dụng điều đó sau để quyết định khi nào làm chậm tốc độ trò chơi trở nên khó khăn hơn.

Hãy ratelà số lượng quái vật bạn muốn đến trong mỗi phút (hoặc vòng).

Hãy GROWTH_RATElà tốc độ tăng độ khó (bây giờ sẽ là 0.2).

Hãy nói rằng bạn bắt đầu với rate = 10. Bây giờ người chơi đã giết 5quái vật để bạn có thể tăng tỷ lệ GROWTH_RATE * 5 = 1.0và mới rate = 11.

Cách thực hiện một điều kiện sẽ tạo ra ratequái vật mỗi phút:

Set spawn hẹn giờ để một số từ 0.5để 1.0 multiplied by 60 seconds orvòng thời gian and divided bytỷ lệ . Also leave a0.25` cơ hội mà không có con quái vật được sinh ra khi bộ đếm thời gian đạt đến 0 và thời gian được chọn ngẫu nhiên một lần nữa.

Nếu ratebao giờ đạt đến threshbạn cần phải chậm lại. Bây giờ thay vì tăng ratetheo GROWTH_RATE, bạn có thể tăng nó bằng 1 / math.sqrt(rate). Bằng cách đó, người chơi sẽ không bị phá hủy ngay lập tức trong cài đặt khó hơn.

Bạn có thể đặt lại threshkhoảng 80% số ratengười chơi đã thua trò chơi.

Nếu bạn muốn ngẫu nhiên hóa sức mạnh của quái vật hãy thận trọng về bộ đếm thời gian. Chẳng hạn, nếu bạn quyết định rằng player-score(được xác định bởi quái vật bị giết cho đến nay) sẽ được sử dụng để xác định sức mạnh tối đa của quái vật có thể sinh ra, bạn có thể làm điều gì đó như thế này : max-monster-strength = player-score / 1000. Sau đó, ngẫu nhiên một floathoặc doublegiữa 0.0để 1.0và nhân kết quả của chính nó.

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;

Bây giờ khi bạn chọn ngẫu nhiên bộ hẹn giờ, có lẽ bạn nên tính đến mức năng lượng. Chẳng hạn, bạn có thể nhân kết quả hẹn giờ với căn bậc hai của sức mạnh quái vật tiếp theo.

spawn_timer *= math.sqrt(monster_power);

6

Có rất nhiều tùy chọn, hai với thiết lập hiện tại của bạn:

  • Làm kẻ thù khó hơn
  • Sinh ra nhiều kẻ thù hơn (thường xuyên hơn hoặc nhiều lần cùng một lúc)

Sau đó, nhiều hơn với các tính năng bổ sung:

  • Kẻ thù bắt đầu gây ra các loại sát thương khác nhau và người chơi phải phòng thủ khác nhau. Ví dụ, tấn công tầm xa, ma thuật, v.v.
  • Kẻ thù bắt đầu tự vệ trước các loại sát thương khác nhau. Người chơi phải xây dựng nhiều loại thiết bị gây sát thương để chống lại. Ví dụ, người chơi bắt đầu với các cuộc tấn công bằng mũi tên và tấn công bằng súng thần công. Một kẻ thù có khả năng chống mũi tên rất cao, vì vậy người chơi phải đảm bảo rằng chúng đã cân bằng các cuộc tấn công của mình.

Đối với việc thực hiện một đường cong khó khăn, thực sự không có câu trả lời chính xác. Sẽ mất rất nhiều thời gian để chơi và tinh chỉnh để làm cho đúng. Nó sẽ phụ thuộc vào thời gian trò chơi dự kiến ​​kéo dài và mức độ khó mà bạn muốn chơi. Tôi khuyên bạn nên sử dụng Excel hoặc một trang web như WolframAlpha và xem loại đường cong mà các hàm khác nhau tạo ra. Hãy thử tăng theo cấp số nhân, tăng tuyến tính, v.v ... Tìm một công cụ phù hợp với bạn.


Cảm ơn các ý tưởng nhưng tôi nghĩ rằng câu trả lời được chọn là nhiều hơn những gì tôi cần. Nhưng bạn chắc chắn đã cho tôi nhiều thức ăn hơn để suy nghĩ và tôi đã nêu lên câu trả lời của bạn
TommyBs

2

Thay vì có một số lượng kẻ thù cố định (một) sinh ra với xác suất thay đổi, bạn có thể xoay nó và có một số lượng kẻ thù sinh ra với xác suất cố định.

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()
   }
}

Ở cấp độ khó 1, điều này sẽ có 1% cơ hội sinh ra một kẻ thù mỗi tích tắc.

Ở cấp độ khó 1000, nó sẽ sinh ra tới 1000 kẻ thù, mỗi kẻ có cơ hội riêng là 1%. Điều này có nghĩa là trung bình 10 sẽ sinh sản trên mỗi đánh dấu, nhưng nó cũng có thể nhiều hơn hoặc ít hơn. Có khả năng một số rất khác với 10 sẽ sinh ra cùng một lúc, thậm chí có thể là tất cả 1000. nhưng đó là một sự kiện rất khó xảy ra do cách xác suất hoạt động (so sánh: Luật số lớn ).

Khi bạn thêm nhiều kẻ thù khác nhau với các hành vi và chỉ số khác nhau, bạn có thể muốn một số kẻ thù khó nhằn hơn chỉ bắt đầu sinh ra những khó khăn cao hơn và ngay cả lúc đầu với mật độ thấp. Để làm điều này, bạn có thể thêm một công cụ sửa đổi độ khó được trừ vào độ khó hiện tại. Bằng cách đó, kẻ thù sẽ không sinh sản trước khi đạt đến mức độ khó và thậm chí sau đó chỉ với cơ hội thấp hơn lúc đầu:

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

1
Điều này rất kích thích nhưng nó nên được tối ưu hóa trước khi sử dụng. Chẳng hạn, bạn có thể sử dụng Math.random () một lần để quyết định có bao nhiêu kẻ thù sinh sản. Nếu bạn muốn để lại một cơ hội nhỏ hơn cho một lượng lớn kẻ thù, bạn có thể thực hiện "Phân phối bình thường" hiệu quả hơn. stackoverflow.com/questions/2325472/
AturSams
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.