点滴记录总结,一天一打鸡血。
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;
由于时间有限,就简单设计了这些个结构,效果还行,拓展性也可以,缺陷是不够全面和智能,这是最最最基本的东东了,没有这,没法往下走。
下一小节将介绍一些最最最基本的功能函数。