2015华为德州扑克入境摘要——软体project
直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是。
我们的团队一直共同拥有3民,间。一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细的决策算法。离5报名早年1月开始,要设置环境,设计框架,任务分工,以及各个模块代码的编写。从我个人的感觉来看,整个过程能够说是一个比較艰辛的历程。
德州扑克是一种棋牌类游戏。属于一种博弈过程,起先我对这个游戏没有不论什么的了解,最多的也仅仅是在影视题材里面见过,可是详细的游戏规则并不懂。而正是在这种条件下。我们參加了由华为举办的德州扑克大赛。比赛的形式,由华为官方提供服务端程序,这个服务端程序负责整个游戏的控制,而參赛的队伍则必须依照官方提供的通信协议,设计出自己的玩家程序。实现和server的对接,并和其它玩家进行博弈游戏,最大限度的获得存活场次和金币数量。
整个德州扑克的游戏分为四个阶段,包含了翻牌前(preflop)、翻牌(flop)、转牌(turn)、河牌(reiver),玩家在不同的阶段,依据自己的手牌信息和已知的公牌信息以及每个玩家的动作做出对自己最有利的动作以获得最后的奖池奖金,这里的动作包含了盖牌(fold)、加注(raise)、跟注(call)、让牌(check)、全押(all In),在每个阶段里面,仅仅有当全部的玩家投入的金额相等,或者全押,才会进入下一个阶段。而假设是弃牌的玩家。则放弃最后的奖池奖金,不參与后面的喊注。最后游戏的输赢是仅仅剩一个玩家或者在场的玩家的两张手牌和5张公牌组合出最大的牌型的玩家平分最后的奖池奖金。
依据官方提供的通信协议手冊,client能够将整个流程进行例如以下划分:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aXF1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
client先通过initialize和server建立连接,并注冊,然后调用recevMsg開始接收消息。解析消息,假设接收到了游戏结束game-over的报文,则调用destroy断开连接释放资源,整个流程结束。否则依据接收到的报文,解析里面的信息。然后依据须要调用Update更新游戏和玩家的状态。假设server要求client做出决策动作,则调用makeDecision依据当前收集的信息进行决策。然后把决策动作交由sendMsg返回给server,等待server的下一条报文信息,整个client游戏如此不断循环,直到游戏结束。
依据流程图,能够获得用例图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHV6aXF1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
依据例子用图,进一步分析。能够得到整个系统框架所需的类图,当然这个仅仅是初期的一个系统框架。粒度还是比較粗,这个仅仅是为了便于分工合作,提前设计好借口。后期还是依据不同的须要进行了部分的调整,初期设计的类图例如以下:
在设计中,依据用例图对模块功能进行了划分并封装。最后得到了上图的几个类。因为设计初期,我们还不能确认在决策算法中须要什么数据信息,所以,在Status类中仅仅是保留了接口和引用关系,里面详细的成员变量和函数则须要和详细的实现需求结合然后加以扩充,Action类的情况也是类似的。
这里的设计须要注意的是,为了使整个系统的各个模块部分有一个比較好的解耦效果,採用了设计模式中的策略模式,将决策模块提取出来。然后在主类中保留了接口,以便后期採用不同的决策算法进行替代,而不须要去修改其它模块。
在这次的合作中,我们採用的是敏捷开发的团队合作方式。整个合作过程。我们的文档部分仅仅有一些必要的框架文档和算法说明,剩余的部分还是以交流居多。整个过程中,团队交流次数3-4次左右,这种交流每次都要持续一个晚上的时间,大概3个小时左右,而成员之间的合作交流在4-5次左右。每次时间也都是2-3个小时。也就是说,在这次的合作过程中,我们强调的是沟通和效率,通过文档来记录交流一些基本信息,对于繁杂说明,我们选择了面对面交流方式,然后辅以必要的文档来提高共同效率。
敏捷开发出了注重沟通之外,还须要强调团队的个人能力,在我们的团队中,每一个人都明白分工,这个得益于一開始的框架模块划分,当中,具有较好的数学功底的同学负责资料的收集和算法的设计。剩余的两个。则一个负责消息模块的解析,一个负责框架的搭建和算法的编码实现。每一个人都各司其职。
此外。敏捷开发还注重阶段性成果的实现,在这个过程中,我们团队先从环境的搭建,然后是框架的设计。再是每个模块的实现,在每个阶段都一定的成果进度的安排和实现,然后在上一个阶段成果的基础上进入下一个阶段。尽管如此,但仍然存在一些问题与不足:
1、我们在整个团队项目中。没有使用代码管理软件,这是一个潜在的弊端。因为没有使用代码管理软件的经验以及对应的条件。导致我们最后在进行代码整合的时候出现了一些滞后的情况,还有一个同学在进行代码调试的时候。在进行交流才发现,他使用的代码并非我提供的最新版本号,这是我们遇到的一个代码统一问题。尽管那同学后来自己建立了SVNserver,可是因为机器性能不足。以及IP问题,后来没能用起来,这个是不足之处。
2、因为没有团队合作的经验,在编写代码的时候。没有注重代码的排版以及代码凝视说明。在帮助对方调试代码的时候。发现差点儿没有什么凝视,对于类的成员函数或者是结构体的成员都没有必要的说明。这个对于阅读代码的人来说是一个非常痛苦的,而对于函数接口的说明更是缺乏必要的功能说明,以及输入參数以及返回值的说明。这个给阅读和理解程序的人来说造成了非常大的障碍。对于团队的合作效率来说是一个不小的弊端。
3、在拿到对方的代码的时候。没有大致浏览对方的代码,对别写的代码没有一个总体的把握,使得没有可以使用别人提供好的一些接口,而是自起炉灶,这对于时间上的耗费以及潜在的bug的产生都是有相当大的代价,这在一定程度也使得项目的进展滞后。
4、在项目开发过程中。除了必要的沟通之外。对于一些重要的任务的分配应该有一些对应的反馈机制,在我们的开发过程中,就出现了这样一个严重的问题,在我的算法设计部分里面。须要一些消息解析过程中提供必要的參数信息,因为我在编写算法模块的过程,我不清楚还有一个同学的消息解析的情况,因此我仅仅有预留必要的变量,然后由消息解析的同学来负责补充,对于这个任务,我当时在群里嘱咐过后。对方也给予确认答复。
然而,问题就在于,我没有在后期对这个任务的分配进行完毕度的确认,使得我们在临近截止日期才发现最后这一块该同学并没有完毕。使得我们到了最后一刻还在编写代码,调试bug,以至于没有预留出比較充分的时间来測试程序的情况。
5、在软件project里面一直强调的是。在开发过程。唯一不变的是需求是不断改变的。是的,在我们开发过程中,算法的更新也是一而再。再而三的发生。直到最后临近截止时间了,负责算法的同学还提出求改算法模块的要求,对于他的这个要求。一个比較稳妥的做法就是先让该同学把改动后的版本号完整描写叙述出来,然后再结合改动的难度以及剩余同意时间所能做的改动考虑是否进行最后的更新或者调整。
这样的情况下的更新调整对于负责编码的同学来说是一个相当大的挑战,一个是要在有限的时间里面高速做出响应。还有保证最后调整的代码不会出现严重的bug问题。网络上有个段子。描写叙述的就是这个现象。说一个产品经理被程序猿打是由于到了最后还要改动需求。
这次我遇到的情况也差点儿相同是如此,所以怎样非常好地应对需求变化是一个比較值得思考的问题。
因为以上几个不足,使得我们最后用来測试的时间差点儿没有,我们仅仅能提交能执行的代码完毕比赛。最后的结果怎样应该都是能够接受的。
结果也在6月5号出来了,非常可惜。这次的成绩不佳。
比赛的大概过程我看了一下。总体来分析的话。第一轮,我们第一局进展非常顺利。拿到了第一名的成绩,可是后面两场都由于超时次数过多被踢出去。可是勉强进了前4,进入了下一轮。可是到了第二轮之后。非常幸运的是。没有出现超时(0.5S给出答复消息)掉线的情况,当中,第一局,一開始的情况还不错,可是到了363局的时候,出现了我们手拿9对子,和别人的A对子加注厮杀,随后allIn,就挂了。这个有点可惜了。
而第二局的话,一開始的进展就不太顺利,拿了不怎么样的手牌也和对手叫板,而其它牌手都相当保守,弃牌居多,在这一局里面,我们到了第9局就挂了。第三局的话,我们排在第4。应该说是正常发挥。一開始我们是率先的。后来在256局就输了3K多。情况也是差点儿相同拿了KQ和别人的A对和K对叫板,然后接下来就開始处于劣势,到399我们就挂了。
我分析的情况大体上如此,最后的时间确实比較赶,赛前没有时间好好測測我们的程序,毕竟总体框架都搭建好了,剩下的就是算法的局部调整,因为没有多參加几次官方的PK来发现算法的潜在问题,这个还是比較遗憾的,只是大家都挺尽心尽力的。
通过对照赛结果和參赛过程的分析发现,对于超时问题,一个是能力上的不足,没有充分利用多线程,由于能力的不足所以做起来没有把握,因此操心出现多投入零产出的问题,另一个是团队合作上的进度问题。进度的滞后使得最后没有空余的时间做測试。没有可以最大程度发挥我们的算法模型,这是一个比較遗憾的事。在后面的学习过程。如果在竞争的过程中更注重的诸多问题。我希望下一次有一个显著的改善和收获。
版权声明:本文博主原创文章,博客,未经同意不得转载。
2015华为德州扑克入境摘要——软体project的更多相关文章
- 软体project(两)——软体project
每本书的第一章,都是在讲宏观的东西.软工也不例外.接下来.我们就要介绍软件project"是什么"的问题. 一.是什么? watermark/2/text/aHR0cDov ...
- 软体project(四)——一生
软件生存周期是软件project中的一个重要概念,把整个生存周期划分为若干个阶段,是实现软件生产project化的重要步骤. 软件的生存周期一般划分为软件计划.软件开发和软件执行三个时期,例如以下图: ...
- java和h5 canvas德州扑克开发中(二)
德州扑克网页源码在github上分享 https://github.com/lxr1907/pokers 感兴趣的可以上去看下. 1.通讯使用websocket,主要在message.js中. 2.用 ...
- java和h5 canvas德州扑克开发中(一)
先附上我的德州扑克测试地址 http://120.26.217.116:8080/LxrTexas/texasIndex.html 我和一个朋友的德州扑克历时一个多月开发,目前已经基本可玩. 前端主要 ...
- 德州扑克AI WEB版
继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信, ...
- 德州扑克AI实现 TexasHoldem Poker
参考了一下这篇文献,http://cowboyprogramming.com/2007/01/04/programming-poker-ai/ 自己用go实现了一个德州扑克AI,效果还可以. 正常和它 ...
- [swustoj 1088] 德州扑克
德州扑克(1088) 问题描述 德州扑克是一款风靡全球的扑克游戏.德州扑克一共有52张牌,没有王牌.每个玩家分两张牌作为“底牌”,五张由荷官陆续朝上发出的作为公共牌.开始的时候,每个玩家会有两张面朝下 ...
- 未来 USB Type-C 将可靠软体判断线材是否符合规定
USB Type-C 插头允许通过的电流和功率比过去常见的 USB 规范要大得多,因此从市面上「随便买一条」USB Type-C 的充电线的危险也同样大得多,毕竟不是所有的线材能承受的电流都一样,万一 ...
- Atitit.软体guibuttonand面板---通信子系统(范围)-- github 采用....
Atitit.软体guibuttonand面板---通讯子系统(区)-- github 的使用.... 1. 1.注冊账户以及创建仓库 1 2. 二.在GitHub中创建项目(create a new ...
随机推荐
- apk应用的反编译和源代码的生成
对于反编译一直持有无所谓有或无的态度.经过昨天一下午的尝试,也有了点心得和体会: 先给大家看看编译的过程和我们反编译的过程概图吧: 例如以下是反编译工具的根文件夹结构: 三个目录也实际上是下面三个步骤 ...
- dokcer 运行和进入容器
<pre name="code" class="html">docker:/root# docker run -itd --name zjtest8 ...
- Unity3D游戏开发之开发游戏带来的问题
昨日曾就某投资人把移动团队失败原因之中的一个归于选择Unity引擎进行了一番评论,工具本身无罪,但怎样理解工具.正确使用Unity引擎确实须要讨论,在选择Unity之前你也许须要了解下这个引擎实际开发 ...
- js关闭浏览器窗口事件
js关闭浏览器窗口 js关闭浏览器窗口,不弹出提示框.支持ie6+,火狐,谷歌等浏览器. <html> <head /> <body> <script typ ...
- CacheHelper工具类的使用
package com.bbcmart.util; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import ne ...
- ThinkPHP的连贯操作方法中field方法
ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段,下面详细道来. 1.用于查询 在查询操作中field方法是使用最频繁的. $Model ...
- WPF案例 (四) 模拟Windows7桌面任务栏
原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_2_建立开发环境
本文对应书本5.1.3的内容 书本中通过CVS下载的源码 但是笔者实践的时候发现无法下载...地址已经失效了(也许是笔者的失误输错地址所致) 可以用git下载 地址是: http://git.ecli ...
- hdu1260(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 分析:简单dp,dp[i]=min(dp[i-1]+a[i],dp[i-2]); #includ ...
- Python-方法重载的问题
定义一个父类,在写一个子类继承他,重载他的foo方法: class Father: def foo(self): print"I am father" class Son(Fath ...