public void Shuffle()
{
if (CardList.Count > 0)
{
if (Convert.ToBoolean(AppConfig.GetValue("UseNewShuffle")))
{
string notes = Environment.NewLine + Environment.NewLine + "洗牌";
int N = CardList.Count;
notes += N.ToString() + "张:" + Environment.NewLine;
List<int> IntList = new List<int>(N);
for (int i = 0; i < N; i++)
{
IntList.Add(i);
}
Random rnd = new Random();
List<Card> CardListTemp1 = new List<Card>(N);
List<Card> CardListTemp2 = new List<Card>(N);
Dictionary<string, int> UnitNameDict = new Dictionary<string, int>();
foreach (Card card in CardList)
{
notes += card.CardName + Environment.NewLine;
if (UnitNameDict.Keys.Contains<string>(card.UnitName))
{
UnitNameDict[card.UnitName]++;
}
else
{
UnitNameDict.Add(card.UnitName, 1);
}
}
for (int i = 0; i < N; i++)
{
CardListTemp1.Add(null);
}
foreach (KeyValuePair<string, int> pair in UnitNameDict.OrderByDescending(pair => pair.Value))
{
List<int> IntListTemp = new List<int>();
IntListTemp.AddRange(IntList);
notes += "插入" + pair.Value.ToString() + "张" + pair.Key + Environment.NewLine;
int divides = IntList.Count / pair.Value;
int remain = IntList.Count % pair.Value;
for (int i = 0; i < pair.Value; i++)
{
int number;
int StartPos = 0;
int EndPos = 0;
if (remain != 0)
{
if (i == 0)
{
StartPos = 0;
EndPos = divides;
}
else if (i < remain)
{
StartPos = i * (divides + 1);
EndPos = StartPos + divides;
}
else if (i == remain)
{
StartPos = remain * (divides + 1);
EndPos = StartPos + divides - 1;
}
else
{
StartPos = i * divides + remain;
EndPos = StartPos + divides - 1;
}
}
else
{
StartPos = i * divides;
EndPos = (i + 1) * divides - 1;
}
number = rnd.Next(StartPos, EndPos + 1);
notes += "(" + StartPos.ToString() + "~" + EndPos.ToString() + ") => " + number.ToString() + " => ";
int cardtomovenumber = 0;
foreach (Card card in CardList)
{
if (card.UnitName == pair.Key)
{
cardtomovenumber = CardList.IndexOf(card);
break;
}
}
int cardnumbernew = IntList[number];
notes += cardnumbernew.ToString() + Environment.NewLine;
CardListTemp1.RemoveAt(cardnumbernew);
CardListTemp1.Insert(cardnumbernew, CardList[cardtomovenumber]);
IntListTemp.Remove(cardnumbernew);
CardList.RemoveAt(cardtomovenumber);
}
IntList = IntListTemp;
}
notes += Environment.NewLine + "平均分配后:" + Environment.NewLine;
foreach (Card card in CardListTemp1)
{
notes += card.CardName + Environment.NewLine;
}
int ShuffleTime = rnd.Next(5, 11);
notes += Environment.NewLine + "切洗" + ShuffleTime.ToString() + "次:" + Environment.NewLine;
for (int i = 0; i < ShuffleTime; i++)
{
CardListTemp2 = new List<Card>();
notes += "第" + (i + 1).ToString() + "次," + Environment.NewLine;
int StartPos = rnd.Next(CardListTemp1.Count);
int EndPos = rnd.Next(StartPos, CardListTemp1.Count);
for (int j = StartPos; j <= EndPos; j++)
{
CardListTemp2.Add(CardListTemp1[j]);
}
for (int j = 0; j < StartPos; j++)
{
CardListTemp2.Add(CardListTemp1[j]);
}
for (int j = EndPos + 1; j < CardListTemp1.Count; j++)
{
CardListTemp2.Add(CardListTemp1[j]);
}
notes += "将第" + (StartPos + 1).ToString() + "~" + (EndPos + 1).ToString() + "张卡抽出,置于最顶端后:" + Environment.NewLine;
foreach (Card card in CardListTemp2)
{
notes += card.CardName + Environment.NewLine;
}
CardListTemp1 = CardListTemp2;
}
CardList = CardListTemp1;
//using (StreamWriter writer = File.AppendText("ShuffleNotes.txt"))
//{
// writer.Write(notes);
//}
}
else
{
int N = CardList.Count;
int[] array = new int[N];
for (int i = 0; i < N; i++)
{
array[i] = i;
}
Random rnd = new Random();
for (int j = 0; j < N; j++)
{
int pos = rnd.Next(j, N);
int temp = array[pos];
array[pos] = array[j];
array[j] = temp;
}
List<Card> CardList_temp = new List<Card>();
for (int i = 0; i < N; i++)
{
CardList_temp.Add(CardList[array[i]]);
}
CardList = CardList_temp;
}
}
}