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

8 篇文章 0 订阅
5 篇文章 0 订阅

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

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;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值