/// <summary> /// </summary> /// <param name="handState"></param> /// <param name="lastTrickState">扣抵的牌</param> /// <returns></returns> public PlayerEntity NextRank(RoomState CurrentRoomState) { if (!Players.Exists(p => p != null && p.PlayerId == CurrentRoomState.CurrentHandState.Starter)) { //log return(null); } //处理J到底 if (CurrentRoomState.roomSetting.AllowJToBottom && CurrentRoomState.CurrentHandState.Rank == 9) { var cards = CurrentRoomState.CurrentTrickState.ShowedCards[CurrentRoomState.CurrentTrickState.Winner]; var cardscp = new CurrentPoker(cards, (int)CurrentRoomState.CurrentHandState.Trump, CurrentRoomState.CurrentHandState.Rank); //最后一把牌的赢家不跟庄家一伙 if (!CurrentRoomState.CurrentGameState.ArePlayersInSameTeam(CurrentRoomState.CurrentHandState.Starter, CurrentRoomState.CurrentTrickState.Winner)) { //主J勾到底 if (cardscp.MasterRank > 0) { foreach (PlayerEntity player in Players) { if (ArePlayersInSameTeam(CurrentRoomState.CurrentHandState.Starter, player.PlayerId)) { player.Rank = 0; } } } //副J勾一半 else if (cardscp.SubRank > 0) { foreach (PlayerEntity player in Players) { if (ArePlayersInSameTeam(CurrentRoomState.CurrentHandState.Starter, player.PlayerId)) { player.Rank = CurrentRoomState.CurrentHandState.Rank / 2; } } } } } return(NextRankWorker(CurrentRoomState)); }
private static void UpdatePlayerRank(RoomState CurrentRoomState, int rankToAdd, PlayerEntity player) { //检查必打牌,default为5,10,K List <int> mandRanks = CurrentRoomState.roomSetting.GetManditoryRanks(); int index = mandRanks.BinarySearch(player.Rank); if (index >= 0) { index++; } else { index = ~index; } if (index < mandRanks.Count) { player.Rank = Math.Min(player.Rank + rankToAdd, mandRanks[index]); } else { player.Rank = player.Rank + rankToAdd; } }
/// <summary> /// calculate the next state of this game /// </summary> /// <param name="starter">player id of the starter of this ending hand</param> /// <param name="score">socre got by the team without starter</param> /// <returns>the starter of next hand</returns> public PlayerEntity NextRankWorker(RoomState CurrentRoomState) { string starter = CurrentRoomState.CurrentHandState.Starter; int score = CurrentRoomState.CurrentHandState.Score; PlayerEntity nextStarter = null; if (!Players.Exists(p => p != null && p.PlayerId == starter)) { //log return(null); } GameTeam starterTeam = Players.Single(p => p.PlayerId == starter).Team; if (score >= 80) { nextStarter = GetNextPlayerAfterThePlayer(false, starter); int rankToAdd = (score - 80) / 40; foreach (PlayerEntity player in Players) { if (player == null) { continue; } if (player.Team != starterTeam && !CurrentRoomState.roomSetting.GetManditoryRanks().Contains(player.Rank)) { UpdatePlayerRank(CurrentRoomState, rankToAdd, player); } } } else { nextStarter = GetNextPlayerAfterThePlayer(true, starter); int rankToAdd = 1; if (score <= 0) { rankToAdd = Math.Abs(score) / 40 + 3; } else if (score < 40) { rankToAdd = 2; } else { rankToAdd = 1; } foreach (PlayerEntity player in Players) { if (player == null) { continue; } if (player.Team == starterTeam) { UpdatePlayerRank(CurrentRoomState, rankToAdd, player); } } } return(nextStarter); }