public void Setup() { List <Card> cards = new List <Card>(); for (var i = 1; i <= DifferentCards; i++) { for (var j = 0; j < 4; j++) { cards.Add(new Card() { Value = i, FacingUp = false }); } } cards.Shuffle(); for (var i = 0; i < 4; i++) { Side.Add(cards[0]); cards.RemoveAt(0); } Table = new Card[Columns, 4]; for (var i = 0; i < Columns; i++) { for (var j = 0; j < 4; j++) { Table[i, j] = cards[0]; cards.RemoveAt(0); } } }
private void FillDiceSides() { Side.Add(1, Constants.DOT); Side.Add(2, Constants.LEFT); Side.Add(3, Constants.DOT); Side.Add(4, Constants.CENTER); Side.Add(5, Constants.DOT); Side.Add(6, Constants.RIGHT); }
public void AddSide(int cardId) { Card card = Card.Get(cardId); if (card == null) { return; } if ((card.Data.Type & (int)CardType.Token) != 0) { return; } if (Side.Count < 15) { Side.Add(cardId); } if (!Alls.Contains(cardId)) { Alls.Add(cardId); } }
public List <Match> MatchmakeForCBT1( int matchmakeNum, List <Matching.IBattleEntry> entries, int minMatchmakeEntriedPlayersNumber ) { var ret = new List <Match>(); // count entriedPlayers var entriedPlayersCnt = 0; foreach (var entry in entries) { entriedPlayersCnt += entry.Players.Count; } if (entriedPlayersCnt < minMatchmakeEntriedPlayersNumber) { return(ret); } var subEntries = new List <Matching.IBattleEntry>(); while (true) { if (matchmakeNum <= ret.Count) { break; } if (entries.Count <= 0) { break; } // Current entry. var currentEntry = entries[0]; entries.RemoveAt(0); // Create candidates list. var rand = new Random(); var candidatesList = new List <Matching.IBattleEntry>(); foreach (var entry in subEntries) { if (MaxCandidatesNum <= candidatesList.Count) { break; } candidatesList.Add(entry); } foreach (var entry in entries) { if (MaxCandidatesNum <= candidatesList.Count) { break; } var idx = rand.Next(candidatesList.Count + 1); candidatesList.Insert(idx, entry); } var removeEntries = new Dictionary <ulong, int>(); var sideA = new Side(); var sideB = new Side(); sideA.Add(currentEntry); while (true) { var currentSide = (sideA.PlayersCount < sideB.PlayersCount) ? sideA : sideB; var opponetSide = (currentSide == sideA) ? sideB : sideA; var hit = false; for (int i = 0; i < candidatesList.Count; i++) { var targetEntry = candidatesList[i]; if (!currentSide.CanAdd(targetEntry)) { continue; } currentSide.Add(targetEntry); candidatesList.RemoveAt(i); hit = true; break; } if (!hit) { break; } if (evolib.Battle.MatchPlayersNum <= (sideA.PlayersCount + sideB.PlayersCount)) { // establishment var m = new Match { Elements = new List <Match.Element>(), }; sideA.ForEach(e => { m.Elements.Add(new Match.Element { Side = evolib.Battle.Side.Earthnoid, Entry = e, }); removeEntries[e.EntryId] = 0; }); sideB.ForEach(e => { m.Elements.Add(new Match.Element { Side = evolib.Battle.Side.Spacenoid, Entry = e, }); removeEntries[e.EntryId] = 0; }); ret.Add(m); break; } } for (int i = 0; i < entries.Count;) { if (removeEntries.ContainsKey(entries[i].EntryId)) { entries.RemoveAt(i); continue; } i++; } for (int i = 0; i < subEntries.Count;) { if (removeEntries.ContainsKey(subEntries[i].EntryId)) { subEntries.RemoveAt(i); continue; } i++; } if (!removeEntries.ContainsKey(currentEntry.EntryId)) { //because match not establishment subEntries.Add(currentEntry); } } return(ret); }
public List <Match> Matchmake( int matchmakeNum, List <Matching.IBattleEntry> entries, int minMatchmakeEntriedPlayersNumber ) { var ret = new List <Match>(); // count entriedPlayers var entriedPlayersCnt = 0; foreach (var entry in entries) { entriedPlayersCnt += entry.Players.Count; } if (entriedPlayersCnt < minMatchmakeEntriedPlayersNumber) { return(ret); } var subEntries = new List <Matching.IBattleEntry>(); while (true) { if (matchmakeNum <= ret.Count) { break; } if (entries.Count <= 0) { break; } // Current entry. var currentEntry = entries[0]; entries.RemoveAt(0); // Create candidates list. var candidatesList = new List <Matching.IBattleEntry>(); foreach (var entry in entries) { if (MaxCandidatesNum <= candidatesList.Count) { break; } if (CheckForCandidates(currentEntry, entry)) { candidatesList.Add(entry); } } foreach (var entry in subEntries) { if (MaxCandidatesNum <= candidatesList.Count) { break; } if (CheckForCandidates(currentEntry, entry)) { candidatesList.Add(entry); } } var removeEntries = new Dictionary <ulong, int>(); var sideA = new Side(); var sideB = new Side(); sideA.Add(currentEntry); while (true) { var bestEntry = new BestEntry(); bestEntry.score = float.MinValue; var currentSide = (sideA.PlayersCount < sideB.PlayersCount) ? sideA : sideB; var opponetSide = (currentSide == sideA) ? sideB : sideA; for (int i = 0; i < candidatesList.Count; i++) { var targetEntry = candidatesList[i]; if (!currentSide.CanAdd(targetEntry)) { continue; } var distance = 0f; // distance += MathF.Pow( Func_DiffGroupSize(opponetSide.MaxGroupSize - targetEntry.Players.Count), 2 ); // distance += MathF.Pow( Func_DiffMatchRatingAvg( (currentSide.RatingSum + targetEntry.RatingSum) / (currentSide.PlayersCount + targetEntry.Players.Count) - opponetSide.RatingSum / opponetSide.PlayersCount), 2 ); // //distance += MathF.Pow( // Func_DiffMatchPingAvg(matchPingAvg - targetEntry.PingAvg), // 2); // distance -= MathF.Pow( Func_ElapsedTimeValue((float)targetEntry.WaitingTime.TotalSeconds), 2 ); var score = -distance; if (bestEntry.score < score) { bestEntry.entry = targetEntry; bestEntry.index = i; bestEntry.score = score; } } if (bestEntry.entry == null) { break; } currentSide.Add(bestEntry.entry); candidatesList.RemoveAt(bestEntry.index); if (evolib.Battle.MatchPlayersNum <= (sideA.PlayersCount + sideB.PlayersCount)) { // establishment var m = new Match { Elements = new List <Match.Element>(), }; sideA.ForEach(e => { m.Elements.Add(new Match.Element { Side = evolib.Battle.Side.Earthnoid, Entry = e, }); removeEntries[e.EntryId] = 0; }); sideB.ForEach(e => { m.Elements.Add(new Match.Element { Side = evolib.Battle.Side.Spacenoid, Entry = e, }); removeEntries[e.EntryId] = 0; }); ret.Add(m); break; } } for (int i = 0; i < entries.Count;) { if (removeEntries.ContainsKey(entries[i].EntryId)) { entries.RemoveAt(i); continue; } i++; } for (int i = 0; i < subEntries.Count;) { if (removeEntries.ContainsKey(subEntries[i].EntryId)) { subEntries.RemoveAt(i); continue; } i++; } if (!removeEntries.ContainsKey(currentEntry.EntryId)) { //because match not establishment subEntries.Add(currentEntry); } } return(ret); }
public bool Play(bool print) { // Take the first card on the top left Hand = Side.First(); Hand.FacingUp = true; Side.RemoveAt(0); while (!Finished) { // If we find the same value for (var i = 0; i < Columns; i++) { if (Table[i, 0].Value == Hand.Value && Table[i, 0].FacingUp) { for (var j = 0; j < 4; j++) { if (!Table[i, j].FacingUp) { var temp = Table[i, j]; Table[i, j] = Hand; Hand = temp; Hand.FacingUp = true; goto PRINT; } } } } // If we find a card facing down in the top place of the column for (var i = 0; i < Columns; i++) { if (!Table[i, 0].FacingUp) { var temp = Table[i, 0]; Table[i, 0] = Hand; Hand = temp; Hand.FacingUp = true; goto PRINT; } } foreach (Card card in Side) { if (!card.FacingUp) { var temp = card; Side.Remove(card); Side.Add(Hand); Hand = temp; Hand.FacingUp = true; goto PRINT; } } // We reach here if it's the end of the game and we have to put our hand card in the Side column Side.Add(Hand); Hand = null; PRINT: if (print) { PrintTable(); Thread.Sleep(500); } } for (var i = 0; i < Columns; i++) { for (var j = 0; j < 4; j++) { if (!Table[i, j].FacingUp) { Table[i, j].FacingUp = true; } } } if (print) { PrintTable(); } return(Won); }