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; } }
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); } }
public Game(Player p1, Player p2, Player activePlayer) { Player1 = p1; Player2 = p2; ActivePlayer = activePlayer; Innings.Add(new Inning(Player1, Player2)); }
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; } }
public BoxScore() { Game = new Game(); Innings = new Innings(); PlayerGames = new PlayerGames(); TeamGames = new TeamGames(); }
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; } }
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++; } }
public Innings Parse(HtmlNode battingNode, HtmlNode bowlingNode) { Innings innings = new Innings(); AddBatting(battingNode, innings); AddBowling(bowlingNode, innings); return(innings); }
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; } }
/// <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(); } } }
/// <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(); } }
public void Miss() { if (ActivePlayer == Player1) { ActivePlayer = Player2; } else { ActivePlayer = Player1; Innings.Add(new Inning(Player1, Player2)); } GameEvents.Push(GameEvent.Miss); }
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; }
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); }
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; }
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"; }
public int Points(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.Points(player));
public int Safeties(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.Safeties(player));
public int DeadBalls(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.DeadBalls(player));
public int TimeOuts(Player player) => Innings.Aggregate(0, (sum, i) => sum + i.TimeOuts(player));