我在这里写了一篇关于这个主题的文章。使用字符串是一个非常糟糕的主意。整数更好,最好的使用顺序是把花色放在低位,即使用顺序 2c, 2d, 2h, 2s, 3c, 3d, ... Ks, Ac, Ad, Ah, As . 这样,您甚至不必分开军衔和西装来进行数学计算。那么,手只是整数数组。有了这种表示,我可以在几分钟内完成数十亿手牌。我的库中计算二十一点手牌总数的函数如下所示(OJ_CARD 宏扩展为一个整数常量,因此比较速度很快):
int ojb_total(const oj_cardlist_t *sp) {
int i, c, t = 0, ace = 0, soft = 0;
for (i = 0; i < sp->length; ++i) {
c = sp->cards[i];
if (c >= OJ_CARD(OJR_ACE, OJS_CLUB)) {
ace = 1;
++t;
} else if (c >= OJ_CARD(OJR_TEN, OJS_CLUB)) {
t += 10;
} else {
t += OJ_RANK(c) + 2;
}
}
if (ace && t < 12) {
t += 10;
soft = 1;
}
return soft ? -t : t;
}
那来自一个通用的纸牌模拟库,它非常快,但如果我真的想要从没有其他任何作用的二十一点模拟中获得球到墙上的速度,我根本不会代表纸牌,而只是有一个“一副{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10}的多个副本,并从中处理。