2009-09-03 71 views
6

在一個在線經理遊戲(如Hattrick)中,我想模擬兩支球隊之間的比賽。模擬在線遊戲中的體育比賽

一個團隊由11名球員組成。每個球員的力量值都在1到100之間。我將每個球隊的防守球員的這些力量值計算出來並計算出平均值。這是一支球隊的防守品質。然後我利用進攻球員的優勢,獲得進攻性質量。

每次攻擊,我做到以下幾點:

$offFactor = ($attackerTeam_offensive-$defenderTeam_defensive)/max($attackerTeam_offensive, $defenderTeam_defensive); 
$defFactor = ($defenderTeam_defensive-$attackerTeam_offensive)/max($defenderTeam_defensive, $attackerTeam_offensive); 

此刻,我不知道爲什麼我被高兩個值之一除以它。但是這個公式應該會爲你提供一個後來需要的進攻和防守質量的因素。

然後,我爲每個可能發生的事件嵌套條件語句。例如:攻擊隊是否獲得得分機會?

if ((mt_rand((-10+$offAdditionalFactor-$defAdditionalFactor), 10)/10)+$offFactor >= 0) 
{ ... // the attack succeeds 

例如,這些附加因素可能是戰術價值。

你認爲這是計算遊戲的好方法嗎?我的用戶表示他們對模擬質量不滿意。我如何改進它們?你有不同的方法可以給出更好的結果嗎?或者你認爲我的方法很好,我只需要調整條件語句中的值並嘗試一下?

我希望你能幫助我。提前致謝!使用最大

+0

在這個模擬中,計算中的10特別代表什麼? – 2009-09-03 17:47:51

+0

模擬質量如何,他們不滿意? – 2009-09-03 17:56:06

+0

@Kyle Walsh:只使用10s,因爲mt_rand()函數只取整數值。我想生成一個-1(或更高取決於其他因素)和+1作爲浮點值的隨機值。 – caw 2009-09-04 15:09:13

回答

19

這是我會這樣做的一種方式。

進攻/防守質量

首先讓制定出整個團隊的平均強度:

Team.Strength = SUM(Players.Strength)/11 

現在,我們想拆出方二,制定出的平均值爲我們防守球員和我們的進攻球員。]

Defense.Strength = SUM(Defensive_Players.Strength)/Defensive_Players.Count 
Offense.Strength = SUM(Offense_Players.Strength)/Offense_Players.Count 

現在,我們有三個值。第一個出局的球隊平均數將被用來計算我們的勝率。另外兩個人計算我們的防守機率和得分的機率。

一個攻擊性高的球隊將有更多的機會,一支防守高的球隊將有更多的機會儲蓄。

現在,如果我們有團隊,讓我們稱之爲A和B.

A隊,有一個平均的80,85的進攻得分和60

B隊的防守得分,平均爲70,進攻得分爲50,防守得分爲80.

現在,基於平均值。 A隊應該有更好的獲勝機會。但是多少?

得分和保存

讓工作了A隊應該多少次的目標得分:

A.Goals = (A.Offensive/B.Defensive) + RAND() 
     = (85/80) + 0.8; 
     = 1.666 

我承擔的隨機值加-1和+1之間的任何東西,雖然你可以調整這一點。

正如我們所看到的,公式表明A隊應該獲得1.6個進球。我們可以將其上下調整。或者給A組1​​,並計算是否允許另一個(隨機機會)。

現在對於B隊

B.Goals = (B.Offensive/A.Defensive) + RAND() 
     = (50/60) + 0.2; 
     = 1.03 

所以我們有一個進球1和B得分1.但是,請記住,我們希望這個重量在A的青睞,因爲,總體而言,他們是更好的球隊。

那麼A會贏的機會是什麼?

Chance A Will Win = (A.Average/B.Average) 
        = 80/70 
        = 1.14 

所以我們可以看到賠率爲14%(.14),贊成A贏得比賽。我們可以使用這個值,看看是否有在最終得分的任何變化:

if Rand() <= 0.14 then Final Score = A 2 - 1 B Otherwise A 1 - 1 B 

如果我們的隨機數是0.8,那麼這場比賽是一場平局。

圍捕,並進一步思考

你一定要玩的值。請記住,遊戲機制很難得到正確的結果。與你的球員交談,詢問他們爲什麼不滿意。球隊總是失敗嗎?模擬總是停滯不前?等等。

上述輪廓深受選擇的隨機性影響。你會想把它歸一化,所以一支球隊打進額外5個球的機會非常非常罕見。但有點隨意性是爲遊戲添加一些變化的好方法。

也有編輯此方法的方法。例如,您可以使用目標數字作爲得分機會的數量,而不是目標數量,然後使用另一個功能來計算基於其他因素的目標數量(即選擇一個隨機前鋒,並使用該球員個人統計和守門員,以確定是否有目標)

我希望這會有所幫助。

+0

非常感謝! :)請看看我對Kylotan有關該部門的回答的評論。你認爲這個部門比差異更充分嗎? – caw 2009-09-08 13:52:49

+0

B.Goals =(B.Offensive/A.Defensive)+ RAND()? – Mathias 2009-10-26 07:50:37

+0

@Mathias與A.Goals =(A.Offensive/B.Defensive)+ RAND()相同,我們將B.變量轉換爲B.Goals.We比較每個隊伍對對手球隊的防守進攻情況。隨機是有一些變化。 – AAA 2009-10-27 19:39:35

