コード例 #1
0
        // взять игрока из команды для события
        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("Подходящего игрока не найдено!");
        }
コード例 #2
0
ファイル: MatchForm.cs プロジェクト: naka0405/ALEVEL-Examples
        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;
            }
        }