Files
hjha-server/GameFix/Common/Card/StyleChecker/Helper/CardStyleBomb123Helper.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

219 lines
8.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using GameMessage;
namespace GameFix.Poker
{
/// <summary>
/// 连炸 3连以上
/// CardStyleInfo.CustomInt: 表示几个相同炸弹组成
/// </summary>
public class CardStyleBomb123Helper : CardStyleBaseHelper
{
public override int CardStyle => DataCardConst.CardStyleBomb123;
public override int CardCnt => 12;
internal override bool CheckStyleNormal(CardBaseGroup group, out CardStyleInfo cardStyleInfo)
{
cardStyleInfo = null;
if (group.Cards.Count >= CardCnt)
{
var keysCnt = group.CardGroupDic.Keys.Count;
if (keysCnt != 1) return false;
var bombSize = group.CardGroupDic.Keys.First(); // 单个炸弹的大小
if (bombSize < 4) return false;
// 判断是否连续
if (IsContinuous(group.CardGroupList, bombSize, out var shunCnt)
&& shunCnt.Count * bombSize == group.Cards.Count)
{
cardStyleInfo = CardStyleHelper.CreateCardStyleInfo(CardStyle, group.Cards);
cardStyleInfo.CustomInt = group.Cards.Count / bombSize;
return true;
}
}
return false;
}
internal override bool CheckStyleWithLZ(CardBaseGroup group, out CardStyleInfo cardStyleInfo)
{
cardStyleInfo = null;
if (group.Cards.Count < CardCnt) return false;
var lzCnt = group.LZCards.Count;
var bombSize = group.CardGroupDic.Keys.Max(); // 最大的数量作为单个炸弹的大小
if (bombSize < 4) lzCnt -= (bombSize - 4);
if (lzCnt < 0) return false;
for (int i = 0; i < group.CardGroupDic.Keys.Count; i++)
{
var key = group.CardGroupDic.Keys.ElementAt(i);
var vList = group.CardGroupDic[key];
var diffSize = bombSize - key;
lzCnt -= diffSize * vList.Count;
if (lzCnt < 0) return false;
}
// 判断是否连续
if (IsMaxContinuousByLZ(group.CardGroupList, bombSize, group.LZCards.Count,
out var shunValueList, out var lackValueList)
&& shunValueList.Count * bombSize == group.Cards.Count)
{
cardStyleInfo = new CardStyleInfo(CardStyle, shunValueList[0], shunValueList.Count * bombSize);
cardStyleInfo.CardLackValues = lackValueList.ToArray();
cardStyleInfo.CustomInt = group.Cards.Count / bombSize;
return true;
}
return false;
}
internal override List<CardGroupList> GetAllEatTipGroup(CardBaseGroup group, CardStyleInfo eatStyleInfo)
{
var groupCnt = group.CardGroupList.Count;
var groupList = new List<CardGroupList>(groupCnt);
// 找最大的连炸
List<Card> continuousList = new List<Card>();
int minBombSize = Int32.MaxValue;
for (int i = 0; i < group.CardGroupList.Count; i++)
{
if (group.CardGroupList[i].Count >= 4)
{
minBombSize = Math.Min(minBombSize, group.CardGroupList[i].Count);
continuousList.AddRange(group.CardGroupList[i]);
} else if (continuousList.Count >= CardCnt)
{
// 把一些多余的牌删除
var filterList = continuousList.GroupBy(c=>c.Value)
.Select(g=>
Tuple.Create(g.Key,g.ToList().GetRange(0, minBombSize)))
.SelectMany(g=>g.Item2)
.ToList();
// 判断是否属于连炸
var targetGroup = group.mDeck.CreateCardGroup(filterList);
if (targetGroup.GetCardStyleInfo().CardStyle == CardStyle)
{
groupList.Add(new CardGroupList(filterList));
}
minBombSize = Int32.MaxValue;
continuousList.Clear();
}
else if (continuousList.Count > 0)
{
minBombSize = Int32.MaxValue;
continuousList.Clear();
}
}
return groupList;
}
internal override List<CardGroupList> GetAllEatTipGroupWithLZ(CardBaseGroup group, CardStyleInfo eatStyleInfo)
{
var groupList = new List<CardGroupList>();
// 找最大的连炸
List<Card> continuousList = new List<Card>();
int lzCnt = group.LZCards.Count;
int continuousCnt = 0;
// 2233344444555
for (int i = 0; i < group.CardGroupList.Count; i++)
{
continuousList.Clear();
continuousCnt = 0;
for (int j = 0; j < group.CardGroupList.Count; j++)
{
var index = i + j;
if (index >= group.CardGroupList.Count) break;
if (group.CardGroupList[index].Count == 0) break;
if (group.CardGroupList[index].Count >= 4
|| group.CardGroupList[index].Count + lzCnt >= 4)
{
continuousList.AddRange(group.CardGroupList[index]);
continuousCnt++;
if (continuousCnt >= 3)
{
groupList.Add(new CardGroupList(continuousList));
}
} else
{
continuousList.Clear();
continuousCnt = 0;
}
}
}
// 继续检查每个连炸是否符合要求
for (int i = groupList.Count - 1; i >= 0 ; i--)
{
var bomb = groupList[i];
var bombDict = bomb.GroupBy(c => c.Value)
.ToDictionary(g => g.Key, g => g.ToList());
var bombLine = bombDict.Values.Select(g => g.Count).ToList();
var bombMax = bombLine.Max();
int needCnt = 0;
if (bombMax >= 4)
{
int oldBomMax = bombMax;
while (bombMax >= 4)
{
needCnt = 0;
for (int j = 0; j < bombLine.Count; j++)
{
needCnt += bombMax - bombLine[j];
}
if (needCnt <= lzCnt) break;
bombMax--;
}
if (needCnt > lzCnt)
{
groupList.RemoveAt(i);
continue;
}
// 删除多余得牌
foreach (var bd in bombDict)
{
var rmCards = bd.Value.GetRange(0, oldBomMax - bombMax);
for (int j = rmCards.Count - 1; j >= 0 ; j--)
{
bomb.Remove(rmCards[j]);
}
}
}
else
{
for (int j = 0; j < bombLine.Count; j++)
{
needCnt += 4 - bombLine[j];
}
if (needCnt > lzCnt)
{
groupList.RemoveAt(i);
continue;
}
}
// 再检验一次
bomb.AddRange(group.LZCards.GetRange(0, needCnt));
var bombGroup = group.mDeck.CreateCardGroup(bomb);
if (bombGroup.GetCardStyleInfo().CardStyle != CardStyle)
{
groupList.RemoveAt(i);
}
}
return groupList;
}
}
}