/// <summary> /// 服务端接收到计算机系协议 /// </summary> /// <param name="msgBase"></param> public void ProcessComputerScience(MsgComputerScience msg) { int paiIndex = msg.paiIndex; //牌在这个玩家的索引 int id = msg.id; //出牌的玩家id doSkillTime[msg.id]++; msg.canSkill = doSkillTime[msg.id] < maxSkillTime[msg.id] ? true : false; Broadcast(msg); MsgChuPai msgChuPai = new MsgChuPai(); msgChuPai.id = msg.id; msgChuPai.paiIndex = msg.paiIndex; Broadcast(msgChuPai); if (paiIndex == -1) { //服务端执行胡的操作,清空数据,写入数据库等 Over(msg.id, false); return; } int paiId = paiManager.ChuPai(paiIndex, id); MsgFaPai msgFaPai = new MsgFaPai(); turn = (turn + 1) % 4; msgFaPai = ProcessMsgFaPai(msgFaPai); //广播 Broadcast(msgFaPai); }
public MsgFaPai ProcessMsgFaPai(MsgFaPai msg) { msg.id = turn; msg.turnNum = turnNum; msg.canSkill = doSkillTime[turn] < maxSkillTime[turn] ? true : false;//表示对于当前玩家能否使用技能 turnCount++; if (turnCount % 4 == 0) { turnCount = 0; turnNum++; }//判断下一次出牌是在第几轮 int paiIdx = paiManager.FaPai(turn); if (paiIdx == -1) { //没牌了,结束游戏 Over(-1, false); } msg.paiId = paiIdx; if (paiManager.HasHu(turn)) { msg.isHu = true; } else { msg.isHu = false; } //广播 return(msg); }
public static void MsgFaPai(ClientState c, MsgBase msgBase) { MsgFaPai msg = (MsgFaPai)msgBase; Player player = c.player; if (player == null) { return; } Room room = RoomManager.GetRoom(player.roomId); if (room == null) { return; } GameManager gameManager = room.gameManager; if (gameManager == null) { return; } msg = gameManager.ProcessMsgFaPai(msg); //广播 gameManager.Broadcast(msg); }
/// <summary> /// 服务端接收到吃碰杠的协议,将本轮吃碰杠的结果进行广播,同时将服务端的牌进行同步 /// 如果本轮没有进行吃碰杠,就轮到下一个玩家判断 /// 如果有人进行了吃碰杠,就轮到下一个人进行发牌 /// </summary> /// <param name="msgBase"></param> public void ProcessChiPengGang(MsgChiPengGang msg) { Broadcast(msg);//对得到的本轮结果进行广播 //取消操作,就发送下一个吃碰杠协议 if (msg.result == 0 && queueChiPengGang.Count > 0) { MsgChiPengGang msgChiPengGang = queueChiPengGang.Dequeue(); Broadcast(msgChiPengGang); return; } switch (msg.result) { case 0: //这里的queue一定为空,不需要进行任何的改变 break; case 1: //更新牌库 if (paiManager.OnChi(msg.id, msg.paiId) == false) { Console.WriteLine("更新牌库吃出现了bug"); } break; case 2: if (paiManager.OnPeng(msg.id, msg.paiId) == false) { Console.WriteLine("更新牌库碰出现了bug"); } break; case 3: if (paiManager.OnGang(msg.id, msg.paiId) == false) { Console.WriteLine("更新牌库杠出现了bug"); } break; } MsgFaPai msgFaPai = new MsgFaPai(); turn = (turn + 1) % 4; msgFaPai = ProcessMsgFaPai(msgFaPai); //广播 Broadcast(msgFaPai); }
//显示 public override void OnShow(params object[] args) { //寻找组件 GetUIComponent(); //生成gameManager类 gameManager = GameManager.GetInstance(); gameManager.GamePanel = this; gameManager.PlayerFactory = new PlayerFactory(); //GameManager处理发过来的数据,这个一定要放在生成gameManager类后面 MsgInitData msgInitData = (MsgInitData)args[0]; gameManager.OnMsgInitData(msgInitData); //对按钮添加点击事件 AddButtonClick(); //网络协议监听 NetManager.AddMsgListener("MsgFaPai", gameManager.OnMsgFaPai); NetManager.AddMsgListener("MsgChat", gameManager.OnMsgChat); NetManager.AddMsgListener("MsgChuPai", gameManager.OnMsgChuPai); NetManager.AddMsgListener("MsgChiPengGang", gameManager.OnMsgChiPengGang); NetManager.AddMsgListener("MsgChemistry", gameManager.OnMsgChemistry); NetManager.AddMsgListener("MsgMath", gameManager.OnMsgMath); NetManager.AddMsgListener("MsgQuit", gameManager.OnMsgQuit); NetManager.AddMsgListener("MsgComputerScience", gameManager.OnMsgComputerScience); //发送查询,发动查询要在处理InitData之后 if (gameManager.isZhuang) { MsgFaPai msgFaPai = new MsgFaPai(); NetManager.Send(msgFaPai); }//第一次出牌,只有庄家发送发牌协议 //隐藏各种UI,对他们进行初始化 InitUI(); //生成背景图片 GameObject bg = ResManager.LoadSprite("bg_game", 0); bg.name = "background"; bg.transform.localScale = new Vector3(2, 2, 2); Audio.PlayLoop(Audio.bgGamePanel); }
/// <summary> /// 客户端处理发牌协议 /// </summary> /// <param name="msgBase"></param> public void OnMsgFaPai(MsgBase msgBase) { Debug.Log("can receive msgFaPai"); MsgFaPai msg = (MsgFaPai)msgBase; nowTurnid = msg.id; if (msg.paiId == -1) { Debug.Log("没牌了,游戏结束"); PanelManager.Open <GameoverPanel>(-1, client_id, -1); PanelManager.Close("GamePanel"); return; } gamePanel.TurnText = msg.turnNum; //设置现在是第几轮了 gamePanel.TurnLight(msg.id); //切换灯光 if (msg.id == client_id) //如果是玩家,就显示出牌/发动技能/胡的按钮 { gamePanel.ChuPaiButton = true; if (msg.isHu) { gamePanel.HuButton = true; } if (msg.canSkill) { gamePanel.SkillButton = true; } } CreatePai(msg.paiId, msg.id); players[msg.id].SynHandPai(); //调整牌的顺序 players[msg.id].PlacePai(); //调整牌的位置 gamePanel.HandPaiCount = new int[] { (int)gamePanel.numToDir[msg.id], players[msg.id].handPai.Count }; gamePanel.PlayerStateText = "玩家" + (msg.id + 1) + "出牌"; isChuPai = true; //开始计时,玩家出牌 StartTimeCount(); }
/// <summary> /// 判断是否触发了吃碰杠,如果触发了,就发送吃碰杠协议 /// 否则,发送发牌协议,并广播 /// </summary> /// <param name="paiIndex"></param> /// <param name="id"></param> public void ProcessMsgChuPai(MsgChuPai msg) { int paiIndex = msg.paiIndex; //牌在这个玩家的索引 int id = msg.id; //出牌的玩家id Broadcast(msg); //对客户端广播出牌协议,对出牌进行同步 if (paiIndex == -1) { //服务端执行胡的操作,清空数据,写入数据库等 Over(msg.id, false); return; } int paiId = paiManager.ChuPai(paiIndex, id); queueChiPengGang = paiManager.HasEvent(paiId, id); //检测是否有吃碰杠这件事 if (queueChiPengGang.Count != 0) //一直发送吃碰杠协议,直到发完或者有人同意吃碰杠为止 { Console.WriteLine("存在吃碰杠!"); foreach (MsgChiPengGang item in queueChiPengGang) { Console.WriteLine(item.ToString()); } MsgChiPengGang chiPengGang = queueChiPengGang.Dequeue(); Broadcast(chiPengGang);//广播吃碰杠协议 } else { MsgFaPai msgFaPai = new MsgFaPai(); turn = (turn + 1) % 4; msgFaPai = ProcessMsgFaPai(msgFaPai); //广播 Broadcast(msgFaPai); } }