足球經理《Football Manager》的比賽模擬原理是什麼?
不知道知乎有沒有 SI 的內部員工?
沒人回答的話,我斗膽來瞎掰一下。
參考文章:FM球員屬性全解釋,比較詳細的
FM系列各代的演算法基本上一致,只是每次更新都會修改不合理的演算法,更新換代的大改就是模擬更加真實的體育環境和畫質。
下面關於比賽模擬原理,就是演算法的問題。FM有5大類屬性影響比賽狀態:技術,精神,身體,守門員,隱藏和雜項。
我就舉個例子,比賽場上一個球員帶球奔跑會被什麼數值影響,只有帶球奔跑不牽扯防守和擺脫對方防守球員或者傳球別的情況。
技術方面:對於帶球的球員最重要的技術屬性就是盤帶(Dribbling)
這項屬性是關於球員帶球的能力的。而這項數值會被身體屬性內的速度(Pace)、爆發力(Acceleration)、靈活性(Agility)和平衡性(Balance)影響。會被精神屬性的勇敢(Bravery)鎮定(Composure)集中(Concentration)工作投入(Work Rate)所影響。
而延伸的身體屬性的4個屬性會被隱藏和雜項中的體力所影響,體力會被身體屬性的耐力(Stamina)和隱藏和雜項中的疲勞度所影響。而受傷也會影響體力,受傷幾率受隱藏和雜項中的受傷幾率影響。疲勞度的積累快慢受身體屬性的體質(Natural Fitness)影響。
隱藏和雜項屬性也有很多影響球員盤帶的發揮就是,狀態穩定性(Consistency)重要比賽(Important Matches)多位置性(Versatility)職業道德(Professionalism)壓力(Pressure)適應力(Adaptability),這些我就不一一解釋了,想了解的話請看我發的參考文章。
僅僅只是一個帶球就牽扯到4大類屬性,除了守門員屬性僅限於門將。SL這麼多年所做的工作就是盡量優化屬性互相影響之後是否更加真實。大空翼傳球成功早田接到球
早田繼續帶球早田遇到了球員a的防守早田選擇傳球給大空翼球員a由於習慣和侵略影響,選擇了鏟球
程序開始計算:早田體力剩餘90%,傳球12。球員a選擇鏟球對抗傳球減少20%權重,鏟球能力10+1狀態附加。最後早田傳球成功,大空翼在禁區準備球。有2名球員在大空翼附近!大空翼準備使用特技凌空抽射!球員b使用攔截球員c使用爭頂球員c爭頂失敗大空翼接到球成功使用了絕技!球員b進行攔截球員b攔截失敗!
守門員使用了拳擊球守門員沒擊到球球進了!!!!恩,大致上是這麼個流程。真沒瞎掰。&>_&<不認同前面的高票答案。 本人FM0304就入坑的骨灰級別玩家,自FM14後就已基本棄坑,其原因就是對FM比賽引擎產生了懷疑。
先上結論:
FM給人的感覺是並不是由引擎來演算出結果,而是首先由粗略的演算法(比如只考慮士氣,陣型熟練度, 還有決定性的比賽修正係數)先得出比賽結果,再來倒推相關的射門/控球數據和比賽精彩集錦. 這就是在你度假時使用的那種演算法一樣,根本不需要經過比賽引擎。
這一點應該因該是因為雖然經過了數十年的演進,SI目前的引擎還遠遠沒有達到能夠接近真實的模擬一場比賽的能力, 大量測試數據表明引擎的結果可能非常的隨機和不穩定, 所以SI不得以只有採用了更簡化的方法.
---------------------------------------------------------------------------------------------------------
為了論證這一點,我們來試著扮演一個理想化的極簡的比賽引擎, 在每一步都考慮球員的相關數值和其它參數(雖然我曾經很理想的認為FM的引擎就是這樣的, 但簡單的推演就知道這根本不現實), 真正的考慮來模擬一次巴薩隊皇馬比賽時的進攻:
理想的比賽引擎:
1. 伊涅斯塔面對克羅斯的防手傳球給邊路的梅西,這次傳球由多大的概率成功?
引擎調用函數 shouldPassSuccess(attacker(iniesta), defender(kroos), otherParams)來計算. 其中attacker()和defender()將考慮兩者的進攻和防守數值,以及當前的體力,士氣.
最後得出結果85%概率成功, 系統roll(probability(=85%)), 進入下一步判定.
真正懂球的都明白,這裡需要考慮的其它因素還有很多,比如協防球員莫德里奇和伊涅斯塔的距離, 梅西和伊涅斯塔的距離,當時天氣情況。我懷疑FM的引擎能夠考慮這麼多實際的因素,現實中只可能使用了簡化版的模型。
2. 梅西接球成功,是要直接傳中還是嘗試突破馬塞洛? 這裡又是一次隨機的roll, 需要考慮球員的traits(比如喜歡盤帶,喜歡邊路突破等等), 假設我們進入梅西突破判定階段.
引擎調用shouldDribbleSuccess(attacker(messi), defender(marcelo), otherParams). 這裡考慮的依然是攻防數值等等假設得出的概率為65%, 系統roll後進入下一階段
3. 梅西傳中,蘇亞雷斯中路搶點判定.
這裡情況將會更加複雜,需要分為幾步來判定:
- 1. 蘇牙是否越位 (主要suarez是否有反越位特技?)
- 2. 貼身防守的佩佩是否選擇犯規(考慮佩佩的防守數值,aggression等等) --&> (被侵犯後蘇牙是否會咬人@@)
- 3. 蘇亞雷斯是否選擇假摔?
- 4. 搶點成功概率: 因為蘇亞雷斯會面對兩名防守隊員和可能出擊的守門員(主要考慮守門員出擊傾向數值),這個概率的計算會比之前的傳球和突破的例子複雜.
假設經過上面的幾步推演,假設引擎判定蘇亞雷斯搶點成功, 頭槌攻門,進入射門是否成功的判定
4. 蘇亞雷斯頭槌攻門, 納瓦斯做出撲救
這裡比較簡單了,只需考慮蘇牙和納瓦斯直接數值比較,系統roll概率即可.
以上就是理論上一個比賽引擎模擬一次簡單進攻需要執行的步驟。真實情況的複雜度遠遠超出了比賽引擎能夠覆蓋到的範圍,所以指望這樣的比賽引擎能夠"真實"的模擬比賽只是一個不現實的夢. 舉個簡單的例子, 納瓦斯撲救成功,球彈出到大禁區線, 球附近有內馬爾, 莫德里奇等5名球員,接下來誰拿到這個球引擎該怎麼推算?
FM的引擎運作原理的推測:
基本可以肯定FM的比賽引擎並不是這樣的一個每一步驟都通過球員能力數值以及場上相對位置進行推演和判定的實現. 它很可能是一個更粗略的基於統計的模擬, 再來倒推比賽的過程(用於生成比賽統計數據和精彩回放).
皇馬對巴薩的這場比賽, FM的引擎會先根據兩隊士氣, 陣型, 首發球員總能力值和主客場等宏觀因素得出巴薩2:1勝的這個結果。然後根據這個結果來生成比賽的控球率和射門角球等數據, 再進一步生成精彩回放. 這就可以解釋廣為玩家詬病的一些不合理的比賽畫面: 中超球隊也能中場倒腳然後邊路一條龍突破傳中進球和巴薩的一模一樣, 其實系統的邏輯是這樣的:
1. 系統初步演算(可以看作是度假時演算法的增強版)得到結果: A隊主場2:1 勝B隊
2. A隊4-3-3, B隊3-5-2陣型。A隊總體實力較強(球員平均數值高), 又是主場.所以A隊這場的邊路進攻分布更多, 角球數更多。
3. 精彩畫面生成: A隊: SELECT 3, 23, 39 FROM {邊路進攻失敗集錦}, SELECT 12, 29 FROM {角球進攻集錦}, SELECT 11 FORM {中路遠射集錦} B隊: SELECT {7} FROM {快速反擊失敗集錦}
4. 進球畫面生成: SELECT 13 FROM {邊路進攻進球集錦}. SELECT 5 FORM {防守球員失誤導致失球集錦}
5. A隊manager (玩家)中場進行了陣型/人員調整(比如將進攻重心設在中路,加強遠射等等), reroll精彩畫面, 增加精彩遠射的比重, 根據剩餘時間重新生成相關畫面
當我想到這個FM的引擎可能運作機理以後, 對這個遊戲也就再也沒有以前的興趣了, 徹底棄坑
------------------------------------------------------------------------------------------------------------
題外話:
一直在想是否有一天會出現一種每一次對抗,每一次傳球這種細節來推演一場比賽的演算法。雛形應該是基於大數據統計後的概率計算, 不知道在數據採集越來越先進的未來是否有這種可能:
模擬預測比賽巴薩(目前聯賽第1) vs 薩維利亞(目前聯賽第5):
細節統計數據:
梅西在最近30場(時間)西甲面對前6名球隊的邊後位(這裡前6名球隊邊後衛代表了一種統計意義上的邊後衛水平,而不是一個個體)在大禁區右側區域(空間)的突破成功率是65%.
梅西在最近30場西甲面對前6名球隊時在大禁區右側射門準確率57.5%
{塞維利亞左後衛}最近30場(時間)西甲面對前6名球隊邊前衛搶斷成功率65%, 場均犯規3.6次, 場均助攻進入對方半場30米區域12次...
戰術層面的統計數據:
巴薩最近30場西甲面對前6名球隊時控球率68%, 右路進攻佔比47.2%. 突破成功率53%, 傳中成功率56.5%...
塞維利亞最近30場西甲面對前6名球隊時控球率45%, 左路本方禁區30米區域(空間)搶斷成功率65%. 角球失球率7.5%...
通過這些統計數據來建立正常比賽在各個球場區域(空間), 時間段(時間)的攻防成功率模型,進一步轉化為得失球從而達到對比賽結果進行模擬的效果.
這個思路也是基於吳軍&<數學之美&>中關於NLP(自然語言處理)研究歷史的那段介紹. NLP的研究也是在經歷了對精細的語法詞法規則分析到基於統計學來進行分析的過程。前面的分析可以看出基於球員能力數值的推演無法覆蓋到大量真實比賽時的因素. 換一個思路從統計學的角度講, 在有足夠系統的統計數據的支持下, 足球比賽的模擬應該才是最有可能的方向。在統計學的觀點可以簡化很多的問題, 比如這一場是梅西剛剛是腳踝傷勢痊癒後復出, 在模型計算時只需將其突破成功率下調12%即可(這個12%是追蹤最近5年歐洲頂級類似傷情攻擊類球員復出後首場比賽表現得出的統計值).
作為做過GL的RFM並拿過pocket gamer 的silver awared的人
出過FM作弊訓練法直到我自己告訴SI被禁的人來強行解答一下先回應某些人,你自己想不到做不出來,就別說人家做不出來。我在GL做RF和RFM的時候,我們就已經實現了一定程度的實時模擬,這不是什麼難事。某些人自己做假模擬套個足球的殼子,骨子裡是國產遊戲那套,就說世界都是黑的。呵呵
任何現實事物皆有模型
這個模型是一系列的規則
足球的本質:把球傳遞到對方球門的過程任何一個時間點場上的形勢:雙方基於球員實力和指令實現的在球的所在區域的實力對比的綜合結果足球的TEAM AI,主要體現的是22個人,當球在有人持有和無人持有狀態下,進攻方11人和防守方11人的行為的表現這裡很重要的一個因素是陣型你用什麼模型來保證雙方在進攻和防守時都能讓人明顯看出是陣型呢?陣型基礎上球員前插後撤導致的變化是怎麼實現的呢?首先你需要實現一個陣型的演算法然後需要實現持球人的演算法場上無非兩種人:持球人,非持球人持球人無非幾種行為:盤帶,傳球,射門非持球人一種行為:基於陣型和戰術指令的跑位非持球人的幾種行為:跑陣型,跑空檔,防守防守的幾種狀態:盯人,壓迫,搶斷最核心的一個:球員如何做決定持球人該如何選擇傳球盤帶還是射門傳不傳,傳哪裡,傳給誰,怎麼傳帶不帶,哪個方向帶我甚至可以告訴你這是個權值系統,反正你也做不出來------------------------------------------------------以上是基礎------------------------------------------------------以下是進階FM定義了這麼幾個概念來實現模型陣型的風格球員的覆蓋區域球員的職責職責包括天生職責和額外職責覆蓋區域是由這幾個實現的:靈活跑位,跑空檔,盤帶,壓迫,前插風格的區別:不同位置以及球員負責多個職責的數量決定------------------------------------------------------以下是其它天氣,溫度,場地球物理,人球物理,人人物理基於所有屬性對應的模擬現實的場上效果:比如說重大比賽,穩定性,爭論,更衣室球員遠射時基於相關屬性計算,然後你保證這些屬性的演算法模型能模擬出所有比賽的情況就行了比如說力量決定球速,門將撲球能力決定是否脫手,下雨天增加脫手係數暫時想到這麼多不知道說這些你們能不能懂
不懂的可以去看我的視頻,雖然你們看了也未必懂我的優酷頻道優酷網-中國第一視頻網,提供視頻播放,視頻發布,視頻搜索想問問題和玩好FM的加我的QQ群213437486想看段子八卦和聊球的可以關注我微博常有晴的微博_微博不知道問這個問題是想玩好FM還是想做這類遊戲
如果是前者建議去看我視頻
如果是後者
反正國內目前,我不是針對誰,其它的所謂經理類遊戲都是垃圾
多數據的綜合運算產生的一系列未知的隨機運算。十幾個G的遊戲又怎麼幾句話說清楚。大概的說遊戲以各種各樣的變數開始用隨機過程模擬比賽,變數包括球員各項數值、狀態、陣容選擇、細節處理、球員職責、戰術要求等等。你作為教練在比賽前後當中採取的行為會改變隨機的走向,比如你在中場休息換下上半場表現不佳的球員,電腦會認為你做出了積極地舉動,模擬向有利你的方向進行。但你是用一個受傷未愈、狀態不佳的球員換的,電腦又會認為你做出不合理的舉動,相應隨機方向又向不利方向發展。諸如此類。由於是隨機的,出現受傷、絕殺之類隨機事件就很正常了。
YNWA推薦閱讀:
※如何玩轉github?
※GitHub 上有些什麼好玩的項目?
※C語言中既然" "與空格『 』是不一樣的,那為什麼在字元串問題中,scanf中還不能讀入空格?
※這段python多進程百思不得其解,求大神指點問題何在?
※運行過程中程序中的變數存儲在哪?