>[danger]游戏开始后,房间的游戏数据表保存在缓存中,缓存格式为S(‘game_roomid’)
game_roomid缓存格式为
```
[
'room'=>['groupUid'=>10,'groupId'=>10,'roomGroup'=>'888888','roomId'=>10,'gameNum'=>8,'currentNum'=>1,'groupName'=>"亲友圈名称",gameId=>1,number=>1,groupName=>'亲友圈名称','gameSign'=>"Points"],
'config'=>['players'=>4],//游戏玩法
'user'=>[
'1'=> ['userSign'=>'username1','nickName'=>'昵称','headImg'=>'img/headImg.jpg','p'=>1],
'2'=> ['userSign'=>'username2','nickName'=>'昵称','headImg'=>'img/headImg.jpg','p'=>2],
'3'=> ['userSign'=>'username3','nickName'=>'昵称','headImg'=>'img/headImg.jpg','p'=>3],
'4'=> ['userSign'=>'username4','nickName'=>'昵称','headImg'=>'img/headImg.jpg','p'=>4],
],
'point'=>['1'=>0,'2'=>0,'3'=>0,'4'=>0],//游戏积分
'ready'=>['1'=>1,'2'=>1,'3'=>1,'4'=>1],//记录那个用户已经准备好
'drawing'=>['1'=>0,'2'=>0,'3'=>0,'4'=>0],//听牌记录
'cards'=>[],//底牌
'cardRecord'=>['1'=>[] ] ,
'handCards'=>['1'=>['cards'=>[],'M3'=>['104'=>1],'M4'=>[],'M5'=>[] ] ,'2'=>[] ,'3'=>[] ,'4'=>[] ],//手牌
'game'=>['banker'=>1,'discard'=>102,'userDiscard'=>2,'userWait'=>['cards'=>101,'type'=>1],'chess'=>104,'userChess'=>3],
'dissolve'=>['userDissolve'=>2,'user'=>['1'=>1] ],游戏解散记录
'isopen'=>0,游戏是否开始
]
```
数组说明,以上数组为一个游戏桌上的用户,
>[info]room:游戏中房间的信息
groupUid:群主的用户id
groupId:房间所在的群组id
roomGroup:游戏房间中,房间所在的亲友圈群号
roomId:游戏房间中,房间id
gameNum:游戏房间中,游戏的总局数
currentNum:游戏房间中,游戏当前的局数
groupName:亲友圈名称
number:亲友圈的桌号
gameId:游戏id
gameSign:游戏标识
>[info]config:游戏中房间的配置
players:游戏人数
>[info]user:房间的用户信息
user的key值为用户的位置
userSign:用户唯一标识,可以id也可以是用户名,或者其它
nickName:用户昵称
headImg:用户头像图片
p:中用户所在的位置
>[info]point:用户的积分
point的key值为用户的位置
point的值为用户的积分
>[info]cardRecord:每个用户出牌的记录
cardRecord的key值为用户的位置
point的值为用户出牌的牌值
>[info]drawing:听牌记录
drawing的key值为用户的位置
drawing的值为0表示没有听牌,如果为数组表示已经听牌,数组为听牌后要胡的牌
>[info]ready:用户准备的记录
ready的key值为用户的位置
ready的值为当前的游戏局数,表示已经准备
>[info]cards:游戏底牌,为数组,值为牌值
>[info]handCards:用户的手牌
handCards的key值为用户的位置
handCards的值是一个数组
cards:手牌的可以打出的牌
M3:已经碰了牌,格式数组 ['104'=>1]
M4:明杠的牌,格式为['104'=>1]
M5:暗杠的牌,格式为['104'=>1]
M3,M4,M5的key为点碰杠的牌值,值为点牌人的位置
>[info]game:游戏的中动作的记录
banker:当前游戏的庄家
discard:当前游戏最后一次所出的牌
userDiscard:当前游戏最后一次出牌的用户位置
chess:当前游戏最后一次出牌后,另外一个人所起的牌值
userChess:当前游戏最后一次出牌后,起牌人的位置
userWait:当前游戏最后一次出牌后,是否有人碰或者杠或者胡牌,如果有保存的为等待操作的用户的位置
```
//userWait数组
[
'cards'=>101,
'type'=>1//1:有人胡牌,2有人听牌,3别人出牌有人杠,4有人碰牌,5自己摸牌杠
'p'=>1//用户在桌上的位置
]
```
>[info]dissolve:游戏解散记录
userDissolve:发起解散的用户位置
user:点击同意和拒绝的记录,key值为用户位置,值不为真表示没点击按钮,为1表示同意解散,为2表示拒绝解散
userDissolve 发起解散用户的位置 p
time 发起解散游戏的时间戳
timer 定时器id
>[danger]游戏流程描述
>第一步:会员进入房间时
1. 判断当前游戏桌是否人满,判断方式:config['players']与count(user)比较,如果游戏人满,提示游戏满员
2. 如果游戏没有满员,获取桌子无人位置,$P
3. 写如会员信息 $user[$P]=[用户信息]
4. 设置用户积分$point[$P]=[默认积分]
5. 设置用户准备标识 $ready[$P]=$room['currentNum']
6. 设置庄家,开始为第一个进入游戏的人 $game['banker'] = 1
7. 通过 $config['players'] <= count($user)比较, 达到开始游戏的人数游戏就开始
>第二步:开始游戏
1. 生成游戏底牌
2. 开始发牌,将牌写入到$handCards[$P]中
3. 给庄家多发一张牌
>第三步:开始出牌
1. 判断是否轮到玩家出牌以及手中是否存在该张手牌
2. 出牌玩家出牌后,销毁当前玩家手牌
3. 将打出的牌放入到$cardRecord[$P]出牌记录中
4. 更新 $game['userWait'] = 0,更新$game['discard'],$game['userDiscard']出牌用户信息,更新起牌用户信息的记录$game['chess']=0,$game['userChess']=0
5. 如果牌值大于5,检测听牌的玩家是否点炮,检测是否有杠,检测是否有碰
6. 如果有点炮,杠,碰的,更新 $game['userWait'] = $P
7. 如果没有 点炮,杠,碰,下一位玩家起牌
>第四步:玩家起牌
1. 销毁并获取底牌的最前边一张牌,插入到当前用户的手牌中$handCards['cards'][]
2. 更新 $game['userWait'] = 0,更新$game['discard']=0,$game['userDiscard']=0出牌用户信息,更新起牌用户信息的记录$game['chess'],$game['userChess']
3. 判断是否听牌杠牌
4. 如果没有,直接进入出牌阶段
>第五步:听牌
1. 如果有听牌更新 $game['userWait']=$P
2. 如果玩家点击[过],更新$game['userWait'] = 0
3. 进入下一家玩家起牌阶段
4. 如果点听牌,进入听牌阶段,设置$drawing[$P]=[]
5. 然后出牌,进入出牌阶段
>第六步:碰牌
1. 如果玩家点击[过],设置$game['userWait'] = 0
2. 进入下一家摸牌阶段
3. 如果玩家点碰,销毁手牌中的2张牌,在$handCards[$P]['M3']=['104'=>$P]
4. 更新$game['userWait'] = 0,更新$game['chess'],$game['userChess'],更新$game['discard']=0,$game['userDiscard']=0
5. 进入出牌阶段
>第七步:杠牌
1. 如果玩家点过 ,设置$game['userWait'] = 0
2. 进入下一家玩家摸牌阶段
3. 如果玩家点杠,销毁手中3张牌,或者将碰转换成杠
4. 更新$game['userWait'] = 0,更新$game['chess'],$game['userChess'],更新$game['discard']=0,$game['userDiscard']=0
5. 进入出牌阶段
>第八步:胡牌
1. 如果玩家点过,设置$game['userWait'] = 0
2. 进入下一家摸牌阶段
3. 如果玩家点胡牌,结算结果