现在还没有开始写代码,因为任务显然比较艰巨,还是先理一下思路比较好。
首先,一手牌一共分成九个等级(0:highcard散牌,1:pair对子,2:twopairs两对,3:three三条,4:straight顺子,5:flush同花,6:fullhouse葫芦,7:four四条,8:straightflush同花顺)。对于不同等级之间的比较是编号大的赢。
其次,对于同一等级之间的比较大致可以分为四种。1、顺子,同花顺(比最大的)。2、散牌,同花(一张张比)3、对子,两对(这个比较麻烦)。4、三条,葫芦,四条(比“主牌”)。第三种比较分成二步其实也不难。
再是怎么样区分出九个等级呢?可以这样考虑:假设现在桌子上有13个凹槽(2-14编号)分别与13张牌面相对应。我们把一手牌(五张)放到对应编号的槽里面。那么如果我们扫描一遍所有的槽并分别记录每个槽里面牌的数量(略去0),就会出现六种情况(顺序方面可以是任意的):1、11111(对应等级编号0、4、5、8)。2、1211(对子)。3、212(两对)。4、131(三条)。5、32(葫芦)。6、14(四条)。我们再扫描一遍刚才扫描的结果,记录最大数量和牌种类的数量。1、11111(1,5)。2、1211(2,4)。3、212(2,3)。4、131(3、3)。5、32(3、2)。6、14(4、2)。这样就区别开这六种情况了。
“11111”情况对应“散牌”“顺子”“同花”“同花顺”还需要再区分,设置两个标记,一个表示是否为“顺子”(1是0不是)一个表示是否为“同花”(1是0不是)。这样00表示“散牌”01表示“同花”10表示“顺子”11表示“同花顺”。
“同花”很容易判断。
“顺子”可以这样判断:因为事先已经确定这是孤张牌了(11111),所以只要最大值和最小值的差为4(一共五张牌)就一定是“顺子”反之则不是。
“221”和“2111”比较麻烦。可以先进行qsort排序(一共只有五张牌qsort对数量小于8的数组排序是非常快的)把值相同的牌变成相邻的牌,从中选择出对子进行比较,最后比较剩下的牌。
一个半小时过去了......(code)