Files
hjha-server/GameFix/Common/Card/StyleChecker/Helper/CardStyleJokerBombHelper.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

168 lines
6.9 KiB
C#

using System.Collections.Generic;
using System.Linq;
using GameMessage;
namespace GameFix.Poker
{
/// <summary>
/// 带王炸弹 (四张以上)
/// </summary>
public class CardStyleJokerBombHelper : CardStyleBombHelper
{
public override int CardStyle => DataCardConst.CardStyleJokerBomb;
public override int CardCnt => 4;
private bool isAllJoker = true; // 是否可以组成全王炸弹
public CardStyleJokerBombHelper()
{
}
public CardStyleJokerBombHelper(bool allJoker)
{
isAllJoker = allJoker;
}
internal override bool CheckStyleNormal(CardBaseGroup group, out CardStyleInfo cardStyleInfo)
{
cardStyleInfo = null;
if (group.Cards.Count >= CardCnt)
{
// 先排除王
var bombCards = group.Cards.Where(x=>!DataCardConst.JokerValues.Contains(x.Value)).ToList();
// 判断是否都是王
if (isAllJoker && bombCards.Count == 0)
{
cardStyleInfo = new CardStyleInfo(CardStyle, DataCardConst.JokerValues[0], group.Cards.Count);
return true;
}
if (IsAllSame(bombCards) && bombCards.Count >= CardCnt)
{
cardStyleInfo = new CardStyleInfo(CardStyle, bombCards.First().Value, group.Cards.Count);
return true;
}
}
return false;
}
internal override bool CheckStyleWithLZ(CardBaseGroup group, out CardStyleInfo cardStyleInfo)
{
cardStyleInfo = null;
if (group.Cards.Count < CardCnt) return false;
if (group.LZCards.Count == group.Cards.Count && IsAllSame(group.LZCards))
{
cardStyleInfo = CardStyleHelper.CreateCardStyleInfo(CardStyle, group.LZCards);
return true;
}
// 先排除王
var bombCards = group.NoLZCards.Where(x=>!DataCardConst.JokerValues.Contains(x.Value)).ToList();
// 判断是否都是王
if (isAllJoker && bombCards.Count == 0)
{
cardStyleInfo = new CardStyleInfo(CardStyle, DataCardConst.JokerValues[0], group.Cards.Count);
return true;
}
if (IsAllSame(bombCards) && bombCards.Count + group.LZCards.Count >= CardCnt)
{
var cardV = bombCards[0].Value;
cardStyleInfo = new CardStyleInfo(CardStyle, cardV, group.Cards.Count);
cardStyleInfo.CardLackValues = Enumerable.Repeat((int)cardV, group.LZCards.Count).ToArray();
return true;
}
return false;
}
internal override List<CardGroupList> GetAllEatTipGroup(CardBaseGroup group, CardStyleInfo eatStyleInfo)
{
var groupCnt = group.CardGroupList.Count;
var groupList = new List<CardGroupList>(groupCnt);
var jokerList = group.Cards.Where(x=>DataCardConst.JokerValues.Contains(x.Value)).ToList();
if (eatStyleInfo == null)
eatStyleInfo = new CardStyleInfo(CardStyle, 0, CardCnt);
if (isAllJoker && jokerList.Count >= CardCnt)
{ // 先提示全王
var tmpStyleInfo = new CardStyleInfo(CardStyle, DataCardConst.JokerValues[0], jokerList.Count);
if (group.mStyleComparer.Greater(tmpStyleInfo, eatStyleInfo))
{
groupList.Add(new CardGroupList(jokerList));
}
}
var filterGroupList = group.CardGroupList.Where(x => x.Count >= CardCnt).ToList();
for (int i = 0; i < filterGroupList.Count; i++)
{
var cardGroup = filterGroupList[i];
if (IsJoker(cardGroup)) continue;
var tmpStyleInfo = new CardStyleInfo(CardStyle, cardGroup.First().Value, cardGroup.Count);
if (group.mStyleComparer.Greater(tmpStyleInfo, eatStyleInfo) && filterGroupList.Count > 1)
{
groupList.Add(new CardGroupList(cardGroup));
} else {
tmpStyleInfo = new CardStyleInfo(CardStyle, cardGroup.First().Value, cardGroup.Count + jokerList.Count);
if (group.mStyleComparer.Greater(tmpStyleInfo, eatStyleInfo))
{
var cardGroupList = new CardGroupList(cardGroup);
cardGroupList.AddRange(jokerList);
groupList.Add(cardGroupList);
}
}
}
return groupList;
}
/// <summary>
/// 获取所有得炸弹
/// </summary>
public List<CardGroupList> GetAllBombs(CardBaseGroup group)
{
List<CardGroupList> groupList = new List<CardGroupList>();
var jokerList = group.Cards
.Where(x => DataCardConst.JokerValues.Contains(x.Value) && x.CardType != DataCardConst.CardTypeLZ)
.ToList();
var descCardGroupList = group.CardGroupList.Select(x => x).OrderByDescending(x => x.Count).ToList();
var lzCnt = group.LZCards.Count;
for (int i = 0; i < descCardGroupList.Count; i++)
{
if (IsJoker(descCardGroupList[i]) ||descCardGroupList[i].Count + lzCnt < CardCnt) continue;
CardGroupList cardGroupList = new CardGroupList();
cardGroupList.AddRange(descCardGroupList[i]);
if (lzCnt > 0)
{
cardGroupList.AddRange(group.LZCards);
lzCnt = 0;
}
if (jokerList.Count > 0)
{
cardGroupList.AddRange(jokerList);
jokerList.Clear();
}
CardStyleInfo styleInfo =
new CardStyleInfo(CardStyle, descCardGroupList[i].First().Value, cardGroupList.Count);
cardGroupList.CardStyleInfo = styleInfo;
groupList.Add(cardGroupList);
}
if (jokerList.Count > CardCnt && isAllJoker)
{
CardGroupList cardGroupList = new CardGroupList();
cardGroupList.AddRange(jokerList);
jokerList.Clear();
CardStyleInfo styleInfo =
new CardStyleInfo(CardStyle, jokerList.First().Value, cardGroupList.Count);
cardGroupList.CardStyleInfo = styleInfo;
groupList.Add(cardGroupList);
}
return groupList;
}
}
}