public static Room CreateFriendRoom(G2M_CreateFriendRoom message) { try { FriendRoomInfo friendRoomInfo = message.FriendRoomInfo; Room room = ComponentFactory.Create <Room>(); room.AddComponent <DeskComponent>(); room.AddComponent <OrderControllerComponent>(); room.IsFriendRoom = true; GameControllerComponent controllerComponent = room.AddComponent <GameControllerComponent>(); RoomConfig roomConfig = new RoomConfig(); roomConfig.FriendRoomId = RandomHelper.RandomNumber(100000, 1000000); roomConfig.JuCount = friendRoomInfo.Ju; roomConfig.Multiples = friendRoomInfo.Hua; roomConfig.MinThreshold = 500; roomConfig.IsPublic = friendRoomInfo.IsPublic == 1; roomConfig.MasterUserId = message.UserId; roomConfig.Id = 3; roomConfig.Name = "好友房"; roomConfig.KeyCount = friendRoomInfo.KeyCount; controllerComponent.RoomConfig = roomConfig; controllerComponent.RoomName = RoomName.Friend; return(room); } catch (Exception e) { Log.Error(e); } return(null); }
protected override async Task Run(Gamer gamer, Actor_GamerPrompt_Req message, Action <Actor_GamerPrompt_Ack> reply) { Actor_GamerPrompt_Ack response = new Actor_GamerPrompt_Ack(); try { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); List <Card> handCards = new List <Card>(gamer.GetComponent <HandCardsComponent>().GetAll()); CardsHelper.SortCards(handCards); if (gamer.UserID == orderController.Biggest) { response.Cards.AddRange(handCards.Where(card => card.CardWeight == handCards[handCards.Count - 1].CardWeight).ToArray()); } else { List <IList <Card> > result = await CardsHelper.GetPrompt(handCards, deskCardsCache, deskCardsCache.Rule); if (result.Count > 0) { response.Cards.AddRange(result[RandomHelper.RandomNumber(0, result.Count)]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
/// <summary> /// 获取随机Map服务器的Session /// </summary> /// <returns></returns> public static Session GetRandomMapSession() { int randomMapAppId = RandomHelper.RandomNumber(0, StartConfigComponent.Instance.MapConfigs.Count); IPEndPoint ipEndPoint = StartConfigComponent.Instance.MapConfigs[randomMapAppId].GetComponent <InnerConfig>().IPEndPoint; return(Game.Scene.GetComponent <NetInnerComponent>().Get(ipEndPoint)); }
public static StartConfig GetRandomMap() { var mapConfigs = StartConfigComponent.Instance.MapConfigs; var val = RandomHelper.RandomNumber(0, mapConfigs.Count); return(mapConfigs[val]); }
public static StartConfig GetGate() { int count = StartConfigComponent.Instance.Gates.Count; int n = RandomHelper.RandomNumber(0, count); return(StartConfigComponent.Instance.Gates[n]); }
/// <summary> /// 隨機選取Map伺服器 /// </summary> /// <returns></returns> public static int GetMapIdRandomly() { var startComponent = Game.Scene.GetComponent <StartConfigComponent>(); var mapIndex = RandomHelper.RandomNumber(0, startComponent.MapConfigs.Count); var mapInst = startComponent.MapConfigs[mapIndex]; return(mapInst.AppId); }
/// <summary> /// 隨機選取Lobby伺服器 /// </summary> /// <returns></returns> public static int GetLobbyIdRandomly() { var startComponent = Game.Scene.GetComponent <StartConfigComponent>(); var lobbyIndex = RandomHelper.RandomNumber(0, startComponent.LobbyConfigs.Count); var lobbyInst = startComponent.LobbyConfigs[lobbyIndex]; return(lobbyInst.AppId); }
public static StartSceneConfig GetGate(int zone) { List <StartSceneConfig> zoneGates = StartSceneConfigCategory.Instance.Gates[zone]; int n = RandomHelper.RandomNumber(0, zoneGates.Count); return(zoneGates[n]); }
public static async void Start(this TrusteeshipComponent self) { //玩家所在房间 Room room = Game.Scene.GetComponent <RoomComponent>().Get(self.GetParent <Gamer>().RoomID); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); Gamer gamer = self.GetParent <Gamer>(); bool isStartPlayCard = false; while (true) { await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000); if (self.IsDisposed) { return; } if (gamer.UserID != orderController?.CurrentAuthority) { continue; } //自动出牌开关,用于托管延迟出牌 isStartPlayCard = !isStartPlayCard; if (isStartPlayCard) { continue; } ActorMessageSender actorProxy = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(gamer.Id); //当还没抢地主时随机抢地主 if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None) { int randomSelect = RandomHelper.RandomNumber(0, 2); actorProxy.Send(new Actor_GamerGrabLandlordSelect_Ntt() { IsGrab = randomSelect == 0 }); self.Playing = false; continue; } //自动提示出牌 Actor_GamerPrompt_Ack response = await actorProxy.Call(new Actor_GamerPrompt_Req()) as Actor_GamerPrompt_Ack; if (response.Error > 0 || response.Cards == null) { actorProxy.Send(new Actor_GamerDontPlay_Ntt()); } else { await actorProxy.Call(new Actor_GamerPlayCard_Req() { Cards = response.Cards }); } } }
/// <summary> /// 随机生成区号 1~ /// </summary> public static long GenerateId() { //随机获得GateId 1~2 int randomGateAppId = RandomHelper.RandomNumber(0, StartConfigComponent.Instance.GateConfigs.Count) + 1; long time = TimeHelper.ClientNowSeconds(); //1540 2822 75 时间为10位数 //区号取第11位数 return(randomGateAppId * 100000000000 + time + ++value); }
/// <summary> /// 从空闲集合中随机返回一个列表 /// </summary> /// <param name="self"></param> /// <returns></returns> public static Room GetIdleRoom(this RoomComponent self) { if (self.IdleRoomCount > 0) { Room room = self.idleRooms[RandomHelper.RandomNumber(0, self.idleRooms.Count)]; return(room); } else { return(null); } }
//从23个英雄中随机 private static int RandomSeedNotRepeat(List <int> alreadyHave) { int randomSeed = RandomHelper.RandomNumber(1, 24); if (alreadyHave.Contains(randomSeed)) { randomSeed = RandomSeedNotRepeat(alreadyHave); } else { alreadyHave.Add(randomSeed); } return(randomSeed); }
/// <summary> /// 发所有牌 /// </summary> public static List <int> DealAllCards(int count) { List <int> allCards = new List <int>(); while (allCards.Count < count) { int n = RandomHelper.RandomNumber(1, 53); //除去大小鬼,52张牌 if (!allCards.Contains(n)) { allCards.Insert(RandomHelper.RandomNumber(allCards.Count), n); } } return(allCards); }
public void Reconnection() { Log.Debug("重新连接"); int i = RandomHelper.RandomNumber(1, 3); if (i == 1) { this.ConnectionStatus = ConnectionStatus.Normal; } else { this.ConnectionStatus = ConnectionStatus.Outline; } }
/// <summary> /// 随机先手玩家 /// </summary> public static void RandomFirstAuthority(this GameControllerComponent self) { Room room = self.GetParent <Room>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); Gamer[] gamers = room.gamers; int index = RandomHelper.RandomNumber(0, gamers.Length); long firstAuthority = gamers[index].UserID; orderController.Init(firstAuthority); //广播先手抢地主玩家 room.Broadcast(new Actor_AuthorityGrabLandlord_Ntt() { UserID = firstAuthority }); }
/// <summary> /// 发牌(不包括花牌) /// </summary> /// <param name="deskComponent"></param> /// <param name="handCardsComponent"></param> private static void GetCardNotFace(DeskComponent deskComponent, HandCardsComponent handCardsComponent) { while (true) { int cardIndex = RandomHelper.RandomNumber(0, deskComponent.RestLibrary.Count); MahjongInfo grabMahjong = deskComponent.RestLibrary[cardIndex]; deskComponent.RestLibrary.RemoveAt(cardIndex); //花牌 if (grabMahjong.m_weight >= Consts.MahjongWeight.Hua_HongZhong) { handCardsComponent.FaceCards.Add(grabMahjong); handCardsComponent.FaceGangCards.Add(grabMahjong); } else { handCardsComponent.GetAll().Add(grabMahjong); break; } } }
public void UpdateSpeed(MapUnitFsmMoveComponent self, long nowTime) { if (nowTime > self.SpeedRandomTimeAfter) { self.SpeedTarget = (float)RandomHelper.RandomDouble() * (self.SpeedMax - self.SpeedMin) + self.SpeedMin; self.SpeedRandomTimeAfter = nowTime + RandomHelper.RandomNumber(MapUnitFsmMoveComponent.SpeedRandomTimeIntervalMin, MapUnitFsmMoveComponent.SpeedRandomTimeIntervalMax); } if (nowTime > self.SpeedLerpTimeAfter) { if (self.SpeedLerpTimePrevious <= 0) { self.SpeedLerpTimePrevious = nowTime; } long detlaTime = nowTime - self.SpeedLerpTimePrevious; if (Math.Abs(self.SpeedTarget - self.SpeedNow) > 0.01f) { if (self.SpeedTarget > self.SpeedNow) { self.SpeedNow += 2f * (detlaTime * 0.001f); if (self.SpeedTarget < self.SpeedNow) { self.SpeedNow = self.SpeedTarget; } } else { self.SpeedNow -= 2f * (detlaTime * 0.001f); if (self.SpeedTarget > self.SpeedNow) { self.SpeedNow = self.SpeedTarget; } } } self.SpeedLerpTimePrevious = nowTime; self.SpeedLerpTimeAfter = nowTime + MapUnitFsmMoveComponent.SpeedLerpTimeInterval; } }
/// <summary> /// 随机获取一个房间服务器地址 /// </summary> /// <returns></returns> public static StartConfig GetAddress(this AllotMapComponent self) { int n = RandomHelper.RandomNumber(0, self.MapAddress.Count); return(self.MapAddress[n]); }
public static async Task GamerReady(Gamer gamer, Actor_GamerReady message) { try { Log.Info($"收到玩家{gamer.UserID}准备"); RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); Room room = roomComponent.Get(gamer.RoomID); if (room == null || gamer == null || gamer.IsReady || room.State == RoomState.Game) { return; } gamer.IsReady = true; //消息广播给其他人 room?.Broadcast(new Actor_GamerReady() { Uid = gamer.UserID }); Gamer[] gamers = room.GetAll(); //房间内有4名玩家且全部准备则开始游戏 if (room.Count == 4 && gamers.Where(g => g.IsReady).Count() == 4) { room.State = RoomState.Game; room.CurrentJuCount++; room.IsGameOver = false; room.RoomDispose(); #region 好友房扣钥匙 if (room.IsFriendRoom && room.CurrentJuCount == 1) { RoomConfig roomConfig = room.GetComponent <GameControllerComponent>().RoomConfig; await DBCommonUtil.DeleteFriendKey(roomConfig.MasterUserId, roomConfig.KeyCount, "好友房房主扣除钥匙"); } #endregion //设置比下胡 if (room.LastBiXiaHu) { room.IsBiXiaHu = true; } else { room.IsBiXiaHu = false; } room.LastBiXiaHu = false; if (roomComponent.gameRooms.TryGetValue(room.Id, out var itemRoom)) { roomComponent.gameRooms.Remove(room.Id); } roomComponent.gameRooms.Add(room.Id, room); roomComponent.idleRooms.Remove(room.Id); //添加用户 room.UserIds.Clear(); //初始玩家开始状态 foreach (var _gamer in gamers) { room.UserIds.Add(_gamer.UserID); if (_gamer.GetComponent <HandCardsComponent>() == null) { _gamer.AddComponent <HandCardsComponent>(); } _gamer.IsReady = false; } Log.Info($"{room.Id}房间开始,玩家:{JsonHelper.ToJson(room.UserIds)}"); GameControllerComponent gameController = room.GetComponent <GameControllerComponent>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); DeskComponent deskComponent = room.GetComponent <DeskComponent>(); Gamer bankerGamer = null; HandCardsComponent bankerHandCards = null; if (room.IsLianZhuang) { if (room.huPaiUid != 0 && room.huPaiUid == room.BankerGamer?.UserID) { bankerGamer = room.Get(room.huPaiUid); bankerHandCards = bankerGamer.GetComponent <HandCardsComponent>(); bankerHandCards.IsBanker = true; room.BankerGamer = bankerGamer; //连庄 room.LastBiXiaHu = true; } else { int gamerSeat = room.GetGamerSeat(room.BankerGamer.UserID); int currentSeat; if (gamerSeat == 3) { currentSeat = 0; } else { currentSeat = ++gamerSeat; } bankerGamer = room.gamers[currentSeat]; bankerHandCards = bankerGamer.GetComponent <HandCardsComponent>(); bankerHandCards.IsBanker = true; room.BankerGamer = bankerGamer; } } else { if (room.IsFriendRoom) { GameControllerComponent controllerComponent = room.GetComponent <GameControllerComponent>(); long masterUserId = controllerComponent.RoomConfig.MasterUserId; bankerGamer = room.Get(masterUserId); } else { //随机庄家 int number = RandomHelper.RandomNumber(0, 12); int i = number % 4; bankerGamer = room.gamers[i]; } bankerHandCards = bankerGamer.GetComponent <HandCardsComponent>(); bankerHandCards.IsBanker = true; room.BankerGamer = bankerGamer; } //发牌 gameController.DealCards(); orderController.Start(bankerGamer.UserID); //去除花牌 foreach (var _gamer in gamers) { HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>(); List <MahjongInfo> handCards = handCardsComponent.GetAll(); for (int j = handCards.Count - 1; j >= 0; j--) { MahjongInfo mahjongInfo = handCards[j]; if (mahjongInfo.m_weight >= Consts.MahjongWeight.Hua_HongZhong) { handCards.RemoveAt(j); mahjongInfo.weight = (byte)mahjongInfo.m_weight; handCardsComponent.FaceCards.Add(mahjongInfo); handCardsComponent.FaceGangCards.Add(mahjongInfo); } } //加牌 int handCardsCount = handCards.Count; for (int j = 0; j < 13 - handCardsCount; j++) { GetCardNotFace(deskComponent, handCardsComponent); } } //庄家多发一张牌 GetCardNotFace(deskComponent, bankerHandCards); // List<MahjongInfo> infos = bankerHandCards.GetAll(); // bankerHandCards.library = new List<MahjongInfo>(list); //给客户端传送数据 Actor_StartGame actorStartGame = new Actor_StartGame(); foreach (var itemGame in gamers) { GamerData gamerData = new GamerData(); HandCardsComponent handCardsComponent = itemGame.GetComponent <HandCardsComponent>(); List <MahjongInfo> mahjongInfos = handCardsComponent.library; foreach (var mahjongInfo in mahjongInfos) { mahjongInfo.weight = (byte)mahjongInfo.m_weight; } gamerData.UserID = itemGame.UserID; gamerData.handCards = mahjongInfos; gamerData.faceCards = handCardsComponent.FaceCards; if (handCardsComponent.IsBanker) { gamerData.IsBanker = true; } gamerData.SeatIndex = room.seats[itemGame.UserID]; gamerData.OnlineSeconds = await DBCommonUtil.GetRestOnlineSeconds(itemGame.UserID); actorStartGame.GamerDatas.Add(gamerData); } actorStartGame.restCount = deskComponent.RestLibrary.Count; GameControllerComponent gameControllerComponent = room.GetComponent <GameControllerComponent>(); if (room.IsFriendRoom) { actorStartGame.RoomType = 3; actorStartGame.CurrentJuCount = room.CurrentJuCount; } else { actorStartGame.RoomType = (int)gameControllerComponent.RoomConfig.Id; } //发送消息 room.Broadcast(actorStartGame); // Log.Debug("发送开始:" + JsonHelper.ToJson(actorStartGame)); //排序 var startTime = DateTime.Now; foreach (var _gamer in gamers) { HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>(); //排序 handCardsComponent.Sort(); handCardsComponent.GrabCard = handCardsComponent.GetAll()[handCardsComponent.GetAll().Count - 1]; //设置玩家在线开始时间 _gamer.StartTime = startTime; //await DBCommonUtil.RecordGamerTime(startTime, true, _gamer.UserID); } foreach (var _gamer in room.GetAll()) { HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>(); List <MahjongInfo> cards = handCardsComponent.GetAll(); if (handCardsComponent.IsBanker) { if (Logic_NJMJ.getInstance().isHuPai(cards)) { //ToDo 胡牌 Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; _gamer.IsCanHu = true; canOperation.OperationType = 2; room.GamerBroadcast(_gamer, canOperation); _gamer.isGangFaWanPai = true; } } else { //检查听牌 List <MahjongInfo> checkTingPaiList = Logic_NJMJ.getInstance().checkTingPaiList(cards); if (checkTingPaiList.Count > 0) { Log.Info($"{_gamer.UserID}听牌:"); _gamer.isFaWanPaiTingPai = true; } } } //等客户端掷骰子 //是否超时 await Game.Scene.GetComponent <TimerComponent>().WaitAsync(10 * 1000); room.StartTime(); //扣服务费 if (!room.IsFriendRoom) { //不要动画 GameHelp.CostServiceCharge(room, false); } } } catch (Exception e) { Log.Error(e); } await Task.CompletedTask; }
public static void Awake(this Room room, byte PlayerCount) { room.gamers = new Gamer[PlayerCount]; room.RoomId = RandomHelper.RandomNumber(100000, 999999); }
protected override async void Run(Session session, C2G_CowCowCreateGameRoomGate message, Action <G2C_CowCowCreateGameRoomGate> reply) { G2C_CowCowCreateGameRoomGate response = new G2C_CowCowCreateGameRoomGate(); try { UserInfo userInfo = Game.Scene.GetComponent <UserInfoComponent>().Get(message.UserID); if (userInfo.Diamond < message.Bureau) { response.Error = ErrorCode.ERR_CreateRoomError; response.Message = "房卡不足"; reply(response); return; } userInfo.Diamond -= (message.Bureau + 1); string roomId = string.Empty; while (true) { roomId = RandomHelper.RandomNumber(100000, 999999).ToString(); if (!Game.Scene.GetComponent <RoomComponent>().IsExist(roomId)) { break; } } Room room = ComponentFactory.Create <Room>(); room.UserID = message.UserID; room.RoomID = roomId; room.GameName = message.Name; room.Bureau = GameInfo.Bureau[message.Bureau]; room.RuleBit = message.RuleBit; room.PeopleCount = message.People; room.CurBureau = 0; Game.Scene.GetComponent <RoomComponent>().Add(room); Gamer gamer = GamerFactory.Create(message.UserID, session.InstanceId); await gamer.AddComponent <MailBoxComponent>().AddLocation(); gamer.UserID = message.UserID; gamer.Name = "房主" + userInfo.NickName; gamer.HeadIcon = userInfo.HeadIcon; gamer.RoomID = room.RoomID; gamer.Status = GamerStatus.Down; gamer.IsOffline = false; gamer.Identity = Identity.None; gamer.Coin = 0; gamer.Sex = userInfo.Sex; room.Add(gamer); Game.Scene.GetComponent <RoomComponent>().Add(gamer.UserID, room.RoomID); response.GameName = room.GameName; response.Bureau = room.Bureau; response.RuleBit = room.RuleBit; response.RoomID = room.RoomID; response.People = room.PeopleCount; //根据UserID从数据库拿到该用户信息并返回 response.GamerInfo = new GamerInfo(); response.GamerInfo.Name = gamer.Name; response.GamerInfo.HeadIcon = gamer.HeadIcon; response.GamerInfo.UserID = gamer.UserID; //这个ID用于保存?待定 response.GamerInfo.SeatID = gamer.SeatID; response.GamerInfo.Sex = gamer.Sex; response.GamerInfo.Status = (int)gamer.Status; response.GamerInfo.Coin = gamer.Coin; response.CurBureau = room.CurBureau; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected override void Run(Session session, C2M_CowCowGrabBanker message, Action <M2C_CowCowGrabBanker> reply) { M2C_CowCowGrabBanker response = new M2C_CowCowGrabBanker(); try { Room room = Game.Scene.GetComponent <RoomComponent>().Get(message.UserID); if (room == null) { response.Error = ErrorCode.ERR_NotRoomNumberError; reply(response); return; } Gamer gamer = room.Get(message.SeatID); gamer.GrabBanker = message.Multiple; reply(response); Dictionary <int, Gamer> gamers = room.GetAll(); room.grabBankers.Clear(); foreach (Gamer g in gamers.Values) { if (g.GrabBanker != 0) { room.grabBankers.Add(g.GrabBanker); } } //抢庄后发牌,庄家 if (room.grabBankers.Count == room.PeopleCount) { //判断最大值 room.State = RoomState.Game; this.seatId.Clear(); int max = room.grabBankers.Max(); foreach (Gamer g in gamers.Values) { if (g.GrabBanker == max) { this.seatId.Add(g.SeatID); } } //庄家 int seatId = this.seatId[RandomHelper.RandomNumber(this.seatId.Count)]; room.CurBankerSeatID = seatId; room.CurMultiple = max; List <int> allCards = CowCowDealCardSystem.DealAllCards(CardCount * room.GamerCount); foreach (Gamer g in gamers.Values) { g.GrabBanker = 0; //初始化 g.Status = GamerStatus.Playing; //正在玩的状态 Actor_CowCowRoomDealCards sendCards = new Actor_CowCowRoomDealCards(); sendCards.Cards = new RepeatedField <int>(); int index = g.SeatID * CardCount; for (int i = 0; i < CardCount; i++) { sendCards.Cards.Add(allCards[index + i]); } sendCards.SeatID = seatId; sendCards.Multiple = max; room.Send(g, sendCards); } } } catch (Exception e) { ReplyError(response, e, reply); } }
public static async void StartGame(Actor_StartGame message, bool isReconnect) { Log.Debug($"收到开始"); try { UI uiRoom = Game.Scene.GetComponent <UIComponent>().Get(UIType.UIRoom); if (uiRoom == null) { uiRoom = Game.Scene.GetComponent <UIComponent>().Create(UIType.UIRoom); } Game.Scene.GetComponent <UIComponent>().Remove(UIType.UIReady); Game.Scene.GetComponent <UIComponent>().Remove(UIType.UIGameResult); GamerComponent gamerComponent = uiRoom.GetComponent <GamerComponent>(); UIRoomComponent uiRoomComponent = uiRoom.GetComponent <UIRoomComponent>(); UIRoomComponent.ISGaming = true; uiRoomComponent.ContinueGamer(); //好友房设置将退出变成解散 if (UIRoomComponent.IsFriendRoom) { uiRoomComponent.SetFriendSetting(PlayerInfoComponent.Instance.uid); uiRoomComponent.SetCurrentJuCount(message.CurrentJuCount); } //先掷骰子 if (!isReconnect) { uiRoomComponent.exitBtn.interactable = false; uiRoomComponent.players.SetActive(true); GameObject DiceAnim = uiRoomComponent.dice.Get <GameObject>("DiceAnim"); GameObject DiceBottom = uiRoomComponent.dice.Get <GameObject>("DiceBottom"); Image Dice1 = DiceBottom.transform.Find("Dice1").GetComponent <Image>(); Image Dice2 = DiceBottom.transform.Find("Dice2").GetComponent <Image>(); DiceAnim.SetActive(true); SoundsHelp.Instance.playSound_ShaiZi(); await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(2000); DiceAnim.SetActive(false); DiceBottom.SetActive(true); int number1 = RandomHelper.RandomNumber(1, 7); Dice1.sprite = CommonUtil.getSpriteByBundle("Image_Dice", "num_" + number1); int number2 = RandomHelper.RandomNumber(1, 7); Dice2.sprite = CommonUtil.getSpriteByBundle("Image_Dice", "num_" + number2); await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000); //发牌动画 List <MahjongInfo> myCard = null; foreach (var gameData in message.GamerDatas) { foreach (var mahjong in gameData.handCards) { mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight; } foreach (var mahjong in gameData.faceCards) { mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight; } foreach (var gamer in gamerComponent.GetAll()) { if (gamer.UserID != gameData.UserID) { continue; } // if (gamer.UserID == PlayerInfoComponent.Instance.uid) // { // myCard = new List<MahjongInfo>(gameData.handCards); // } gamer.gameData = gameData; GamerUIComponent gamerUi = gamer.GetComponent <GamerUIComponent>(); gamerUi.GameStart(); gamer.IsBanker = gameData.IsBanker; HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); if (handCards != null) { handCards.Reset(); } else { handCards = gamer.AddComponent <HandCardsComponent, GameObject, int, int>(gamerUi.Panel, gamerUi.Index, gameData.SeatIndex); } handCards.myCard = new List <MahjongInfo>(gameData.handCards); } } for (int i = 0; i < 4; i++) { foreach (var gamer in gamerComponent.GetAll()) { HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); if (PlayerInfoComponent.Instance.uid == gamer.UserID) { handCards.StartDealCardAnim(true); } else { handCards.StartDealCardAnim(false); } await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(400); } } //自己的牌翻一下 foreach (var gamer in gamerComponent.GetAll()) { if (gamer.UserID == PlayerInfoComponent.Instance.uid) { HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); handCards.FanPai(); } } await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(500); DiceBottom.SetActive(false); } uiRoomComponent.StartGame(message.restCount); uiRoomComponent.exitBtn.interactable = true; // uiRoomComponent.SetRoomType(message.RoomType); foreach (var gameData in message.GamerDatas) { foreach (var mahjong in gameData.handCards) { mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight; } foreach (var mahjong in gameData.faceCards) { mahjong.m_weight = (Consts.MahjongWeight)mahjong.weight; } foreach (var gamer in gamerComponent.GetAll()) { if (gamer.UserID != gameData.UserID) { continue; } GamerUIComponent gamerUi = gamer.GetComponent <GamerUIComponent>(); gamerUi.GameStart(); HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); if (handCards != null) { handCards.Reset(); } else { handCards = gamer.AddComponent <HandCardsComponent, GameObject, int, int>(gamerUi.Panel, gamerUi.Index, gameData.SeatIndex); } //设置庄家 gamer.IsBanker = gameData.IsBanker; gamerUi.SetZhuang(); //当前出牌玩家 if (gamer.IsBanker) { gamerComponent.CurrentPlayUid = gamer.UserID; } if (gamer.UserID == gamerComponent.LocalGamer.UserID) { //本地玩家添加手牌 uiRoomComponent.SetTreasureTime(gameData.OnlineSeconds); handCards.AddCards(gameData.handCards); handCards.ShowBg(); } else { handCards.AddOtherCards(gamer.IsBanker); } handCards.SetFaceCards(gameData.faceCards); foreach (var card in gameData.faceCards) { gamerUi.SetBuHua(card.weight); } } } //时间倒计时 foreach (var gamer in gamerComponent.GetAll()) { if (gamer.IsBanker) { uiRoomComponent.ShowTurn(gamer.UserID); } } uiRoom.GameObject.SetActive(true); UIRoomComponent.ISGaming = true; uiRoomComponent?.tip?.SetActive(true); uiRoomComponent.tip.GetComponentInChildren <Image>().sprite = CommonUtil.getSpriteByBundle("Image_Desk_Card", "shangji_tip"); await ETModel.Game.Scene.GetComponent <TimerComponent>().WaitAsync(3000); if (uiRoomComponent != null) { if (uiRoomComponent.tip != null) { uiRoomComponent?.tip?.SetActive(false); } } } catch (Exception e) { Log.Error(e); } }
/// <summary> /// 提示出牌 /// </summary> /// <param name="cards"></param> /// <returns></returns> public static async Task <List <IList <Card> > > GetPrompt(List <Card> cards, DeskCardsCacheComponent deskCardsCache, CardsType type) { List <IList <Card> > result = new List <IList <Card> >(); IList <Card> deskCards = deskCardsCache.GetAll(); int weight = deskCardsCache.GetTotalWeight(); if (type == CardsType.JokerBoom) { return(result); } //检索王炸 if (cards.Count >= 2) { IList <Card> groupCards = new Card[2]; groupCards[0] = cards[0]; groupCards[1] = cards[1]; if (IsJokerBoom(groupCards)) { result.Add(groupCards); } } //检索炸弹 for (int i = cards.Count - 1; i >= 3; i--) { IList <Card> groupCards = new Card[4]; groupCards[0] = cards[i - 3]; groupCards[1] = cards[i - 2]; groupCards[2] = cards[i - 1]; groupCards[3] = cards[i]; if (IsBoom(groupCards) && GetWeight(groupCards, CardsType.Boom) > weight) { result.Add(groupCards); } } switch (type) { case CardsType.OnlyThree: for (int i = cards.Count - 1; i >= 2; i--) { if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight) { continue; } IList <Card> groupCards = new Card[3]; groupCards[0] = cards[i - 2]; groupCards[1] = cards[i - 1]; groupCards[2] = cards[i]; if (IsOnlyThree(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } break; case CardsType.ThreeAndOne: if (cards.Count >= 4) { for (int i = cards.Count - 1; i >= 2; i--) { if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight) { continue; } List <Card> other = new List <Card>(cards); other.RemoveRange(i - 2, 3); IList <Card> groupCards = new Card[4]; groupCards[0] = cards[i - 2]; groupCards[1] = cards[i - 1]; groupCards[2] = cards[i]; groupCards[3] = other[RandomHelper.RandomNumber(0, other.Count)]; if (IsThreeAndOne(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } } break; case CardsType.ThreeAndTwo: if (cards.Count >= 5) { for (int i = cards.Count - 1; i >= 2; i--) { if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight) { continue; } List <Card> other = new List <Card>(cards); other.RemoveRange(i - 2, 3); List <IList <Card> > otherDouble = await GetPrompt(other, deskCardsCache, CardsType.Double); if (otherDouble.Count > 0) { IList <Card> randomDouble = otherDouble[RandomHelper.RandomNumber(0, otherDouble.Count)]; IList <Card> groupCards = new Card[5]; groupCards[0] = cards[i - 2]; groupCards[1] = cards[i - 1]; groupCards[2] = cards[i]; groupCards[3] = randomDouble[0]; groupCards[4] = randomDouble[1]; if (IsThreeAndTwo(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } } } break; case CardsType.Straight: /* * 7 6 5 4 3 * 8 7 6 5 4 * * */ if (cards.Count >= deskCards.Count) { for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--) { if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight) { continue; } //是否全部搜索完成 bool isTrue = true; IList <Card> groupCards = new Card[deskCards.Count]; for (int j = 0; j < deskCards.Count; j++) { //搜索连续权重牌 Card findCard = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + j).FirstOrDefault(); if (findCard == null) { isTrue = false; break; } groupCards[deskCards.Count - 1 - j] = findCard; } if (isTrue && IsStraight(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } } break; case CardsType.DoubleStraight: /* * 5 5 4 4 3 3 * 6 6 5 5 4 4 * * */ if (cards.Count >= deskCards.Count) { for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--) { if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight) { continue; } //是否全部搜索完成 bool isTrue = true; IList <Card> groupCards = new Card[deskCards.Count]; for (int j = 0; j < deskCards.Count; j += 2) { //搜索连续权重牌 IList <Card> findCards = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + (j / 2)).ToArray(); if (findCards.Count < 2) { isTrue = false; break; } groupCards[deskCards.Count - 2 - j] = findCards[0]; groupCards[deskCards.Count - 1 - j] = findCards[1]; } if (isTrue && IsDoubleStraight(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } } break; case CardsType.TripleStraight: if (cards.Count >= deskCards.Count) { for (int i = cards.Count - 1; i >= deskCards.Count - 1; i--) { if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight) { continue; } //是否全部搜索完成 bool isTrue = true; IList <Card> groupCards = new Card[deskCards.Count]; for (int j = 0; j < deskCards.Count; j += 3) { //搜索连续权重牌 IList <Card> findCards = cards.Where(card => (int)card.CardWeight == (int)cards[i].CardWeight + (j / 3)).ToArray(); if (findCards.Count < 3) { isTrue = false; break; } groupCards[deskCards.Count - 3 - j] = findCards[0]; groupCards[deskCards.Count - 2 - j] = findCards[1]; groupCards[deskCards.Count - 1 - j] = findCards[2]; } if (isTrue && IsTripleStraight(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } } break; case CardsType.Double: if (cards.Count >= 2) { for (int i = cards.Count - 1; i >= 1; i--) { IList <Card> groupCards = new Card[2]; groupCards[0] = cards[i - 1]; groupCards[1] = cards[i]; if (IsDouble(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } } break; case CardsType.Single: if (cards.Count >= 1) { for (int i = cards.Count - 1; i >= 0; i--) { if (cards[i].CardWeight <= deskCards[deskCards.Count - 1].CardWeight) { continue; } IList <Card> groupCards = new Card[1]; groupCards[0] = cards[i]; if (IsSingle(groupCards) && GetWeight(groupCards, type) > weight) { result.Add(groupCards); } } } break; default: break; } return(result); }
/// <summary> /// 抓牌 /// </summary> /// <param name="room"></param> /// <returns></returns> public static MahjongInfo GrabMahjong(this Room room) { try { OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); var currentGamer = room.Get(orderController.CurrentAuthority); HandCardsComponent cardsComponent = currentGamer.GetComponent <HandCardsComponent>(); DeskComponent deskComponent = room.GetComponent <DeskComponent>(); if (deskComponent.RestLibrary.Count == 0) { Log.Info("没牌了"); return(null); } MahjongInfo grabMahjong; if (room.NextGrabCard != null) { grabMahjong = new MahjongInfo() { m_weight = room.NextGrabCard.m_weight, weight = room.NextGrabCard.weight }; room.NextGrabCard = null; Log.Debug("发作弊牌:" + grabMahjong.m_weight); } else { int number = RandomHelper.RandomNumber(0, deskComponent.RestLibrary.Count); grabMahjong = deskComponent.RestLibrary[number]; deskComponent.RestLibrary.RemoveAt(number); Log.Info($"{currentGamer.UserID}发牌:" + grabMahjong.m_weight); } //花牌返回 if (grabMahjong.m_weight >= Consts.MahjongWeight.Hua_HongZhong) { return(grabMahjong); } //发牌 cardsComponent.AddCard(grabMahjong); room.my_lastMahjong = grabMahjong; cardsComponent.GrabCard = grabMahjong; Logic_NJMJ.getInstance().SortMahjong(cardsComponent.GetAll()); //发送抓牌消息 ActorMessageSenderComponent actorMessageSenderComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>(); foreach (Gamer _gamer in room.gamers) { if (_gamer == null || _gamer.isOffline) { continue; } UnitGateComponent unitGateComponent = _gamer?.GetComponent <UnitGateComponent>(); Actor_GamerGrabCard actorGamerGrabCard; if (_gamer.UserID == orderController.CurrentAuthority) { actorGamerGrabCard = new Actor_GamerGrabCard() { Uid = currentGamer.UserID, weight = (int)grabMahjong.m_weight }; } else { actorGamerGrabCard = new Actor_GamerGrabCard() { Uid = currentGamer.UserID, }; } actorMessageSenderComponent.GetWithActorId(unitGateComponent.GateSessionActorId).Send(actorGamerGrabCard); } //发完牌判断是否胡牌 foreach (Gamer _gamer in room.gamers) { if (_gamer == null || _gamer.isOffline) { continue; } if (_gamer.UserID == orderController.CurrentAuthority) { HandCardsComponent handCardsComponent = _gamer.GetComponent <HandCardsComponent>(); //判断胡牌 if (Logic_NJMJ.getInstance().isHuPai(handCardsComponent.GetAll())) { _gamer.huPaiNeedData.my_lastMahjong = room.my_lastMahjong; _gamer.huPaiNeedData.restMahjongCount = deskComponent.RestLibrary.Count; _gamer.huPaiNeedData.isSelfZhuaPai = orderController.CurrentAuthority == _gamer.UserID; _gamer.huPaiNeedData.isZhuangJia = handCardsComponent.IsBanker; _gamer.huPaiNeedData.isGetYingHuaBuPai = _gamer.isGetYingHuaBuPai; _gamer.huPaiNeedData.isGangEndBuPai = _gamer.isGangEndBuPai; _gamer.huPaiNeedData.isGangFaWanPai = _gamer.isGangFaWanPai; _gamer.huPaiNeedData.isFaWanPaiTingPai = _gamer.isFaWanPaiTingPai; _gamer.huPaiNeedData.my_yingHuaList = handCardsComponent.FaceCards; _gamer.huPaiNeedData.my_gangList = handCardsComponent.GangCards; _gamer.huPaiNeedData.my_pengList = handCardsComponent.PengCards; List <List <MahjongInfo> > tempList = new List <List <MahjongInfo> >(); for (int i = 0; i < room.GetAll().Length; i++) { if (_gamer.UserID == room.GetAll()[i].UserID) { continue; } tempList.Add(room.GetAll()[i].GetComponent <HandCardsComponent>().PengCards); } _gamer.huPaiNeedData.other1_pengList = tempList[0]; _gamer.huPaiNeedData.other2_pengList = tempList[1]; _gamer.huPaiNeedData.other3_pengList = tempList[2]; List <Consts.HuPaiType> huPaiTypes = Logic_NJMJ.getInstance().getHuPaiType(handCardsComponent.GetAll(), _gamer.huPaiNeedData); Log.Info(JsonHelper.ToJson(_gamer.huPaiNeedData)); Log.Info(JsonHelper.ToJson(huPaiTypes)); if (huPaiTypes.Count > 0) { //判断小胡,4个花以上才能胡 if (huPaiTypes[0] == Consts.HuPaiType.Normal) { if (handCardsComponent.PengGangCards.Count > 0 || handCardsComponent.PengCards.Count > 0) { if (handCardsComponent.FaceCards.Count >= 4) { _gamer.IsCanHu = true; Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; canOperation.OperationType = 2; room.GamerBroadcast(_gamer, canOperation); } } } else { _gamer.IsCanHu = true; Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; canOperation.OperationType = 2; room.GamerBroadcast(_gamer, canOperation); } } } //暗杠 if (Logic_NJMJ.getInstance().IsAnGang(handCardsComponent.GetAll(), out var weight)) { _gamer.IsCanGang = true; Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; canOperation.OperationType = 4; room.GamerBroadcast(_gamer, canOperation); } //碰杠 else if (Logic_NJMJ.getInstance().IsPengGang(handCardsComponent.PengCards, handCardsComponent.GetAll(), out var weight2)) { _gamer.IsCanGang = true; Actor_GamerCanOperation canOperation = new Actor_GamerCanOperation(); canOperation.Uid = _gamer.UserID; canOperation.OperationType = 5; room.GamerBroadcast(_gamer, canOperation); } } } return(grabMahjong); } catch (Exception e) { Log.Error(e); return(null); } }