コード例 #1
0
ファイル: InningsParser.cs プロジェクト: bugedone/somerset
        private static void ProcessExtras(HtmlNode row, Innings innings)
        {
            string extrasText = row.SelectSingleNode("./td[2]").InnerText;

            int total;

            if (int.TryParse(row.SelectSingleNode("./td[3]").InnerText, out total))
            {
                innings.Extras = total;
            }

            var m = Regex.Match(extrasText, @"\(?(?:(?'byes'\d+)\sb)?(?:,\s)?(?:(?'legbyes'\d+)\slb)?(?:,\s)?(?:(?'noballs'\d+)\snb)?(?:,\s)?(?:(?'wides'\d+)\sw)?\)?");
            int byes;
            int legByes;
            int noBalls;
            int wides;

            if (int.TryParse(m.Groups["byes"].Value, out byes))
            {
                innings.Byes = byes;
            }
            if (int.TryParse(m.Groups["legbyes"].Value, out legByes))
            {
                innings.LegByes = legByes;
            }
            if (int.TryParse(m.Groups["noballs"].Value, out noBalls))
            {
                innings.NoBalls = noBalls;
            }
            if (int.TryParse(m.Groups["wides"].Value, out wides))
            {
                innings.Wides = wides;
            }
        }
コード例 #2
0
ファイル: InningsParser.cs プロジェクト: bugedone/somerset
        private void AddBowling(HtmlNode bowlingNode, Innings innings)
        {
            HtmlNodeCollection rows = bowlingNode.SelectNodes(".//tr");

            if (rows == null)
            {
                return;
            }
            if (rows.Count < 2)
            {
                Log.WarnFormat("Only found {0} lines in the bowling HTML. Expected at least 2", rows.Count);
                return;
            }

            innings.Bowling = new List <BowlerInnings>();

            string team = ExtractWhoseBowling(rows[0]);

            for (int i = 1; i < rows.Count; i++)
            {
                BowlerInnings bowler = ParseBowlerInnings(rows[i]);
                bowler.Number = i;
                bowler.Team   = team;
                innings.Bowling.Add(bowler);
            }
        }
コード例 #3
0
 public Game(Player p1, Player p2, Player activePlayer)
 {
     Player1      = p1;
     Player2      = p2;
     ActivePlayer = activePlayer;
     Innings.Add(new Inning(Player1, Player2));
 }
コード例 #4
0
ファイル: InningsParser.cs プロジェクト: bugedone/somerset
        private static void ExtractWhoseInnings(HtmlNode headerRow, Innings innings)
        {
            HtmlNode cell    = headerRow.SelectSingleNode("./td[1]");
            string   content = cell.InnerText;

            if (string.IsNullOrEmpty(content))
            {
                return;
            }

            content = content.Trim();
            if (content.EndsWith("first innings"))
            {
                innings.BattingTeam       = content.Substring(0, content.Length - 14).TrimEnd();
                innings.TeamInningsNumber = 1;
            }
            else if (content.EndsWith("second innings"))
            {
                innings.BattingTeam       = content.Substring(0, content.Length - 15).TrimEnd();
                innings.TeamInningsNumber = 2;
            }
            else if (content.EndsWith("second innings (following on)"))
            {
                innings.BattingTeam       = content.Substring(0, content.Length - 30).TrimEnd();
                innings.TeamInningsNumber = 2;
            }
            else if (content.EndsWith("innings"))
            {
                innings.BattingTeam       = content.Substring(0, content.Length - 8).TrimEnd();
                innings.TeamInningsNumber = 1;
            }
        }
コード例 #5
0
 public BoxScore()
 {
     Game        = new Game();
     Innings     = new Innings();
     PlayerGames = new PlayerGames();
     TeamGames   = new TeamGames();
 }
コード例 #6
0
        public void Undo()
        {
            switch (GameEvents.Pop())
            {
            case GameEvent.AddPoint:
                ActiveInning.Stats(ActivePlayer).Points--;
                break;

            case GameEvent.Safety:
                ActiveInning.Stats(ActivePlayer).Safeties--;
                break;

            case GameEvent.Miss:
                if (ActivePlayer == Player2)
                {
                    ActivePlayer = Player1;
                }
                else
                {
                    ActivePlayer = Player2;
                    Innings.RemoveAt(Innings.Count - 1);
                }
                break;

            case GameEvent.DeadBall:
                ActiveInning.Stats(ActivePlayer).DeadBalls--;
                break;

            case GameEvent.TimeOut:
                ActiveInning.Stats(ActivePlayer).TimeOuts--;
                break;
            }
        }
