文字播報型的自動戰鬥系統該如何保障不出現漏洞?
01-29
目前是想做一款純文字類網頁遊戲,戰鬥模式採用文字播報模式
看到過一個別人寫的是,本地進行戰鬥計算,最後把戰鬥結果post到伺服器上,這種很容易造成漏洞,直接在本地修改結果不停的post如果同步戰鬥狀態的,感覺會太複雜,有沒有方便的方法不容易出漏洞我將php和c#用socket連接在一起,可以進行數據交換計算,可以利用這個做嗎?
矮油,我覺得我應該很有資格回答這個問題,因為我做的遊戲就是這樣的。
看到樓主是用php,那麼覺得我更有資格了。首先分為兩種情況。
1. 所有戰鬥都在伺服器一次性完成,客戶端只是簡單的播報結果
這是最簡單的,也是我現在用的方案,也是絕大多數古典頁游用的方法。客戶端提交一個戰鬥請求,然後在伺服器完全全部計算,將結果用json或者其他什麼方法傳給客戶端,然後瀏覽器再用js解析出來。注意:這種方法也不能完全的杜絕客戶端作弊,最典型的例子,對於一些有消耗的戰鬥(無論是有冷卻時間,還是入場需要消費資源),玩家開兩個窗口然後同時點擊戰鬥按鈕,可能會出現雙份獎勵。我的遊戲就曾經出現過這種bug。此外,還存在我在後台改了數據沒有刷新緩存導致前台用戶玩的時候出現崩潰的問題。總之這種方法難度不高,對伺服器壓力也小(因為是集中計算)。
缺點是無法響應玩家輸入,也就是玩家並不能在戰鬥中進行控制,這就要看你的遊戲是否要求玩家在戰鬥中進行操作了。2.戰鬥會一邊進行一邊回傳到客戶端,響應客戶端輸入之後再傳到伺服器。
這種會比較難,其實這裡麻煩的問題反而不是作弊,而是伺服器負載……只要做好負載反而就沒有什麼問題。方法有很多種,你說的socket是一種,但我不懂……(-_-|||)。此外還有node.js系列的http://socket.io,更輕量,畢竟涉及C#就要涉及.net那種大而厚的東西,node.js相比之下更輕。
當然如果不選PHP的話,也有更多其他方案,比如純http://asp.net或者純java,甚至可以用現代的手段比如unity,當然這就扯遠了……所以如果要我來做的話,估計還是會選傳統的js輪詢ajax的辦法,不斷去伺服器查。會更吃一點伺服器資源(畢竟每次玩家操作都要走一次完整的http request),所以對於我們這種VPS放國外的屌絲可能會遭遇延遲問題。因此,我大概會把遊戲做成延遲不影響遊戲體驗的模式。舉例就是做一個萬智牌遊戲,我點擊出牌的時候,動畫直接播放出牌效果(但此時還處於http request中),然後畫面出現「電腦正在思考中」,然後播放電腦的出牌結果。當然還有個辦法就是你說的,把一些簡單的東西放到客戶端,但實際上這些內容必須還是要傳到伺服器在計算一次,最終回來的時候覆蓋客戶端算的結果,並且要保證從頭到尾不使用客戶端的數據。客戶端計算的數據「僅僅是處於讓玩家感受速度快」。
這點其實很常見,比如大型網站點贊,點贊的瞬間就+1了,其實只是客戶端計算而已。刷新之後就會變成真實數據。如果負載實在扛不住,可以考慮把遊戲的一部分做成不消耗伺服器的模式(例如你的遊戲設定,在上面玩2小時可以獲得100點遊戲內戰鬥力,那麼你就設置一個2小時的遠征任務,這個任務掛好了之後就獲得100點戰鬥力,又或者刷1天怪物平均可以獲得3件裝備,那麼你可以設置一個副本,冷卻時間24小時,必掉3件裝備)。總體上玩家的收益是相同的。我傾向於把遊戲做成不那麼肝(也就是不需要反覆算時間,一直在屏幕前點點點)。因此伺服器負載倒不是那麼大,512M1核的低配VPS,長期負載也就0.0x,所以還跑了幾個其他業餘利用資源……有想到再補充
利益相關:RPG類型純文字類網頁遊戲 莉諾達斯 - Linodas.com 製作人。(PS:前幾天打通了奧里與迷失森林,所以在首頁放了一個全屏跳轉推薦這款遊戲,不要以為進錯網站了。。戰鬥過程中如果玩家不能介入的話,直接服務端算好整場戰鬥過程,一次性下發到客戶端慢慢播文字就是了,你指的複雜是什麼。
用socket的話,需要實現一套基於socket的遊戲協議,好處是省流量、通信靈活,伺服器主動推送信息容易。如果想簡單點,可考慮直接用http短連接通信,但對於一些伺服器主動下行的功能不好實現。不要本地計算,用服務端計算後下發客戶端就好。
推薦閱讀: