zoukankan      html  css  js  c++  java
  • 记2012微软编程之美全国挑战赛

    完整的比赛说明在这里
      此处摘录一小段:双方各控制五艘船,中间有n座岛屿,初始状态为未占领状态,当一只船进入岛屿的范围内,该岛屿即被该方占领,然后整个舰队在整个地图范围上都会加血,占领的岛数越多,回血的速度就越快。当一座岛的范围内有两个舰队的船,则该岛被船数量多的一方占领,数量相同时占领权不变。只有在攻击范围内,才能攻击对方的船,有相应的伤害公式。船碰撞的时候也会有伤害。胜负规则:5分钟时间到后,完全消灭对方的舰队获胜;若没有消灭对方,则舰队总血量多的一方获胜;若总血量相同,船的数量多的一方获胜;若仍未分出胜负,占领的岛的数量多的一方获胜(岛的数量为奇数)
     
      这是我第一次参加编程之美比赛,真的没想到会进入100强,完全出乎我的意料。实话说这次比赛我准备的很仓促,一边在做老师的项目,一边写科技基金申请书,还一边参加微软的比赛,那几天的时间真是累的不行了。
    在拿到题目的时候,我的第一反应就是:这不就是魔兽争霸里两家暗夜拼arhcer的操作吗,选手需要做的就是决定何时去采矿,何时去进攻或者撤退。但是在开始写代码之后,我发现这完全不是一个概念!打游戏时的那种模糊数学对于人脑来说很简单,但是对于计算机,它很难判断采矿还是进攻。人脑在打游戏时对比赛节奏的控制我简单的概括为一堆弱分类器的输出结果,这些弱分类器可能包括敌我军队的数量,距离,所占矿的个数,双方所处的地型,站位,阵形配置,视野......有非常多的因素,通过这些弱分类器组合成一个强分类器来判断现在应该做什么事情。人脑往往可以一瞬间判断出应该去开矿还是去进攻,这在很大程度上是因为大脑的并行处理结构,在一定程度上是因为我们长期打游戏的经验(可以理解为机器学习),这两点对于当前的比赛来说都是不可用的,所以必须要简化游戏模型。
        在编程时,我发现一个简单的行进中集合的动作都很难完成,更不要说操作船只迂回战斗了。所以我把战斗简化为做3件事情。第一,攻击射程内最容易被杀死的敌人,这类似于archer的齐射。第二,防止船只被岛屿卡住,或者友方之间的互相卡位。第三,彼此的距离不能太远。一三两点在程序上比较好实现,第二点着实花了我很多时间 ,最终也是因为这一点没处理好而与决赛无缘。不得不说官方的sdk非常坑爹,什么功能都没有,每一回合interface返回的数据也有一部分是错误的,我不得不重新定义一套自己的处理方法,坑爹坑爹呀。
    实现战术时我做了两套AI,实现了两种不同的阵形和打法,本来第二套AI是我精心设计的,包括分散占领岛屿与集合进攻,血少的逃跑血多的战斗,甚至我还设计了让一搜船诱导敌方出界的战术,一共花了6天时间才写完,没想到最后阵形的控制非常糟糕。迫不得已,我把第一套的简单测试AI交了上去,结果竟然......真的出乎意料。
      回顾这次比赛,有很多地方都值得反思,我总结有两个地方做的不够好。
      第一在于比赛时间的分配,比赛时间一共是10天,按照《人月神话》的标准来说,要完成一个项目,规划的时间应该占1/3,coding的时间应该占1/6,其它时间都是测试和debug。而我只花了一天时间来构思程序的AI,很多地方没有考虑周全。SDK本身的bug,lib的无法编译,无法调试变量等很多问题都占用了我大量的时间,真正去考虑如果调整战术所占的时间少之又少。
      第二是测试不够全面,在看了比赛录像之后我发现,我的阵营在左边的时候,算法大部分时间是正确的,可是到了右边之后,就会出现诡异的行动,实在让我无法理解。在测试时,我完全没有测试阵营在右边的情况,所以结果可想而知。
    这次比赛的另外一个收获就是我学会了vector的使用,以前从来没有接触过stl,用过之后才发现它的强大已经出乎了我的理解。把现在的这个项目做完之后,我打算买一本《stl源码解析》,好好学一下stl,这是一个值得深入学习的工具。
    吸取经验,明年要拿到决赛的机会。
     
    秀一下战利品



  • 相关阅读:
    DOM事件模型
    Javascript 跨域
    浏览器内核及差异
    对WEB标准的理解
    SVN权限解析规则详解
    一款成熟的前端框架——Bootstrap
    终于可以发文了
    一些感想
    Linux升级nodejs及多版本管理
    zepto 自定义build
  • 原文地址:https://www.cnblogs.com/easymind223/p/2575269.html
Copyright © 2011-2022 走看看