コード例 #7
0
ファイル: InningsParser.cs プロジェクト: bugedone/somerset
        private void AddBatting(HtmlNode battingNode, Innings innings)
        {
            HtmlNodeCollection rows = battingNode.SelectNodes(".//tr");

            ExtractWhoseInnings(rows[0], innings);

            innings.Batting = new List <BatsmanInnings>();

            int i = 1;

            while (i < rows.Count)
            {
                HtmlNode cell       = rows[i].SelectSingleNode("./td[1]");
                HtmlNode playerNode = cell.SelectSingleNode("./a");
                if (playerNode == null && (cell.InnerText == "Extras" || cell.InnerText == "Total" || cell.InnerText == "Innings Forfeited"))
                {
                    break;
                }
                BatsmanInnings batsman = ParseBatsmanInnings(rows[i], (innings.BattingTeam == "Somerset" && innings.TeamInningsNumber == 1));
                batsman.Number = i;
                batsman.Team   = innings.BattingTeam;
                innings.Batting.Add(batsman);

                i++;
            }

            while (i < rows.Count)
            {
                HtmlNode cell  = rows[i].SelectSingleNode("./td[1]");
                string   label = (cell != null ? cell.InnerText : null);
                if (string.IsNullOrEmpty(label))
                {
                    i++;
                    continue;
                }

                if (label == "Innings Forfeited")
                {
                    innings.Forfeited = true;
                    break;
                }

                if (label == "Extras")
                {
                    ProcessExtras(rows[i], innings);
                }
                if (label == "Total")
                {
                    ProcessTotal(rows[i], innings);
                }
                if (label == "Fall of wickets:")
                {
                    ProcessFallOfWickets(rows[i + 1], innings);
                    i++;
                }

                i++;
            }
        }
コード例 #8
0
ファイル: InningsParser.cs プロジェクト: bugedone/somerset
        public Innings Parse(HtmlNode battingNode, HtmlNode bowlingNode)
        {
            Innings innings = new Innings();

            AddBatting(battingNode, innings);
            AddBowling(bowlingNode, innings);
            return(innings);
        }
コード例 #9
0
        private void AddOver(Innings activeInnings, List <string> overData)
        {
            foreach (var eachBall in overData)
            {
                activeInnings.BallsPlayed++;
                activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).NoOfBalls++;

                if (eachBall == "1" || eachBall == "3")
                {
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).Score++;
                    var playerIdOnStrike = activeInnings.BattingStatistics
                                           .First(x => x.Status == PlayerStatus.OnStrikeEnd).PlayerId;


                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnNonStrikeEnd).Status =
                        PlayerStatus.OnStrikeEnd;
                    activeInnings.BattingStatistics.First(x =>
                                                          x.PlayerId.Equals(playerIdOnStrike, StringComparison.InvariantCultureIgnoreCase))
                    .Status = PlayerStatus.OnNonStrikeEnd;

                    activeInnings.TotalScore++;
                }
                else if (eachBall == "2")
                {
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).Score += 2;
                    activeInnings.TotalScore += 2;
                }
                else if (eachBall == "4")
                {
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).Score += 4;
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).Fours++;
                    activeInnings.TotalScore += 4;
                }
                else if (eachBall == "6")
                {
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).Score += 6;
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).Sixes++;
                    activeInnings.TotalScore += 6;
                }
                else if (eachBall == "W")
                {
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.OnStrikeEnd).Status = PlayerStatus.Out;
                    activeInnings.BattingStatistics.First(x => x.Status == PlayerStatus.YetToBat).Status    =
                        PlayerStatus.OnStrikeEnd;
                    activeInnings.WicketsDown++;
                }
                else if (eachBall == "Wd")
                {
                    activeInnings.Extras++;
                    activeInnings.TotalScore += 1;
                }
            }

            if (activeInnings.BallsPlayed == _repository.Match.NoOfOvers * 6)
            {
                activeInnings.IsInningsCompleted = true;
            }
        }
