>[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. 如果玩家點胡牌,結算結果