程序猿的逆袭-Dota玩什么英雄最容易拿MVP?

简介:

相信很多“牛人”都被一些宅男学弟问过这个问题:学长,我作为一个初学程序的菜鸟,要怎么样才能提交自己的编程水平,变成牛人呢?

说实话,这个问题深奥地我有点回答不上来,无外乎只能告诉他“多读”“多写”“搞好数学和算法,练内功”“用好设计模式”“看《编程之美》”等等之类的空话套话。后来剃刀阿遠给出了一个答案让我深受启迪,他说:就一句话——多写给人用的代码

这句话第一次听上去也许觉得有点装逼,实则不然,我非常认同这个观点。

好吧,宅男学弟又开始问了:学长,什么样的代码才是给人用的代码?毕竟我一个菜鸟我又不是腾讯不能弹窗口邀请别人来用,别人为什么要用一个菜鸟的代码呢?

这个问题相对就更非常具体了,我个人认为,有实用价值同时又让人觉得亲切有趣的程序就可以了。

例如,Dota是一款80后程序猿耳熟能详的游戏,尤其是还没走出大学校门的挨踢宅男的最爱。毫无疑问,如果我们以Dota作为突破点,只要idea有意思、跟Dota紧密相关,就算是菜鸟写的程序也能在学校BBS里被大家争相传阅。

本文就以“统计Dota玩什么英雄最容易拿MVP”为例,做一次抛砖引玉。文末我们可以讨论更多关于Dota辅助程序的idea。

 

11对战平台是最近流行的Dota平台,与其他对战平台不同的是,11有海量的统计数据。对于每一个玩家,都有最详细的统计,细到包括他所擅长的英雄、历史上用哪个英雄做了哪些事、平均某个英雄出场杀敌数、甚至细到该玩家历史上一共拿了多少个Double Kill都有记录。

image

本文仅仅示例如何统计MVP而已,相对于11对战平台的数据宝库来说,可谓是“弱水三千,只取一瓢”。思路是这样的: 抓取大量(如十万个)活跃玩家的历史场次信息,对所有场次的MVP英雄进行统计。十万个活跃玩家涉及的总Dota场次是千万级的,统计样本已经很充足。

 

有了基本思路,我们再理一个详尽的流程:

1.抓取数据并保存到本地。(涉及的新手知识:如何抓取网络数据包、 通过WebClient下载HTML网页)

2.分析已保存到本地的数据,作出记录。(涉及的新手知识:简单的正则表达式、处理JSON)

3.制作直观统计结果(涉及的新手知识:LINQ和lambda表达式、文件的读写)

这么一个简单的程序,对初学.NET的新手来讲,可以带着兴趣锻炼到如此多的基本功知识点,比看什么枯燥的xxx入门到精通书籍有趣多了! o(∩_∩)o

 

第一步 用Fiddler抓包获得用户统计页面的URL

image

通过抓包我们知道:

1.用户统计页面的地址形如:

http://i.5211game.com/rating/?u=4629868

u后面是用户的ID

2.需要登录才能查看统计结果。我们程序获取页面时,可以通过设置Cookie来模拟登录。

 

第二步 使用WebClient构造请求

 

Cookie部分设置为Fiddler里所抓取到的Cookie值。如果抓取成功就保存到本地文件,文件名以用户ID命名。

复制代码
         ///   <summary>
        
///  抓取某个玩家的数据o
        
///   </summary>
        
///   <param name="i"> 玩家平台的ID </param>
         private  void GetFiles( int i)
        {
            WebClient wc =  new WebClient();
            wc.Headers.Add( " User-Agent "" Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1 ");
            wc.Headers.Add( " Accept "" text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 ");
            wc.Headers.Add( " Accept-Encoding "" gzip,deflate,sdch ");
            wc.Headers.Add( " Accept-Language "" zh-CN,zh;q=0.8 ");
            wc.Headers.Add( " Accept-Charset ""  GBK,utf-8;q=0.7,*;q=0.3 ");
            wc.Headers.Add( " Cookie "" 设置为你自己的COOKIE ");

            wc.DownloadFile( string.Format(urlTemp, beginId + i), (beginId + i).ToString());
复制代码

        } 

 

第三步 分析已抓取文件中的数据

 

用到了简单的正则表达式。本例中所处理的对象为JSON,我们采用Newtonsoft.JSON进行处理。将分析结果保存到Dictionary<string,int>数据结构中,同时更新统计的总场次。

   /// <summary>

复制代码
         ///  读取之前所抓的文件内容
        
///   </summary>
        
///   <param name="l"></param>
         public  void ReadFiles( long l)
        {
             var sr = File.OpenText(l.ToString());
             string content = sr.ReadToEnd();
 
             // 正则表达式提取出HTML文件中的JSON
             var m = Regex.Matches(content,  " HeroList.*] ", RegexOptions.Compiled);
             if (m.Count >  0)
            {
                 // 将JSON变成Record类
                 var list = JsonConvert.DeserializeObject<List<Record>>(m[ 0].ToString().Replace( " HeroList =  """));

                 foreach ( var item  in list)
                {
                     if (!dicMvp.ContainsKey(item.heroname))
                    {
                        dicMvp.Add(item.heroname, item.mvp);
                    }
                     else
                    {
                        dicMvp[item.heroname] = dicMvp[item.heroname] + item.mvp;
                    }

                     // 累计场次
                    BattleCount += item.lost + item.win + item.offline;
                }
            }
        }
