麻将算法(二)牌型转换以及接牌

来源:互联网 发布:java怎么用hadoop 编辑:程序博客网 时间:2024/04/30 13:48
  public static int[] Cards =
                {
                    0x01,  0x02,  0x03,  0x04,  0x05,  0x06,  0x07,  0x08,  0x09,//万
                    0x01,  0x02,  0x03,  0x04,  0x05,  0x06,  0x07,  0x08,  0x09,//万
                    0x01,  0x02,  0x03,  0x04,  0x05,  0x06,  0x07,  0x08,  0x09,//万
                    0x01,  0x02,  0x03,  0x04,  0x05,  0x06,  0x07,  0x08,  0x09,//万
                    0x11,  0x12,  0x13,  0x14,  0x15,  0x16,  0x17,  0x18,  0x19,//条
                    0x11,  0x12,  0x13,  0x14,  0x15,  0x16,  0x17,  0x18,  0x19,//条
                    0x11,  0x12,  0x13,  0x14,  0x15,  0x16,  0x17,  0x18,  0x19,//条
                    0x11,  0x12,  0x13,  0x14,  0x15,  0x16,  0x17,  0x18,  0x19,//条
                    0x21,  0x22,  0x23,  0x24,  0x25,  0x26,  0x27,  0x28,  0x29,//筒
                    0x21,  0x22,  0x23,  0x24,  0x25,  0x26,  0x27,  0x28,  0x29,//筒
                    0x21,  0x22,  0x23,  0x24,  0x25,  0x26,  0x27,  0x28,  0x29,//筒
                    0x21,  0x22,  0x23,  0x24,  0x25,  0x26,  0x27,  0x28,  0x29,//筒
}


        private const int MASK_COLOR = 0xF0; //花色掩码
        private const int MASK_VALUE = 0x0F; //数值掩码


继上个章节之后,洗完牌后将牌堆做了一个新的排序,每次接牌的时候只需要按照牌堆的顺序依次接收即可,牌堆中的索引与牌值并没有相互对应:例如索引0代表的时一万,索引9代表的也是一万,


因此我们需要做一个将牌堆中的值转化为手牌中索引的方法,和索引转化为牌值的方法:
//(索引->牌值) 的核心代码:
//
//
        public static int IndexSwitchToCard(int index)  //(索引->牌值) 
        {
            int value = 0;
                value = ((index / 9) << 4) | (index % 9 + 1);
            return value;
        }
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
//(牌型->索引) 的核心代码:
//
//
     public static int SwitchToCardIndex(int _cardValue)  //(牌型->索引)  
        {
            CardsOfIndex = ((_cardValue & MASK_COLOR) >> 4) * 9 + (_cardValue & MASK_VALUE) - 1;
            return CardsOfIndex;
        }




对牌值转化为索引进行验证:
(一)假设传进的牌值为:0x11;(他对应手牌的索引为9)
(二)_cardValue & MASK_COLOR得到0x10再降其向右移动四位得到结果为0001,再乘9得到结果为:1001;
(三)_cardValue & MASK_VALUE得到0x01:0001再减去1得到0,和(二)相加后得到9。得以验证;


下面进行发牌的方法,打过麻将的都知道在第一次接牌的时候每个人手中的牌数为13张附上代码:


   public static int[] Dealcard(int[] cbCardIndex)    //这个是第一次发牌的方法,一人接13张牌cbCardIndex返回一个手牌的索引
        {
            for (int i = 0; i < 13; i++)
            {
                int value = Cards[IndexIncard];
                int index = SwitchToCardIndex(value);
                cbCardIndex[index]++;
                IndexIncard++;
            }
            return cbCardIndex;
        }


只有庄家手中的会多接一张牌,再附上单个接牌的方法,这里返回的时接收到的那张牌索引
    public static int GetCard(int[] cbCardIndex)   //这个是接牌的方法
        {
            int value = Cards[IndexIncard];
            int index = SwitchToCardIndex(value);
            cbCardIndex[index]++;
            IndexIncard++;
            return index;
        }
原创粉丝点击