遊戲中常常要做乙個動作的命中判定,比如攻擊的命中判定,結果一般為未命中、普通命中,致命命中,命中格擋等(當然複雜起來遠不只這些)。一般的,程式上(或策劃上)採用的是優先順序概率演算法或者圓桌演算法。
優先順序概率的演算法是:先判定是否未命中,如果命中是否閃躲,如果未閃躲是否招架,最後才是普通攻擊(有省略)。也就是說按優先順序(順序)進行概率計算和判斷。
圓桌演算法是將這些屬性(命中普通攻擊、未命中、招架、命中致命攻擊)放在一起,構成乙個圓桌。如
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 則滿足動量守恆定律 碰撞型別和能量守恆定律...