复制代码

 

第四步 制作直观的统计结果

 

软件的用户怎么查看程序运营的结果呢?一般无外乎就是文本文件、网页、图片。我们先写个简单的文本文件吧!。(如果写个漂亮的HTML5页面,相信效果会非常好哦)注意在输出结果前,先把Dictionary<string,int>排序一下,可以使用到简单的lambda表达式。

     /// <summary>

复制代码
         ///  分析结果
        
///   </summary>
         private  void GetResult()
        {
             var sw = File.CreateText( " result.txt ");
            StringBuilder sb =  new StringBuilder();
             foreach ( var item  in dicMvp.OrderByDescending(p => p.Value))
            {
                sb.AppendFormat( " {0}:{1}\n ", item.Key, item.Value);
            }
            sw.Write(sb.ToString());
            sw.Write( " \n\n总统计场次: " + BattleCount);
            sw.Close();
        }
复制代码

 

运算结果是这样的:

image

已统计的数十万场比赛中,最容易获得MVP的英雄前十名依次为:神灵武士、屠夫、嗜血狂魔、赏金猎人、幽鬼、影魔、山岭巨人、召唤师、敌法师、先知。 当然,如果统计范围再大一点(把抓取数据的程序跑一整天即可),涉及场次达到千万级,结果会更加准确。

怎么样,非常简单吧?嘿嘿,之前说过了,本文只做抛砖引玉,为那些初学.NET找不到练手项目的人增加一些思路。您可以根据本文很轻松地制作出“最容易打钱的英雄”“杀人数最多的英雄”“最容易推塔的英雄”“最坑爹的英雄”等等等等。。。

 

关于Dota辅助程序

其实,当您熟知了本文所提及的这些“基础知识”以后,您会发现11对战平台的统计数据可以做非常多的事。

关于Dota辅助程序是我一位同事提出的,可以是各种对战平台(不限于11)的插件形式。可以做的事情有:

1.根据海量统计数据,在某场Dota比赛开始后,根据场上10个英雄,告诉玩家哪个英雄最容易获得MVP。

2.根据海量统计数据和场上已选的9个英雄,告诉玩家应该选哪个英雄更容易打出好的成绩。

3.根据海量统计数据告诉玩家此局应该怎么出装备、怎么升级能甚至整体策略。

4.根据海量统计数据(尤其是天梯的数据),告诉玩家在CM模式(或其他组队模式)应该怎么选英雄搭配(还可以结合对方选的英雄实时运算新策略)。



本文转自 流牛木马 博客园博客,原文链接:http://www.cnblogs.com/azure/archive/2011/12/31/Dota_MVP.html,如需转载请自行联系原作者

相关文章
|
人工智能 程序员 API
『教师节』程序猿用文心大模型带你一键加速祝福,祝老师们节日快乐
『教师节』程序猿用文心大模型带你一键加速祝福,祝老师们节日快乐
125 0
|
API 定位技术 C++
【致敬童年】Funcode实现坦克大战
【致敬童年】Funcode实现坦克大战
P4933 大师
P4933 大师
94 0
P4933 大师
|
前端开发 程序员 C#
第72个儿童节,程序猿“童”样精彩~
第72个儿童节,程序猿“童”样精彩~
110 1
第72个儿童节,程序猿“童”样精彩~
|
人工智能 前端开发 JavaScript
一波童年回忆。。。
从程序员的角度来看,网络上有很多编码游戏,你可以利用这些游戏平台,以更有趣的方式学习和磨练你的编程技能。
一波童年回忆。。。
|
存储 算法 程序员
想当程序猿?或许你需要这个书单-程序猿修炼之路(上)
转眼间暑假就快到了。与其咸鱼懒得翻身,还不如坐下来,静下心找几本书安安静静看完。那么,小编在这里给大家推荐几本程序猿的练级攻略吧。
120 0
想当程序猿?或许你需要这个书单-程序猿修炼之路(上)
|
SQL 分布式计算 前端开发
长路漫漫,其修远兮,这一年我与CSDN的故事 | 2021年终总结
长路漫漫,其修远兮,这一年我与CSDN的故事 | 2021年终总结
140 0
长路漫漫,其修远兮,这一年我与CSDN的故事 | 2021年终总结
|
Java C语言 C++
我与阿里云的恋爱笔记
首先自我介绍一下,我是一名软件工程专业的大三学生,目前接触阿里云服务器已经有一年多的时间了。虽然在技术层面不可能和众多大牛们相比,但是我还是想聊聊我和阿里云之间的故事
|
Arthas 运维 安全