コード例 #10
0
    /// <summary>
    /// Adds out count.
    /// </summary>
    public static void AddOut(Out outs)
    {
        //Clears count.
        ClearCount();

        //Statistics.
        InGameManager.currentPitcher.stats.SetStat(0.1f, PlayerStatistics.PS.IP);
        InGameManager.currentBatter.stats.SetStat(1, PlayerStatistics.PS.AB);

        //Determine which out happened, and apply appropriate stats.
        if (outs == Out.STRIKEOUT)
        {
            InGameManager.currentPitcher.stats.SetStat(1, PlayerStatistics.PS.K_PIT);
            InGameManager.currentBatter.stats.SetStat(1, PlayerStatistics.PS.K_BAT);
            Debug.Log("STRIKEOUT");
        }
        else if (outs == Out.GROUND_BALL)
        {
            InGameManager.currentPitcher.stats.SetStat(1, PlayerStatistics.PS.GB_PIT);
            InGameManager.currentBatter.stats.SetStat(1, PlayerStatistics.PS.GB_BAT);
            Debug.Log("GROUNDBALL");
        }
        else if (outs == Out.FLY_BALL)
        {
            InGameManager.currentPitcher.stats.SetStat(1, PlayerStatistics.PS.FB_PIT);
            InGameManager.currentBatter.stats.SetStat(1, PlayerStatistics.PS.FB_BAT);
            Debug.Log("FLYBALL");
        }

        //Advance Batter.
        if (InGameManager.outCount < 2)
        {
            InGameManager.outCount++;
            if (InGameManager.currentAttack == InGameManager.game.home)
            {
                Innings.AdvanceBattingOrder(ref InGameManager.homeCurrentBattersIndex);
                AdvanceBatterToPlate();
            }
            else if (InGameManager.currentAttack == InGameManager.game.away)
            {
                Innings.AdvanceBattingOrder(ref InGameManager.awayCurrentBattersIndex);
                AdvanceBatterToPlate();
            }
        }
        else
        {
            if (InGameManager.isBottom)
            {
                Innings.AdvanceInning();
            }
            else
            {
                Innings.AdvanceInning();
            }
        }
    }
コード例 #11
0
    /// <summary>
    /// Conduct behaviours when a batter hit a ball in a common way.
    /// </summary>
    /// <param name="hit"></param>
    public static void AddHit(Hit hit, bool isITPHR = false)
    {
        //Clears count.
        AtPlate.ClearCount();

        if (InGameManager.isBottom)
        {
            InGameManager.game.homeScoreBoard.H++;
        }
        else
        {
            InGameManager.game.awayScoreBoard.H++;
        }

        //Add AB by 1.
        InGameManager.currentBatter.stats.SetStat(1, PlayerStatistics.PS.AB);
        InGameManager.currentBatter.stats.SetStat(1, PlayerStatistics.PS.H_BAT);

        if (hit == Hit.SINGLE)
        {
            currentBatter.stats.SetStat(1, PlayerStatistics.PS.SIN);
            BaseRunning.AdvanceRunner(1);
            Debug.Log("SINGLE");
        }
        else if (hit == Hit.DOUBLE)
        {
            currentBatter.stats.SetStat(1, PlayerStatistics.PS.DBL);
            BaseRunning.AdvanceRunner(2);
            Debug.Log("DOUBLE");
        }
        else if (hit == Hit.TRIPLE)
        {
            currentBatter.stats.SetStat(1, PlayerStatistics.PS.TRP);
            BaseRunning.AdvanceRunner(3);
            Debug.Log("TRIPLE");
        }
        else if (hit == Hit.HOME_RUN)
        {
            currentBatter.stats.SetStat(1, PlayerStatistics.PS.HR_BAT);
            if (isITPHR)
            {
                currentBatter.stats.SetStat(1, PlayerStatistics.PS.ITPHR);
            }
            BaseRunning.AdvanceRunner(4);
            Debug.Log("HOME RUN");
        }

        //If inning is over 9 and walked off, finishes game.
        if (InGameManager.currentInning > 9 && InGameManager.isBottom && InGameManager.game.homeScoreBoard.R > InGameManager.game.awayScoreBoard.R)
        {
            Innings.EndGame();
        }
    }
コード例 #12
0
 public void Miss()
 {
     if (ActivePlayer == Player1)
     {
         ActivePlayer = Player2;
     }
     else
     {
         ActivePlayer = Player1;
         Innings.Add(new Inning(Player1, Player2));
     }
     GameEvents.Push(GameEvent.Miss);
 }
