遊戲命中判定 圓桌演算法和程式實現

2022-04-10 06:15:38 字數 3434 閱讀 3329

遊戲中常常要做乙個動作的命中判定,比如攻擊的命中判定,結果一般為未命中、普通命中,致命命中,命中格擋等(當然複雜起來遠不只這些)。一般的,程式上(或策劃上)採用的是優先順序概率演算法或者圓桌演算法。

優先順序概率的演算法是:先判定是否未命中,如果命中是否閃躲,如果未閃躲是否招架,最後才是普通攻擊(有省略)。也就是說按優先順序(順序)進行概率計算和判斷。

圓桌演算法是將這些屬性(命中普通攻擊、未命中、招架、命中致命攻擊)放在一起,構成乙個圓桌。如

20%未命中,

5%致命攻擊,

30%招架,剩餘

45%為普通攻擊。

從上面的描述來看,圓桌演算法輸入的引數是乙個代表概率的陣列,或者,更廣泛地說是一組係數。我們完全沒有必要將引數固定為合起來為

100%

的概率值(雖然這麼做同樣可行)。因為當我們知道一組係數的時候,我們也同時知道了每個係數在這一組資料中所佔的比例。如我們可以使用10,

20,30來做引數,顯然,

10所佔的比例是

10/(10+20+30)

為1/6

,同樣的,20佔

2/6,30佔

3/6。所以這擴充套件了程式設計師和策劃的自由度。而圓桌演算法的輸出則是乙個代表圓桌某乙個部分的索引。例如0表示

10的部分,1表示

20的部分,2表示

30的部分。這裡要注意的是,這些係數顯然必須是乙個正數,負值的係數是沒有意義的。

演算法的流程是:隨機生成乙個數字,判斷這個數在哪個區間中,然後輸出這個區間的編號即可。當然,我們可以生成乙個介於0到

1的數字,然後判定分布於哪個概率區間即可。在文章的最後將給出具體

c#**。

繼續,我們討論關於圓桌演算法犧牲屬性的問題(吃完普通攻擊吃致命一擊的問題)。這個問題的描述是

(:對於例子:

目標的躲閃機率

……20% 

目標的招架機率

……5% 

戰士的致命一擊率

……30%

當閃躲增加

50%時按照剛才的圓桌理論演算法結果為:

躲閃機率

70%招架機率

5%致命一擊機率

25%(

30%-5%

)出現普通攻擊的機率

0 %隨著屬性的增加,例如當躲閃提高到

90%,招架提高到

15%的時候,會出現如下的屬性:

出現躲閃字樣的機率

90%出現招架字樣的機率

10%(

15%-5%

)出現致命一擊的機率

0%出現普通攻擊的機率

0%這一次,作出犧牲的是普通攻擊,致命一擊還有招架,其中致命一擊已經完全被犧牲掉,這對於結果的公平性是很大的負面影響。

但是,可以有另外一種計算方法,而不用犧牲個別屬性,這就是本文提出的方法。

同樣的例子(我們用

x代表屬性

,第二列的數字表示概率或者說係數):

x120x25

x330

x445

如果x1

提高到70%

,那麼其他屬性自然而然地降低。為什麼都要降低呢?很合理的,而原來的機率是相對於整個圓桌而言的,當整個圓桌因為乙個屬性的機率增大時,其他屬性就會按比例的縮小,這樣才能體現公平性了。因為前面的方法不合理的地方就是在於先犧牲了一種屬性。這裡有一點要說的是,將乙個屬性的機率提高到

100%

以上是沒有意義的,因為

100%

就意味著必然發生。

那麼將x1

機率提高到

70%後其他應該怎麼變化呢?上面已經提到——按比例。在該例子中,原來

x2機率為5%,

x3為30%,剩餘x4為

45%,除去

x1後,

x2佔剩餘的

5%/(1-20%)=5/80x3佔

30/80x4佔

45/80當x1

機率提高到

70%,剩餘

30%供其他屬性分享。因此結果是:

x170

x21.875

x311.25

x416.875

合起來依然是

100%

。於是在數值上的合理性就可以驗證了。(**依舊在文章的最後。)

但是在實際上,新問題會不斷出現,主要表現在調整的先後順序上,即先提高x1到

70%,再提高x2到

70%,和先提高x2到

70%再提高x1到

70%,得到的結果完全不同,程式計算結果如下:表1

原來先提高x1到

70%,

再提高x2

到70%

x120

7021.4012738853503x25

1.875

70x3

3011.25

3.43949044585987

x445

16.875

5.15923566878981表2

原來先提高x2到

70%,

再提高x1

到70%

x120

6.31578947368421

70x2570

22.4157303370787

x330

9.47368421052632

3.03370786516854

x445

14.2105263157895

4.55056179775281

這組資料表明,調整的先後順序會影響計算的結果。我們不妨想象在真實的遊戲中,玩家開啟閃躲技能,將閃躲提高到了

70%,那麼玩家希望的就是不被命中。然後開啟招架技能,將招架提高到了

70%,這時玩家希望的是同時擁有

70%的閃躲和

70%的招架。也就是說如果被命中(

30%),盡量出現招架。但是表

1表明此時閃躲的概率降低了,不滿足玩家期望的效果。

這個問題本質上是優先順序問題,圓桌上的所有屬性應當是同優先順序的。我們可以將命中判定分為

2個部分,對於存在優先順序的屬性採用優先順序概率演算法,對於同優先順序的採用圓桌演算法。這樣會形成如下圖的結構:

實際中可以先做命中和非命中的圓桌運算,然後做其他優先順序相同的屬性的圓桌運算,輸出最終的命中型別。當然如果還有屬性中的優先順序需要存在,我們可以再做一輪圓桌計算。

從這樣的分析來看,圓桌演算法的程式實現上不存在這樣的問題。所以圓桌演算法類應該有以下幾個功能:

1、通過輸入的引數輸出結果。

2、通過輸入引數能夠調整乙個係數。

具體**見鏈結位址(鏈結位址

頁面置換演算法 FIFO和LRU 及各自的命中率

1 先進先出演算法fifo 該演算法的實質是選擇作業中在主存駐留時間最長的一頁淘汰,這種演算法容易實現,例如分配乙個作業的儲存塊數為m,則只需建立一張m個元素的隊列表q 0 q 1 q m 1 和乙個替換指標。這個佇列是按頁調入主存的一頁。如圖4 1所示,某時刻調入主存四個塊,即m 4 它們按頁進入...

貪吃蛇的遊戲設計和演算法

一 所需功能 1.地圖的邊界及更新 2.蛇的初始化 3.蛇往四個方向的移動 用鍵盤實現 4.蛇撞到身體 障礙 邊界或你在地圖中定義 遊戲結束 5.蛇吃到食物,蛇就長一節 6.隨機放置食物,不可在蛇上或者超出邊界 7.得分的顯示和增加 二 遊戲的流程圖 三 遊戲的基本偽 輸出字元矩陣 while no...

撞球遊戲的核心演算法和AI 1

前言 基礎物理知識 摩擦阻力 其滿足牛頓第二定律 f m a 速度與加速度關係公式 vt v0 a t 地面摩擦力與運動物體的方向相反,阻礙物體的向前運動.動量守恆 假設物體a質量為m1,速度為v1,物體b質量為m2,速度為v2,碰撞後速度分別為v1 v2 則滿足動量守恆定律 碰撞型別和能量守恆定律...