华为软件大赛之德州扑克

    昨天把结果提交了,一下又感觉没啥事了,这两周把所有的时间在用着参与华为软件精英挑战赛了(好久没科研了啊)。这里总结一下本次比赛一些经验吧!

    5月十几 了才知道了这个比赛,然后就在官 注册了一下, 了个名,然后抱着试一试的想法写写代码,看自己究竟能写到什么程度。

名后遇到的第一个困难是:

(1)软件环境的配置。

       一说到编写软件,自己以为就是在VS底下编编程序,调试调试!看来是tooyoungtoosimple了!首先下载了程序设计任务一看,原来要在Linux下编程啊。这个东西只是听过,可是一点都没用过啊。心想不管了,还是试一试下吧。

  本次比赛用的ubuntu,系统都是官方给提供的。然后自己下载了虚拟机vitural box,将官方给的系统装好。其实也是蛮简单的,照着官方的开发调试指南一步一步来就可以了。

环境配置好后,就开始编程了,第二个困难是:

(2)Socket 通信

     这次比赛任务是一个德州扑克的牌手AI,服务器是主办方给定的,每个player与sever的信息交换是通过TCP socket通信进行的。一个这个socket通信,又完全不懂,然后就开始查有关socket通信的知识。

     SOCKET通信有两种模式,TCP和UDP。 基于TCP 的通信是一种可靠的通信,它在服务器和客户端直接建立一个通信链路,在服务器和客户端直接进行可靠的信息传输,这样带来的一个问题就是传输效率低,因为很多时候链路是空闲的。UDP 是用户数据 协议,它将用户数据进行打包,在需要传输的时候才建立连接。本次比赛需要每个player和sever之间进行可靠的通信,采用的是TCP协议。

了解了SOCKET通信的一些基本知识后就着手开始编程了,想着通信这块应该不是考查重点,就是在 上找各种模板代码。不过最好还是在贴吧里找到了socket通信的C代码了。过程就是首先创建一个socket,然后通过它给服务器发送注册消息,注册好以后就可以收到服务器发来的消息了。

(3)解包

  通信建立,游戏开始后,就可以收到服务器发送来的消息了。消息的传输都是文本模式的。

接下来的任务就是解析消息包了:由于数据包有开始的包头和包尾(一样的)。当buffer receive 到消息后,首先通过sscanf读取包头(有相关机制确定其不可能从包的中间开始),去掉包头,通过strstr函数查找与包头相同的包尾。确定包尾指针后,就可以确定包的内容,然后将其读取出来。

解包过程中,还遇到的两一个问题就是粘包。开始一直没有看到粘包的现象,可以发现程序跑一段时间后,就掉线了,刚了buffer的相关消息后,发现确实有粘包现象(还剩两三天时候,才决定处理粘包的,唉,以后有什么需要解决还剩开始就赶紧解决,赶紧问题躲是躲不掉的,只能迎面而上)。

   粘包的处理机制是:首先创建一个buffer一样大的空间,然后将buffer中的内容全部拷贝到该空间中,清空buffer,然后解包,解完第一个包后将剩余消息再复制到buffer里,重新解包。待所有消息都解完后,重新利用buffer接收服务器来的消息。如何剩余的消息不是一个完整的消息包,则将剩余的消息存储到buffer继续接收消息。(刚开始是每次只解一个包,将剩余的消息放到buffer里继续接收消息,这样发现当有一个粘包后,buffer每次都不是空的,并且积累的包也会越来越多,老是导致掉线)。

(4)segmentation fault

   这个问题困扰了两天,检查了所有的数组发现没有越界的。最后,尝试把所有动态分配内存的都改成了固定大小数组,然后问题就解决了。(所以,最后也不知道咋回事,还是少用动态分配内存吧,悲)。

(5)赌博

   比赛就是不同的player程序相互pk,可见程序最关键的部分是赌博策略算法(这应该是考查的重点吧)。这部分我就不说了,感觉自己就写了个比官方的葫芦娃稍微聪明点的葫芦娃。(稍微搜了下,有这方面的相关论文,德州扑克的)

   知道有这个比赛的时间比较晚,所以准备比较仓促,刚开始就抱着试一下的想法,结果写出来的程序能跑通就不错了。大神们勿喷啊!!!

博客写的还是比较乱,继续提高!!!

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年5月1日
下一篇 2015年5月1日

相关推荐