多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[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. 如果玩家点胡牌,结算结果