/// <summary> /// 客户端接收到吃碰杠的协议 /// 第一次收到协议,就让玩家操作是否进行吃碰杠,并将结果传给服务端 /// 第二次收到协议,同步结果 /// 这两次协议都需要服务端广播 /// </summary> /// <param name="msgBase"></param> public void OnMsgChiPengGang(MsgBase msgBase) { MsgChiPengGang msg = (MsgChiPengGang)msgBase; if (msg.result == -1)//第一次收到协议 { StartTimeCount(); nowTurnid = msg.id; isChuPai = false; players[nowTurnid].msgChiPengGang = msg; gamePanel.TurnLight(nowTurnid); if (nowTurnid == client_id) { bool[] isChiPengGang = msg.isChiPengGang; if (isChiPengGang[1]) { gamePanel.ChiButton = true; } if (isChiPengGang[2]) { gamePanel.PengButton = true; } if (isChiPengGang[3]) { gamePanel.GangButton = true; } } gamePanel.PlayerStateText = "玩家" + (msg.id + 1) + "吃碰杠"; } else { switch (msg.result) { case 0: //取消操作,不需要任何改变 break; case 1: players[msg.id].OnChi(msg.paiId); break; case 2: players[msg.id].OnPeng(msg.paiId); break; case 3: players[msg.id].OnGang(msg.paiId); break; } gamePanel.HandPaiCount = new int[] { (int)gamePanel.numToDir[msg.id], players[msg.id].handPai.Count }; } }
/// <summary> /// 没有参数代表强制执行吃碰杠操作 /// </summary> /// <param name="index">0代表什么都不做,1代表吃,2代表碰,3代表杠</param> public void ChiPengGang(int index = 0) { if (msgChiPengGang.isChiPengGang[index])//代表相关操作允许 { msgChiPengGang.result = index; } else {//异常情况 msgChiPengGang.result = 0; Debug.Log("非法操作!!!!!"); } gamePanel.ChiButton = false; gamePanel.PengButton = false; gamePanel.GangButton = false; gameManager.startTimeCount = false; NetManager.Send(msgChiPengGang); msgChiPengGang = null; }
/// <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); }
/// <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); } }
public static void MsgChiPengGang(ClientState c, MsgBase msgBase) { MsgChiPengGang msg = (MsgChiPengGang)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; } gameManager.ProcessChiPengGang(msg); }
/// <summary> /// 判断是否触发碰杠胡的条件 /// </summary> /// <param name="paiId">这个牌的索引</param> /// <param name="id">打出这张牌的玩家的id</param> /// <returns>null代表没有触发条件,</returns> public Queue <MsgChiPengGang> HasEvent(int paiId, int id) { Queue <MsgChiPengGang> queue = new Queue <MsgChiPengGang>(); for (int i = id + 1; i < id + 4; i++) { int panId = i % 4; bool[] res = new bool[4]; res[0] = true; //代表永远可以取消吃碰杠操作 res[1] = HasChi(paiId, panId); //检测吃 res[2] = HasPeng(paiId, panId); //检测碰 res[3] = HasGang(paiId, panId); //检测杠 if (res[1] | res[2] | res[3]) //至少有一个为true,就可以发送消息 { MsgChiPengGang msg = new MsgChiPengGang(); msg.isChiPengGang = res; msg.id = panId; msg.paiId = paiId; msg.result = -1; queue.Enqueue(msg); } } return(queue); }