炸金花绝对大小计算、比较及排序算法(Java),包含花色参与和不参与大小比较

作者LeonXtp
转载请标明出处:
http://blog.csdn.net/zyzhehe/article/details/53858436
本文简书地址:
http://www.jianshu.com/p/04a4831cb2ab

昨日忽生兴趣,想起同事正在玩的一个炸金花游戏,见他们讨论略有激烈,想来蛮有趣,于是自己也写来玩玩。
因有要一次产生很多副牌的需求(可能上1000),要对所有的玩家进行一个排序,因此考虑一个能得到每幅牌的绝对大小的统一算法。

我有王炸


牌大小计算算法

花色不参与大小比较:
  • 首先对到手的牌按照牌数字按照由大到小排序
  • 牌大小按照牌型分级
  • 对于普通牌型,每张牌视为16进制的一个数,A对应14,2对应2,以此类推。牌值即为这幅此16进制牌的大小。
    比如最大的普通牌为AKJ,其16进制数值为AKJ=14x16x16+13x16+11=3803
  • 对于对子,先将对子放在牌的前两位,则在最大普通牌大小的基础上,加上对子牌的本身大小。 对子的本身大小计算方法:比如最大的对子为AAK,则AAK=14x16+13=237,加上最大的普通牌值3803,即为4040
  • 对于顺子,取最小的那个数,加上最大的对子牌值,比如最大的顺子AKQ=12+4040=4052。最小的顺子A32,A取1,值4041
  • 对于同花,先按照普通牌型计算大小,再加上最大的对子牌值。
    比如最大的同花AKJ=3803+4052=7855
  • 对于同花顺,取最小的那个数,加上最大的同花牌值,比如:
    AKQ=12+7855=7867,最小的同花顺A32,A取1,A32=1+7855=7856
  • 对于炸弹,取第一个数,加上最大的同花顺牌值。
    比如AAA=14+7867=7881
花色参与大小比较:
  • 比较规则:在牌数字完全一样的情况下,从最大的牌开始比较,黑桃>红桃>梅花>方片,遇到一个较大的,则结束比较。如:红桃A+红桃Q+方片3>梅花A+黑桃Q+黑桃3。如遇顺子时,数字3最大,从3开始比较花色。
  • 花色值设定:黑桃=3红桃=2梅花=1方片=0。
  • 牌值计算原理:在上面花色不参与大小比较算法的基础上,增加对每副计算出来的牌值乘以64再加上对三张牌花色按照4进制进行花色值计算作为附加值。比如:不考虑花色时,红桃6+方片4+方片2的值为6x256+4x16+2=1602,考虑花色时,红桃+方片+方片对应的4进制就是200,其10进制值为32,然后这副牌的牌值即为:1602x64+32=102560。为什么乘以64?因为三个花色4进制值的范围为63~0。乘以64,就是把原来每组牌值大小相邻的牌型拉开63个的间隔,以便于让花色值有发挥的空间哈哈,用来区别数字完全相同但花色不同的牌型。
  • 如果是炸弹,先将炸弹按花色从大到小排序,保证比如黑桃A红桃A方片A会>红桃A梅花A方片A
如此,就可得对所有的牌值进行了统一的大小计算

代码实现

主要分为四个模块
- entity 实体
- player provider 发牌器
- typevalue 牌型识别
- calculator 计算器,提供不同方式的计算方法

实体类

Card 单张牌

/**
 * 单张牌
 * 
 * @author Leon
 *
 */
public class Card {
   

    public static final int FLOWER_SPADE = 3;// 黑桃
    public static final int FLOWER_HEART = 2;// 红桃
    public static final int FLOWER_CLUB = 1;// 梅花
    public static final int FLOWER_DIAMOND = 0;// 方片

    public static final int NUM_A = 14;
    public static final int NUM_K = 13;
    public static final int NUM_Q = 12;
    public static final int NUM_J = 11;
    public static final int NUM_10 = 10;
    public static final int NUM_9 = 9;
    public static final int NUM_8 = 8;
    public static final int NUM_7 = 7;
    public static final int NUM_6 = 6;
    public static final int NUM_5 = 5;
    public static final int NUM_4 = 4;
    public static final int NUM_3 = 3;
    public static final int NUM_2 = 2;

    // 单张牌大小
    private int number;
    // 花色
    private int flower;

    public Card() { }

    public Card(int flower, int number) {
        this.flower = flower;
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值