麻将牌值的算法有很多方法,主要看前后端的统一,这里我采用了一种比较程序的算法,一看就懂。
牌对应的十进制牌值,服务器发送16进制的牌值,我们读取到的是十进制的数值,下面是16进制和十进制的对应表:
万:1- 9
筒:17 - 25
条:33 - 41
东南西北:49 - 52
中发白:65 - 67
local arr = {
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, //1 - 9 万
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //1 - 9 筒
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //1 - 9 条
0x31, 0x32, 0x33, 0x34, //东西南北
0x41, 0x42, 0x43
}
type:
万:0
筒:1
条:2
东南西北:3
中发白:4
现在定义好了牌值规则,接下来就是算牌型和牌值了
这里涉及到了运算符的 & 和 >> 运算
local cardType = (value & 0xF0) >> 4
local cardValue = (value & 0x0F)
先看牌型:
0x11二进制是 0001 0001
0xF0二进制是 1111 0000
&运算后 0001 0000
右移4位 0000 0001
得到的值(十进制)是:1
对应的type是筒
以此类推0x01 - 0x09 得到的type是:0
以此类推0x11 - 0x19 得到的type是:1
以此类推0x21 - 0x29 得到的type是:2
牌值:
0x11二进制是 0001 0001
0x0F二进制是 0000 1111
&运算后 0000 0001
根据上面0x11算出的牌型是:1(筒)
那就知道了0x11是:0000 0001筒
转成10进制就是:1筒
0x15二进制是 0001 0101
0x0F二进制是 0000 1111
&运算后 0000 0101
转成十进制是:5
0x15是:5筒
网友评论