コード例 #13
0
ファイル: InningsParser.cs プロジェクト: bugedone/somerset
        private void ProcessTotal(HtmlNode row, Innings innings)
        {
            string wicketsAndOvers = row.SelectSingleNode("./td[2]").InnerText;
            string totalText = row.SelectSingleNode("./td[3]").InnerText;
            int    wickets, overs, balls, total;

            if (!int.TryParse(totalText, out total))
            {
                total = 0;
            }

            var m = Regex.Match(wicketsAndOvers, @"\((?:(?'wickets'(?:\d+|no))\swickets?|(?'allout'all\sout))(?:,\s(?'dec'declared))?(?:,\s(?'mins'\d+) minutes)?(?:,\s(?:innings\sclosed,\s)?(?'overs'\d+)\.?(?'balls'\d)?\sovers)?\)");

            if (!string.IsNullOrEmpty(m.Groups["allout"].Value))
            {
                innings.AllOut = true;
            }
            else if (m.Groups["wickets"].Value == "no")
            {
                innings.Wickets = 0;
            }
            else if (int.TryParse(m.Groups["wickets"].Value, out wickets))
            {
                innings.Wickets = wickets;
            }
            if (!int.TryParse(m.Groups["overs"].Value, out overs))
            {
                overs = -1;
            }
            if (!int.TryParse(m.Groups["balls"].Value, out balls))
            {
                balls = 0;
            }
            if (!string.IsNullOrEmpty(m.Groups["dec"].Value))
            {
                innings.Declared = true;
            }

            if (overs != -1)
            {
                innings.Overs       = balls == 0 ? overs.ToString() : string.Format("{0}.{1}", overs, balls);
                innings.BallsBowled = (overs * _match.BallsPerOver) + balls;
            }
            innings.Total = total;
        }
コード例 #14
0
        private ScoreCard GetScoreCard(Innings activeInnings)
        {
            var playersScores = activeInnings.BattingStatistics.Select(x => new PlayerScores()
            {
                Sixes      = x.Sixes,
                Fours      = x.Fours,
                Score      = x.Score,
                Balls      = x.NoOfBalls,
                IsNotOut   = x.Status == PlayerStatus.OnStrikeEnd || x.Status == PlayerStatus.OnNonStrikeEnd,
                PlayerName = x.PlayerId
            });

            var scoreCard = new ScoreCard
            {
                PlayerScoresList = playersScores.ToList(),
                TotalBalls       = activeInnings.BallsPlayed,
                TotalScore       = activeInnings.TotalScore,
                WicketsDown      = activeInnings.WicketsDown
            };

            return(scoreCard);
        }
コード例 #15
0
ファイル: InningsParser.cs プロジェクト: bugedone/somerset
        private static void ProcessFallOfWickets(HtmlNode row, Innings innings)
        {
            List <FallOfWicket> fallOfWickets = new List <FallOfWicket>();

            // If we ever decide to add support for who the wicket was...
            MatchCollection matches = Regex.Matches(row.FirstChild.InnerHtml, @"(?'wicket'\d{1,2})-(?'runs'(?:\?|\d{1,3}))(?:\s\(<a\shref=""/Archive/Players/\d+/\d+/(?'player'\d+).html"">[^<]+</a>,\s(?'overs'\d+\.?\d?)\sov\))?");

            //MatchCollection matches = Regex.Matches(content, @"(?'wicket'\d{1,2})-(?'runs'(?:\?|\d{1,3}))");
            foreach (Match fall in matches)
            {
                int wicket = int.Parse(fall.Groups["wicket"].Value);
                int?runs   = null;
                if (fall.Groups["runs"].Value != "?")
                {
                    runs = int.Parse(fall.Groups["runs"].Value);
                }

                string overs  = fall.Groups["overs"].Value;
                string player = fall.Groups["player"].Value;

                FallOfWicket fow = new FallOfWicket
                {
                    Wicket = wicket,
                    Runs   = runs,
                    Overs  = overs
                };
                if (!string.IsNullOrEmpty(player))
                {
                    fow.OutBatsmanId = PlayerDetails.GenerateId(int.Parse(player));
                }

                fallOfWickets.Insert(wicket - 1, fow);
            }

            innings.FallOfWickets = fallOfWickets;
        }
