Poker

扑克牌含义

  • 扑克牌全牌只有两色,红色代表白天,黑色代表夜晚。
  • 花色分4种黑红梅方代表春夏秋冬四季,每种花色13张代表一季13个星期, 共计52张牌代表全年52个星期。
  • 每种花色的13张牌的牌面值(1~13)加起来是91,每季也是91天。
  • J 代表武士(Jack)、Q代表王后 Quene、K代表国王 (King)、大王代表太阳、小王代表月亮。

扑克牌设计的一个中心原则是尽可能做到关于原点(图案中心)对称,即具有某种奇怪函数的特性。

  • 1-9的数字牌完美的左右对称,除左上角和右下角的数值外。
  • JQK 上下对称
  • 大小王 不对称
  • 方块牌 上下对称

使用16进制表示扑克

  • 牌值数据采用16进制
  • 每种花色13张
  • 16进制第一位表示花色
  • 16进制后两位转换为十进制表示面值点数

掩码

掩码十六进制十进制二进制
花色0xF02401111 0000
面值0x0F150000 1111

花色

花色数值
0方块
1梅花
2红桃
3黑桃
4

方块

4933701-a25db6dd164cdd73.png
方块
方块牌值十六进制十进制
20x022
30x033
40x044
50x055
60x066
70x077
80x088
90x099
100x0A10
J0x0B11
Q0x0C12
K0x0D13
A0x011

梅花

4933701-369eb28acdac3596.png
梅花
梅花牌值十六进制十进制
20x1218
30x1319
40x1420
50x1521
60x1622
70x1723
80x1824
90x1925
100x1A26
J0x1B27
Q0x1C28
K0x1D29
A0x1117

红桃


4933701-fc065c0fe3342051.png
红桃
红桃牌值十六进制十进制
20x2234
30x2335
40x2436
50x2537
60x2638
70x2739
80x2840
90x2941
100x2A42
J0x2B43
Q0x2C44
K0x2D45
A0x2133

黑桃

4933701-2f388342041b1712.png
黑桃
黑桃牌值十六进制十进制
20x3250
30x3351
40x3452
50x3553
60x3654
70x3755
80x3856
90x3957
100x3A58
J0x3B59
Q0x3C60
K0x3D61
A0x3149

鬼牌

鬼牌牌值十六进制十进制
大鬼0x4E78
小鬼0x4F79

ES实现扑克牌的数据结构

/**扑克牌型判断逻辑 */
export default class PokerLogic{
    constructor(){
        //操作掩码
        //花色掩码
        this.mask_color = 0xF0;//1111 0000
        //数值掩码
        this.mask_value = 0x0F;//0000 1111
        //扑克牌值数据采用16进制,每种花色13张 16进制第一位表示花色 16进制后两位转换为十进制表示点数
        this.card_data = [
            //0方块: 2 3 4 5 6 7 8 9 10 J Q K A
            0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x01,
            //1梅花: 2 3 4 5 6 7 8 9 10 J Q K A
            0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x11,
            //2红桃: 2 3 4 5 6 7 8 9 10 J Q K A
            0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x21,
            //3黑桃: 2 3 4 5 6 7 8 9 10 J Q K A
            0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x31,
            //4鬼:大鬼 小鬼
            0x4E, 0x4F
        ];
    }
    //获取扑克数值
    getValue(number){
        const data = this.getData(number);
        //满足牌值定义做一个偏移
        return data & this.mask_value;
    }
    //获取扑克花色
    getColor(number){
        const data = this.getData(number);
        return (data & this.mask_color) / 16;
    }
    /**将服务器扑克数据转换为客户端的扑克数据 */
    getData(number){
        if(number>0 && number<=this.card_data.length){
            return this.card_data[number - 1];
        }
        return 0;
    }
    /**将客户端扑克牌数据转换为服务器 */
    getNumber(data){
        const suit = (data & this.mask_color)/16;//花色
        const rank = (data & this.mask_value);//数值
        //四花色无鬼
        if(suit>=0 && suit<=3){
            if(rank>=1 && rank<=13){
                return (suit-1)*13 + rank;
            }
        }else if(suit==5 && (rank==1 || rank==2)){
            return (suit-1)*13 + rank;
        }
        return 0;
    }
}

TS实现扑克牌逻辑的数据结构

/**
 * 扑克牌牌型逻辑 
 * 客户端使用十六进制,服务端使用索引值
 * */
export default class Poker{
    //花色掩码 十进制 240
    public MASK_SUIT:number = 0XF0;
    //数值掩码 十进制 15
    public MASK_RANK:number = 0X0F;
    //扑克数据 十六进制
    public data:number[] = [
        //花色3 黑桃2~A 十进制 50 51 52 53 54 55 56 57 58 59 60 61 49
        0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39,0X3A,0X3B,0X3C,0X3D,0X31,
        //花色2 红桃2~A 十进制 34 35 36 37 38 39 40 41 42 43 44 45 33
        0X22,0X23,0X24,0X25,0X26,0X27,0X28,0X29,0X2A,0X2B,0X2C,0X2D,0X21,
        //花色1 梅花2~A 十进制 18 19 20 21 22 23 24 25 26 27 28 29 17
        0X12,0X13,0X14,0X15,0X16,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,0X11,
        //花色0 方块2~A 十进制 2 3 4 5 6 7 8 9 10 11 12 13 1
        0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X01,
        //花色4 大小鬼 十进制 78 79
        0X4E,0X4F
    ];
    //构造器
    public constructor(){}
    //根据面值排序 从大到小
    public sortByRank(data:number[]):void{
        let self:Poker = this;
        data.sort((prev, next)=>{
            if(self.getRank(prev) > self.getRank(next)){
                return -1;
            }else if(self.getRank(prev) < self.getRank(next)){
                return 1;
            }else{
                return 0;
            }
        });
    }
    //根据花色排序 从大到小
    public sortBySuit(data:number[]):void{
        let self:Poker = this;
        data.sort((prev, next)=>{
            if(self.getSuit(prev) > self.getSuit(next)){
                return -1;
            }else if(self.getSuit(prev) < self.getSuit(next)){
                return 1;
            }else{
                return 0;
            }
        });
    }
    //根据值获取牌数据
    public getItemByRank(data:number[], rank:number):number{
        for(let i:number=0; i<data.length; i++){
            if(this.getRank(data[i]) == rank){
                return data[i];
            }
        }
        return 0;
    }
    //获取数值 1~13
    public getRank(index:number):number{
        let val = this.getItem(index);
        return val & this.MASK_RANK;
    }
    //获取花色 0~5
    public getSuit(index:number):number{
        let val = this.getItem(index);
        return (val & this.MASK_SUIT) / 16;
    }
    //将服务器传递过来的扑克索引数据转换为客户端使用的值
    public getItem(index:number):number{
        if(index>0 && index<=this.data.length){
            return this.data[index-1];
        }
        return 0;
    }
    //将客户端扑克面值转换为服务器所使用的索引值
    public toServer(val:number):number{
        //计算花色
        let suit = (val & this.MASK_SUIT) / 16;//0方块 1梅花 2红桃 3黑桃 4大小鬼
        //计算数值
        let rank = val & this.MASK_RANK;//1到13
        //花色判断
        if(suit>=0 && suit<=3){
            //判断面值
            if(rank>=0 && rank<=13){
                return (suit-1)*13 + rank;
            }
        }
        //大小王
        if(suit==5 && (rank==1 || rank==2)){
            return (suit-1)*13 + rank;
        }
        return 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值