德州扑克和短牌的算法分析

算法分析

Posted by chensong on 2019-06-27 21::17::22

前言

最近由于公司的业务的扩展 增加短牌玩法, 这个短牌算法我在github上找很长时间都没有找到开源了。 最后我只能自己写短牌的算法,说的挺哄人的其实我也是有参考德州扑克的算法的。

正文

一, 分析扑克数据

1, 一张牌在内存怎么存放的

红桃A是放在int类型中 int是32字节内存存放

高16存放牌的大小   |颜色|牌的值|低8位存放牌映射数的大小
0000 0000 0000 0001 1000 1101 0010 1001

存放数据的


static const int32 ECOLOR[4] = { 0x8000, 0x4000,0x2000, 0x1000 };
static const int32 EHEX = 0x10;  // 0000 0000 0000 0000 0000 0000 0001 0000 ---> 16
// 短牌花色 保存位置 偏移量
static const int32 ECOLOR_OFFSET = 0x08;
int32 n = 0;
for (int32 i = 0; i < ESTART; ++i)
{
	for (int32 j = 0; j < EEND; ++j, ++n)
	{
		deck[n] = CPRIMES[j] | (j << ECOLOR_OFFSET) | ECOLOR[i] | (1 << (EHEX + j));
	}
}

高16位是计算出 同花顺和同花, 顺子和高牌使用的

低8位是计算出还有其它的牌的数据

2, 所有牌型是从大到小排序的

所有牌型都是唯一的值 这个就对应一个映射表 和加密算法一样的有一个专门的表

二, 算法分析

1, 扑克中是没有花色的区分的

唯一在有花色就是同花顺, 这个在 位操作符就可以区分是同花还是不是同花的

扑克中都是对应唯一值的

2, 高16位

顺子

0000 0000 0000 0001 
0000 0000 0000 0010
0000 0000 0000 0100
0000 0000 0000 1000
0000 0000 0001 0000

高牌

0000 0000 0000 0001 
0000 0000 0000 0010
0000 0000 0000 0100
0000 0000 0000 1000
0000 0000 1000 0000

是判断5张牌是否是顺子还是高牌

但是唯一的值

3, 低8位(数论知识的质数的运用)

有一个规律 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41] 相乘的值都是唯一值

上面2、3、5 等等 都是质数所以相乘的是肯定是唯一的


3, 排序

得到所有牌型

按照牌类型排序

算法实现的地址

结语