コード例 #16
0
        public void StartInnings()
        {
            var homeTeam = Teams.FirstOrDefault(x => x.IsHomeTeam || x.IsTeam1).Id;
            var awayTeam = Teams.FirstOrDefault(x => !x.IsHomeTeam).Id;

            Enum.TryParse(this.Toss.TossDecisionType, true, out TossDecisionType decisionType);
            var innings = new Innings
            {
                InningsNumber = this.Innings.Count() + 1,
                InningsStatus = InningsStatus.InProgress
            };

            switch (innings.InningsNumber)
            {
            case 1:
                if (this.Toss.TeamWonTossId == homeTeam)
                {
                    innings.BattingTeamId = decisionType == TossDecisionType.Batting ? homeTeam : awayTeam;
                    innings.BowlingTeamId = decisionType == TossDecisionType.Batting ? awayTeam : homeTeam;
                }
                else
                {
                    innings.BattingTeamId = decisionType == TossDecisionType.Batting ? awayTeam : homeTeam;
                    innings.BowlingTeamId = decisionType == TossDecisionType.Batting ? homeTeam : awayTeam;
                }

                break;

            case 2:
                var finishedInnings = this.Innings.FirstOrDefault(x => x.InningsNumber == 1);
                if (finishedInnings != null && finishedInnings.BattingTeamId == homeTeam)
                {
                    innings.BattingTeamId = awayTeam;
                    innings.BowlingTeamId = homeTeam;
                }
                else
                {
                    innings.BattingTeamId = homeTeam;
                    innings.BowlingTeamId = awayTeam;
                }

                break;
            }

            if (this.EnforcedFollowOn)
            {
                switch (innings.InningsNumber)
                {
                case 3:
                {
                    var finishedInnings = this.Innings.FirstOrDefault(x => x.InningsNumber == 1);
                    if (finishedInnings != null && finishedInnings.BattingTeamId == homeTeam)
                    {
                        innings.BattingTeamId = awayTeam;
                        innings.BowlingTeamId = homeTeam;
                    }
                    else
                    {
                        innings.BattingTeamId = homeTeam;
                        innings.BowlingTeamId = awayTeam;
                    }

                    break;
                }

                case 4:
                {
                    var finishedInnings = this.Innings.FirstOrDefault(x => x.InningsNumber == 1);
                    if (finishedInnings != null && finishedInnings.BattingTeamId == homeTeam)
                    {
                        innings.BattingTeamId = homeTeam;
                        innings.BowlingTeamId = awayTeam;
                    }
                    else
                    {
                        innings.BattingTeamId = awayTeam;
                        innings.BowlingTeamId = homeTeam;
                    }

                    break;
                }
                }
            }
            else
            {
                switch (innings.InningsNumber)
                {
                case 3:
                {
                    var finishedInnings = this.Innings.FirstOrDefault(x => x.InningsNumber == 1);
                    if (finishedInnings != null && finishedInnings.BattingTeamId == homeTeam)
                    {
                        innings.BattingTeamId = homeTeam;
                        innings.BowlingTeamId = awayTeam;
                    }
                    else
                    {
                        innings.BattingTeamId = awayTeam;
                        innings.BowlingTeamId = homeTeam;
                    }

                    break;
                }

                case 4:
                {
                    var finishedInnings = this.Innings.FirstOrDefault(x => x.InningsNumber == 2);
                    if (finishedInnings != null && finishedInnings.BattingTeamId == homeTeam)
                    {
                        innings.BattingTeamId = homeTeam;
                        innings.BowlingTeamId = awayTeam;
                    }
                    else
                    {
                        innings.BattingTeamId = awayTeam;
                        innings.BowlingTeamId = homeTeam;
                    }

                    break;
                }
                }
            }

            this.MatchStatus = MatchStatus.InPlay;
            this.Innings.Add(innings);
            CurrentBattingTeam().TeamInningsNumber += 1;
            innings.InningsName = CurrentBattingTeam().Name + " " + AddOrdinal(CurrentBattingTeam().TeamInningsNumber) + " Innings";
        }
コード例 #17
0
 public int Points(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.Points(player));
コード例 #18
0
 public int Safeties(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.Safeties(player));
コード例 #19
0
 public int DeadBalls(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.DeadBalls(player));
コード例 #20
0
 public int TimeOuts(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.TimeOuts(player));