2015华为软赛(四)——数据结构设计

来源:互联网 发布:applem2传奇引擎源码 编辑:程序博客网 时间:2024/06/04 14:08

点滴记录总结,一天一打鸡血。

2015年5月华为组织了一次软件精英挑战赛,赛题是德州扑克手牌AI~

环境及测试说明:http://pan.baidu.com/s/1dD2dL0P

代码质量在于数据结构,代码质量在于数据结构,代码质量在于数据结构!重要的事情说三遍!!!只是说它重要,细思恐极,说的好像设计出吊炸天的结构呢~事实不是这样的,但能有个数据结构还是很不错的。

首先预定义一些比较好记住的全局变量,方便后续操作:

//牌色,桃、杏、梅、方#define SPADES      0#define HEARTS      1#define CLUBS       2#define DIAMONDS    3//押注圈,上一节介绍过的-_-#define HOLD        0#define FLOP        1#define TURN        2#define RIVER       3//辨识出的牌型,九个,值越大,牌力越大#define HIGHCARD    1#define ONEPAIR     2#define TWOPAIR     3#define THREE       4#define STRAIGHT    5#define FLUSH       6#define FULLHOUSE   7#define FOUR        8#define STRAIGHTFLUSH 9

游戏会有很多信息,捻重要的关键的来定义一个己方游戏信息的结构体:

typedef struct GameInfo {    int     jetton;//筹码数    int     card[2];//手牌    int     call;//这次需要跟注的筹码数    int     total_call;//这一局总共跟了多少    char    s_blind[DATA_SIZE];//谁是小盲注    char    b_blind[DATA_SIZE];//谁是大盲注    int     players;//现在剩多少玩家在桌上    int     folds;//现在已经弃牌的玩家数    int     left;//剩余玩家数players-folds,冗余}GameInfo;

需要对手牌解释一下,看过一篇文章,可以将牌型按位存取,这样存取效率高,但是编码效率比较低。这里设计每张牌为一个整型变量a=29,那么它的花色为a/14=1,1==HEARTS,也就是红桃,它的大小为a%14=1, 那就是2,并不是A,A表示13。

碰到自己牌力比较大的情况,比如straigh,flush,full_house,four,straight flush等,可能的决策就是不管不顾或跟或加或all-in,这样有风险,尽管不太大,但是一旦对手更大,就被吊打。所以为提高稳定性,设计如下结构体:

typedef struct Four {    int     own;//自己有4,5张    int     com;//公牌有4,5张}Four;typedef struct Flush {    int     own;//4,5    int     com;//4,5}Flush;typedef struct Straight{    int     own;//4,5    int     com;//4,5}Straight;typedef struct CardType {    int     my_type;//1-9,牌型    Flush   f_card;    Straight s_card;    Four    four;    int     three;    int     pair[2];    int     high_card;//高牌}CardType;typedef struct  GameJetton{    int hold;//第一个押注圈押注总数    int flop;//第二个...    int turn;//第三个...    //这是用来计算每一圈投资总数,有第三圈就能算第四圈的总数了,所以没有river}GameJetton;

由于时间有限,就简单设计了这些个结构,效果还行,拓展性也可以,缺陷是不够全面和智能,这是最最最基本的东东了,没有这,没法往下走。
下一小节将介绍一些最最最基本的功能函数。

0 0
原创粉丝点击