// взять игрока из команды для события Player getAppropriatePlayer(MatchEvent e, Team team) { Random r = new Random(); var playerMatchUp = new Dictionary <Player, double>(); // игрок/вероятность список игроков // по аналогии с вероятностью событий высчитываем максимальный Рейтинг double MaxWeight = team.Select(x => x.Rating).Sum(); foreach (Player p in team) { playerMatchUp.Add(p, ((p.Rating * 100) / MaxWeight)); // по мат. пропорции записываем игрока и его вероятность в список } int Number = r.Next(1, 100); double nearest = 0; foreach (var kvp in playerMatchUp) { if ((Number <= nearest + kvp.Value) && (kvp.Key.Position != PLAYER_POSITION.BENCHWARMER)) // проверка на запасного игрока (запасные не могут забивать) { return(kvp.Key); } else { nearest += kvp.Value; } } throw new Exception("Подходящего игрока не найдено!"); }
private void matchTimer_Tick(object sender, EventArgs e) { /* * Сделать реализацию событий единым списком: во время загрузки матча * весь матч забивается в коллекцию событий, запускается таймер и по каждому тику берется одно * событие и выводится в лог * Плюсы: * 1) разгружаем вычисления по тику таймера * 2) легкость реализации системы "реплеев" * Минусы: * 1) реализация доп. хранилища * 2) "обман" пользователя */ string currentEventMessage = ""; // текущее сообщение по событию string time; // текущее время на таймере MatchEvent currentEvent; // текущее событие Team eventTeam = (r.Next(0, 2) == 0 ? currentMatch.Team1 : currentMatch.Team2); if (tbSpeed.Value == 4) { matchTimeSeconds += 10; } else { matchTimeSeconds++; } // условно 1 тик таймера принимается за 10 сек реального времени матча if (matchTimeSeconds >= 60) // каждые 60 секунд { matchTimeSeconds = 0; // сбрасываем текущие секунды matchTimeMinute++; // наращиваем минуту currentEvent = eventList.GetNewEvent(eventTeam, out currentEventMessage); // вызов ивента в зависимости от команды , внутренее определение сообщения события } else { currentEvent = new MatchEvent(); } // отображение времени таймера на форме if (tbSpeed.Value == 4) { time = lbTime.Text = String.Format("{0:00}:{1}{2}", matchTimeMinute, matchTimeSeconds / 10, r.Next(0, 9)); } else { time = lbTime.Text = String.Format("{0:00}:{1:00}", matchTimeMinute, matchTimeSeconds); } // результаты на события if (currentEvent.Type != TYPE_EVENT.NOTHINHG) { rtbMatchLog.Text += time + " " + currentEventMessage + "\r\n"; } if (currentEvent.Type == TYPE_EVENT.GOAL) { if (currentMatch.Team1 == eventTeam) { currentMatch.MatchScore.Team1++; } else { currentMatch.MatchScore.Team2++; } lbScore.Text = currentMatch.MatchScore.ToString(); } if (matchTimeMinute == 90) // остановка таймера на 90 минуте { lbTime.Text = "90:00"; matchTimer.Stop(); btStop.Enabled = false; } }