0

平均應該是球員的數量...也就是說,如果你有3名球員的球隊:

[4 4 4]

[7 4 1]

第二一個會被認爲是較弱的。那是你要的嗎?我認爲你寧願這樣做:

(總得分/總球員)+(最高得分/總球員),所以在上面的例子中,它會讓第二隊略勝一籌。

我想這取決於你如何感覺團隊應該平衡。

+0

感謝您的回答。我知道如何計算平均值,我已經實現了這一點。 $ attackerTeam_offensive是攻擊者進攻的平均值,$ defenderTeam_defensive是防守者防守的平均值。但我不知道爲什麼我用兩個值中較高的一個來區分他們的差異。我不知道我的技術/方法是否好。 – caw 2009-09-04 15:12:03

3

在你的例子中的劃分可能是一個壞主意,因爲它改變了輸出變量的規模,取決於哪一方更好。一般來說,在比較兩個數量時,您可能需要間隔數據(從另一箇中減去一個數據)或比率數據(將一個除以另一個)而不是二者。

在這種情況下更好的方法是簡單地將進攻得分除以防守得分。如果兩者相等,則結果將爲1.如果攻擊者比防禦者好,則它將大於1,並且如果防禦者更強壯,則將小於1。這些數字很容易處理。

此外,取代整個團隊的平均值,團隊的平均部分取決於所使用的隊形或戰術。這將允許球隊選擇進攻或防守,並看到這個利弊。

並寫下自己一些更好的隨機數生成函數。對於初學者來說,返回-1到1之間的浮點值以及從0到1的浮點值。在你的計算中使用這些,你可以避免所有這些混亂10到處!

+0

非常感謝!我認爲將這兩種力量值分開是不錯的主意。這些因素會以不平衡的方式變化,你會得到一個拋物線:6/1 = 6,6/2 = 3,6/3 = 2這不應該是這樣嗎?不同的是我認爲更好的方式。 – caw 2009-09-08 13:38:31

+0

反對分歧的另一個論據:從4/2到4/3的值正在下降,而從2/4到3/4的值正在上升。這完全是不必要的,不是嗎?這意味着:作爲一名主隊,做強更好。作爲嘉賓團隊,弱點是很好的。 ;) – caw 2009-09-08 13:45:09

+0

我已經取得了團隊各部分的平均值。我有$ attackTeam_offensive和$ attackTeam_defensive。或者你的意思是我甚至應該將攻擊分成左右兩部分? – caw 2009-09-08 13:46:53

3

您可能還想問問用戶什麼關於他們不喜歡的模擬。有可能的是,他們不是看到比賽的最終結果,而是想知道他們的球隊有多少次有機會進攻,但防守重新獲得了控制權。因此,而不是

"Your team wins 2-1"

他們希望看到比賽集錦:

 
"Your team wins 2-1: 
- scored at minute 15, 
- other team took control and went for tried for a goal at minute 30, 
    but the shoot was intercepted, 
- we took control again and $PLAYER1 scored a beautiful goal! 
... etc 

可以使用的東西像什麼傑米提出了一個起點,在隨機選擇的時間,也許挑誰踢進球門基於對進攻球員的加權抽樣(即得分越高的球員獲得進球得分的機會越高)。你可以玩得開心並且隨機添加低概率的事件,比如紅牌在球員身上,有人受傷,球員橫掃球場...

4

足球最基本的戰術決策是挑選formation,這是一組三個數字分別指派10名外場球員防守,中場和攻擊,例如4/4/2。

如果你使用一般的球員實力,那麼你不會失去這種戰術,而是會讓球隊倒退:最強的防守就是擁有一名非常優秀的球員,給予他任何幫助將會使其更有可能成爲另一支球隊得分了。如果你有一個等級爲10的玩家,那麼平均值爲10.添加等級爲8的另一個玩家,平均值下降(至9)。但分配更多的人進行防守應該使其更強大,而不是更弱。

所以首先,你想讓所有東西都基於總數,而不是平均值。總數之間的比例是一個很好的與規模無關的確定哪些球隊更強大以及多少的方式。比率往往比差異更好,因爲他們以可預測的方式與任何範圍的優勢團隊一起工作。你可以設置一個combat results table表示有多少個進球(每場,每半,每一步或其他)。

下一個戰術選擇是讓一個特殊的球員或者幾個好的球員更好。您可以通過設置表示遊戲中發生的事件的場景來做到這一點,例如一對一,一角或長球。參與場景的參與者首先被隨機選擇,然後場景的結果被推出。一個結果可能是另一場景開始(中場傳球導致交叉導致頭球機會)。

最後一步,它將帶給你足夠的實際足球經理比賽水平,給予球員多種強度等級,例如頭球,傳球,投籃等等。然後你使用適合他們所處場景的強度等級。

+0

謝謝! 「你有後退:最強的防守就是擁有一名非常優秀的球員,給予他任何幫助將會使其他球隊得分更高。」你能解釋一下這個更詳細嗎?所以你會採取比率而不是差異? – caw 2009-09-13 18:19:55

+2

如果您有一名玩家的評級爲10,則平均值爲10.添加評級爲8的另一名玩家,平均下降(至9)。但分配更多的人進行防守應該使其更強大,而不是更弱。 比率往往比差異更好,因爲他們以可預測的方式與各種優勢的團隊一起工作。 – soru 2009-09-14 00:31:34