/// <summary> /// 普通的发球 /// </summary> /// <param name="fistTrack"></param> /// <returns></returns> private match_event ServeEvent(Track fistTrack) { match_event ev = CreateNewEvent(); //判断是内角还是外角发球 double middleValue = Court.Width / 2; ///判断是否内角发球 if (Math.Abs(middleValue - fistTrack.FirstPosition.Position.X) > 2057.5) { ev.EventType = (int)MatchEventType.OutFistServe; } else { ev.EventType = (int)MatchEventType.InnerFirstServe; } ev.EventResult = (int)processSingleTrack(fistTrack); if (ev.EventResult != (int)MatchEventResult.SCORE) { LogText.Error("CompleteRand", "数据出错:轨迹{0}", fistTrack.TraceString);; } return(ev); }
/// <summary> ///一发处理 /// </summary> private void FirstServeEvent(Track fistTrack) { match_event ev = CreateNewEvent(); //判断是内角还是外角发球 double middleValue = Court.Width / 2; ///判断是否内角发球 if (Math.Abs(middleValue - fistTrack.FirstPosition.Position.X) > 2057.5) { ev.EventType = (int)MatchEventType.OutFistServe; } else { ev.EventType = (int)MatchEventType.InnerFirstServe; } ev.EventResult = (int)processSingleTrack(fistTrack); if (ev.EventResult != (int)MatchEventResult.SCORE) { LogText.Error("CompleteRand", "数据出错:轨迹{0}", fistTrack.TraceString);; } DataProviderServices.instance.AddMatchEvent(ev); LogText.Info("FirstServeEvent", "一发判断:" + ev.EventResult.ToString()); }
/// <summary> /// 处理接发球 /// </summary> /// <param name="tracks"></param> private match_event ProcessRecive(IList <Track> tracks) { match_event serv = ServeEvent(tracks[0]); if (tracks[0].Status != MatchEventResult.INSIDE) { LogText.Error("CompleteRand", "数据出现异常,roundID:" + currentRound.Id); } match_event ev = CreateNewEvent(); //修正如果上条轨迹是没有落地点,判断是不是截杀揭发球 if (tracks[0].Status == MatchEventResult.OUT_SIDE) { tracks[0].Status = MatchEventResult.INSIDE; serv.EventResult = (int)MatchEventResult.INSIDE; ev.EventType = (int)MatchEventType.CutRecive; LogText.Info("ProcessRecive", "修改上条轨迹结果,将出界改为界内,当前事件为截杀事件"); } else if (tracks[0].Status == MatchEventResult.INSIDE) { ev.EventType = (int)MatchEventType.CommonRecive; LogText.Info("ProcessRecive", "普通接发球"); } DataProviderServices.instance.AddMatchEvent(serv); ev.EventResult = (int)processSingleTrack(tracks[1], false); LogText.Info("ProcessRecive", "记录当前事件的结果,并保存上一条轨迹事件到数据库中"); return(ev); }
/// <summary> /// 创建新的比赛事件 /// </summary> public match_event CreateNewEvent() { match_event ev = new match_event(); ev.ID = Guid.NewGuid().ToString(); ev.MatchID = Id; ev.RoundID = currentRound.Id; return(ev); }
/// <summary> /// 二发处理 /// </summary> private void SecondServ() { match_event ev = CreateNewEvent(); //判断是内角还是外角发球 double middleValue = Court.Width / 2; ///判断二发是内角还是外角发球 if (Math.Abs(middleValue - currentRound.Tracks[1].FirstPosition.Position.X) > 2057.5) { ev.EventType = (int)MatchEventType.OutSecondServe; } else { ev.EventType = (int)MatchEventType.InnerSecondServe; } currentRound.CompetitionCount = 0; //二发结果 ev.EventResult = (int)processSingleTrack(currentRound.Tracks[1], true); DataProviderServices.instance.AddMatchEvent(ev); LogText.Info("SecondServ", "二发事件:" + ev.EventType.ToString()); }
/// <summary> /// 当前回合完成,可以分析当前回合内的数据 /// 一发失败 /// </summary> public bool CompleteRand() { IList <Track> tracks = currentRound.Tracks; if (tracks.Count == 0) { LogText.Error("CompleteRand", "当前回合的轨迹数为0,发生数据错误"); return(false); } //一发 if (tracks.Count == 1) { LogText.Info("CompleteRand", "当前回合只有1条轨迹"); FirstServeEvent(tracks[0]); SetWinner(currentRound, tracks[0]); if (tracks[0].Status == MatchEventResult.SCORE) { return(true); } else { return(false); } } else if (tracks.Count == 2) { Track firstT = tracks[0]; ///一发失败,从第二个轨迹开始开始计算 ///第一条轨迹已经判断过了,并且一二两条轨迹都是同一个人 if (firstT.Status != MatchEventResult.UNKNOW && firstT.Owner.Equals(tracks[1].Owner)) { LogText.Info("CompleteRand", "一发失误,开始进行二发"); SecondServ(); //设定二发的赢球人 SetWinner(currentRound, tracks[1]); return(true); } else { currentRound.CompetitionCount = 1; match_event reciveEvent = ProcessRecive(tracks); DataProviderServices.instance.AddMatchEvent(reciveEvent); SetWinner(currentRound, tracks[1]); LogText.Info("CompleteRand", "普通的两条轨迹处理完成"); } } else if (tracks.Count > 2) { LogText.Info("CompleteRand", "大于2条轨迹回合处理"); match_event serv = ProcessRecive(tracks); for (int i = 2; i <= tracks.Count - 1; i++) { match_event ev = CreateNewEvent(); if (tracks[i - 1].Status == MatchEventResult.OUT_SIDE) { tracks[i - 1].Status = MatchEventResult.INSIDE; serv.EventResult = (int)MatchEventResult.INSIDE; DataProviderServices.instance.AddMatchEvent(serv); } ev.EventResult = (int)processSingleTrack(tracks[i], false); serv = ev; } DataProviderServices.instance.AddMatchEvent(serv); SetWinner(currentRound, tracks[tracks.Count - 1]); } currentRound.Save(); return(true); }