Esempio n. 1
0
 private void LoadTtFile(string fileName)
 {
     //reads TT file
     using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
         using (var reader = new BinaryReader(stream))
         {
             AirTactics        = reader.ReadInt16();
             GroundTactics     = reader.ReadInt16();
             NavalTactics      = reader.ReadInt16();
             FirstAirTactic    = 1;
             FirstGroundTactic = (short)(1 + AirTactics);
             FirstNavalTactic  = (short)(1 + AirTactics + GroundTactics);
             TotalTactics      = (short)(1 + AirTactics + GroundTactics + NavalTactics);
             TacticsTable      = new TacticData[TotalTactics];
             for (var i = 0; i < TacticsTable.Length; i++)
             {
                 TacticsTable[i] = new TacticData(stream);
             }
         }
 }
Esempio n. 2
0
        internal Dictionary <PlayerData, KeyValuePair <PositionData, SideData> > BestLineUpForTactic(TacticData tactic, BackgroundWorker worker)
        {
            // Assumes the selected goalkeeper can't be a better choice at another position.
            // The side is useless here.
            PlayerData gkPlayer = GetSquadBestPlayerByPositionAndSide(PlayerData.Instances, PositionData.GK, SideData.C);

            List <PlayerData> fullSquadWithoutSelectedGk = new List <PlayerData>(PlayerData.Instances);

            fullSquadWithoutSelectedGk.Remove(gkPlayer);

            var bestPlayersByPosition = new Dictionary <KeyValuePair <PositionData, SideData>, Dictionary <PlayerData, int> >();

            foreach (KeyValuePair <PositionData, SideData> positionAndSide in tactic.Positions)
            {
                if (bestPlayersByPosition.ContainsKey(positionAndSide))
                {
                    continue;
                }
                bestPlayersByPosition.Add(positionAndSide,
                                          fullSquadWithoutSelectedGk
                                          .Select(p =>
                                                  new Tuple <PlayerData, int>(p,
                                                                              p.GlobalRate * p.Positions[positionAndSide.Key] * p.Sides[positionAndSide.Value]))
                                          .OrderByDescending(p => p.Item2)
                                          .ToDictionary(p => p.Item1, p => p.Item2));
            }

            var linesUp = new ConcurrentDictionary <Dictionary <PlayerData, KeyValuePair <PositionData, SideData> >, int>();

            System.Threading.Tasks.Parallel.For(0, _parallelSequences.Count, (int i) =>
            {
                var subBestLineUp = new Dictionary <PlayerData, KeyValuePair <PositionData, SideData> >();
                // NB : the line-up rate doesn't include the GK (it's not required).
                int subBestLineUpRate = 0;

                int count = 0;
                foreach (HashSet <int> sequence in _parallelSequences[i])
                {
                    count++;

                    if (count % 10000 == 0 && i == 0)
                    {
                        worker.ReportProgress(Convert.ToInt32(count / (decimal)_parallelSequences[i].Count * 100));
                    }

                    var currentLineUp     = new Dictionary <PlayerData, KeyValuePair <PositionData, SideData> >();
                    int currentLineUpRate = 0;
                    foreach (int tacticTupleIndex in sequence)
                    {
                        KeyValuePair <PositionData, SideData> tacticTuple = tactic.PositionAt(tacticTupleIndex);

                        PlayerData pickP = null;
                        int valueP       = -1;
                        foreach (PlayerData currentP in bestPlayersByPosition[tacticTuple].Keys)
                        {
                            if (!currentLineUp.ContainsKey(currentP))
                            {
                                pickP  = currentP;
                                valueP = bestPlayersByPosition[tacticTuple][currentP];
                                break;
                            }
                        }

                        if (pickP != null)
                        {
                            currentLineUpRate += valueP;
                        }
                        currentLineUp.Add(pickP, tacticTuple);
                    }

                    if (currentLineUpRate > subBestLineUpRate)
                    {
                        subBestLineUp     = currentLineUp;
                        subBestLineUpRate = currentLineUpRate;
                    }
                }

                if (!linesUp.TryAdd(subBestLineUp, subBestLineUpRate))
                {
                    throw new NotImplementedException();
                }
            });

            var bestLineUp = linesUp.OrderByDescending(kvp => kvp.Value).First().Key;

            bestLineUp.Add(gkPlayer, new KeyValuePair <PositionData, SideData>(PositionData.GK, SideData.C));

            return(bestLineUp);
        }