using System;
using System.Collections.Generic;
using System.Linq;
using GameMessage;
namespace GameFix.Poker
{
///
/// 连炸 (3连以上)
/// CardStyleInfo.CustomInt: 表示几个相同炸弹组成
///
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 GetAllEatTipGroup(CardBaseGroup group, CardStyleInfo eatStyleInfo)
{
var groupCnt = group.CardGroupList.Count;
var groupList = new List(groupCnt);
// 找最大的连炸
List continuousList = new List();
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 GetAllEatTipGroupWithLZ(CardBaseGroup group, CardStyleInfo eatStyleInfo)
{
var groupList = new List();
// 找最大的连炸
List continuousList = new List();
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;
}
}
}