private UserGameType CalculateRating(UserGameType item, double result, double eResult, int userID, SqlTransaction t) { //Calculate K-Factor of both player RatingKFactor kFactor; //UserGameType item; //Calculate Rating kFactor = RatingKFactors.Instance.GetRatingKFactor(item.EloRating, item.NoOfGames); item.NoOfGames = item.NoOfGames + 1; item.EloRating = item.EloRating + UData.ToInt32(System.Math.Round(kFactor.KFactor * (result - eResult))); item.StoredMatches = item.StoredMatches + 1; //SqlTransaction t = null; try { //t = SqlHelper.BeginTransaction(Config.ConnectionString); //Save Rating item.Save(t); //Calculate Ranking -> Save Ranking CalculateRanking(item, t); //SqlHelper.CommitTransaction(t); } catch (Exception ex) { //SqlHelper.RollbackTransaction(t); throw ex; } return(item); }
public DataSet AddGame(bool isOfferedReMatch) { try { #region Get Game Data int challengeID = Kv.GetInt32("ChallengeID"); int currentUserID = Kv.GetInt32(StdKv.CurrentUserID); //opponent user id //using StdKv.CurrentUserID because of some reason -----base.Kv.Cxt.CurrentUserID int opponentChessTypeID = Kv.GetInt32("ChessTypeID"); DataSet gds = App.Model.Db.Game.GetGameData(challengeID, currentUserID, opponentChessTypeID, isOfferedReMatch); if (gds.Tables.Count < 2) { return(null); } gds.Tables[0].TableName = "Challenge"; gds.Tables[1].TableName = "Users"; gds.Tables[2].TableName = "UserGameTypes"; gds.Tables[3].TableName = "Engines"; if (gds.Tables.Count > 4) { gds.Tables[4].TableName = "TournamentMatch"; gds.Tables[5].TableName = "Tournament"; } Challenge c = new Challenge(base.Kv.Cxt, gds.Tables["Challenge"].Rows[0]); Users us = new Users(base.Kv.Cxt, gds.Tables["Users"]); User uc = us[0]; User uo = us[1]; //if (currentUserID == uc.UserID) //{ // if (uo.UserStatusIDE == UserStatusE.Playing || uo.UserStatusIDE == UserStatusE.Gone || uo.UserStatusIDE == UserStatusE.Kibitzer) // { // return null; // } //} //else //{ // if (uc.UserStatusIDE == UserStatusE.Playing || uc.UserStatusIDE == UserStatusE.Gone || uc.UserStatusIDE == UserStatusE.Kibitzer) // { // return null; // } //} UserGameTypes ugts = new UserGameTypes(base.Kv.Cxt, gds.Tables["UserGameTypes"]); UserGameType ugtc = new UserGameType(); UserGameType ugto = new UserGameType(); switch (ugts.Count) { case 1: ugtc = ugts[0]; break; case 2: ugtc = ugts[0]; ugto = ugts[1]; break; } if (c.ChallengerUserID != ugtc.UserID) { UserGameType ugtt = ugtc; ugtc = ugto; ugto = ugtt; } if (c.ChallengerUserID != uc.UserID) { User ut = uc; uc = uo; uo = ut; } #endregion #region Save Game SqlTransaction t = null; App.Model.Db.Game item = new App.Model.Db.Game(); if (c.ChessTypeIDE == ChessTypeE.Engine || c.ChessTypeIDE == ChessTypeE.Centaur) { if (ugtc.EloRating == 0) { ugtc.EloRating = 2200; } } else { if (ugtc.EloRating == 0) { ugtc.EloRating = 1500; } } if ((ChessTypeE)opponentChessTypeID == ChessTypeE.Engine || (ChessTypeE)opponentChessTypeID == ChessTypeE.Centaur) { if (ugto.EloRating == 0) { ugto.EloRating = 2200; } } else { if (ugto.EloRating == 0) { ugto.EloRating = 1500; } } try { switch (c.ColorIDE) { //case ColorE.Autometic: case ColorE.White: item.WhiteUserID = ugtc.UserID == 0 ? c.ChallengerUserID : ugtc.UserID; item.BlackUserID = ugto.UserID == 0 ? currentUserID : ugto.UserID; item.EloWhiteBefore = ugtc.EloRating; item.EloBlackBefore = ugto.EloRating; item.WhiteEngineID = uc.EngineID; item.BlackEngineID = uo.EngineID; item.WhiteChessTypeID = c.ChessTypeID; item.BlackChessTypeID = opponentChessTypeID; break; case ColorE.Black: item.BlackUserID = ugtc.UserID == 0 ? c.ChallengerUserID : ugtc.UserID; item.WhiteUserID = ugto.UserID == 0 ? currentUserID : ugto.UserID; item.EloBlackBefore = ugtc.EloRating; item.EloWhiteBefore = ugto.EloRating; item.BlackEngineID = uc.EngineID; item.WhiteEngineID = uo.EngineID; item.WhiteChessTypeID = opponentChessTypeID; item.BlackChessTypeID = c.ChessTypeID; break; } item.IsRated = c.IsRated; item.IsChallengerSendsGame = c.IsChallengerSendsGame; item.ChallengeID = c.ChallengeID; item.GameResultIDE = GameResultE.InProgress; item.GameTypeID = c.GameTypeID; item.StartDate = DateTime.Now; item.TimeMin = c.TimeMin; item.GainPerMoveMin = c.GainPerMoveMin; item.RoomID = c.RoomID; item.GameXml = ""; if (c.TournamentMatchID != 0) { item.TournamentMatchID = c.TournamentMatchID; } t = SqlHelper.BeginTransaction(Config.ConnectionString); Challenges.UpdateAllChallenges(t, c.ID, currentUserID, c.ChallengerUserID); item.Save(t); SqlHelper.CommitTransaction(t); } catch (Exception ex) { SqlHelper.RollbackTransaction(t); //throw ex; Log.Write(base.Kv.Cxt, ex); } #endregion #region Return Game DataSet item.DataRow.Table.TableName = "Game"; gds.Tables.Add(item.DataRow.Table.Copy()); gds.Tables.Remove("UserGameTypes"); return(gds); #endregion } catch (Exception ex) { Log.Write(Kv.Cxt, ex); return(null); } }
public void Update(SqlTransaction t) { if (!game.IsRated) { return; } //Get both players datat UserGameType whiteUserData; UserGameType blackUserData; if (game.WhiteChessTypeID == 3) { whiteUserData = UserGameType.GetUserCentaurGameRating(game.Cxt, game.WhiteChessTypeID, game.GameTypeID, game.WhiteUserID); } else { whiteUserData = UserGameType.GetUserGameRating(game.Cxt, game.WhiteChessTypeID, game.GameTypeID, game.WhiteUserID); } if (game.BlackChessTypeID == 3) { blackUserData = UserGameType.GetUserCentaurGameRating(game.Cxt, game.BlackChessTypeID, game.GameTypeID, game.BlackUserID); } else { blackUserData = UserGameType.GetUserGameRating(game.Cxt, game.BlackChessTypeID, game.GameTypeID, game.BlackUserID); } //Calculate Wining Probablity of both players double eResultWhite = 0; double eResultBlack = 0; RatingWinProbablity winProbablity = RatingWinProbablities.Instance.GetRatingWinProbablity(game.EloWhiteBefore, game.EloBlackBefore); if (game.EloWhiteBefore >= game.EloBlackBefore) { eResultWhite = winProbablity.StrongerPlayer; eResultBlack = winProbablity.WeakerPlayer; } else { eResultBlack = winProbablity.StrongerPlayer; eResultWhite = winProbablity.WeakerPlayer; } //Calculate K-Factor -> Calculate Rating -> Save Rating -> Calculate Ranking -> Save Ranking switch (game.GameResultIDE) { case GameResultE.WhiteWin: whiteUserData = CalculateRating(whiteUserData, 1, eResultWhite, game.WhiteUserID, t); blackUserData = CalculateRating(blackUserData, 0, eResultBlack, game.BlackUserID, t); break; case GameResultE.WhiteLose: whiteUserData = CalculateRating(whiteUserData, 0, eResultWhite, game.WhiteUserID, t); blackUserData = CalculateRating(blackUserData, 1, eResultBlack, game.BlackUserID, t); break; case GameResultE.Draw: whiteUserData = CalculateRating(whiteUserData, 0.5, eResultWhite, game.WhiteUserID, t); blackUserData = CalculateRating(blackUserData, 0.5, eResultBlack, game.BlackUserID, t); break; } //*********************************************************************** if (Game.IsTournamentMatch) { TournamentUser.UpdateUsersEloAfter(t, Game.TournamentMatch.WhiteUserID, Game.TournamentMatch.BlackUserID, whiteUserData.EloRating, blackUserData.EloRating, Game.TournamentMatch.TournamentID); } }
private void CalculateRanking(UserGameType userGame, SqlTransaction t) { User item = new User(game.Cxt, userGame.UserID); //Calculate Ranking if (item == null || item.UserID <= 16) { return; } RankRule rankRule = RankRules.Instance.GetRankRule(userGame.EloRating, userGame.NoOfGames, item.LoginDays.Days, userGame.ChessTypeID); switch (userGame.ChessTypeIDE) { case ChessTypeE.None: break; case ChessTypeE.Human: #region GameType switch (game.GameTypeIDE) { case GameType.None: break; case GameType.Bullet: break; case GameType.Blitz: item.HumanRankIDE = rankRule.RankIDE; break; case GameType.Rapid: break; case GameType.Long: break; default: break; } #endregion break; case ChessTypeE.Engine: #region GameType switch (game.GameTypeIDE) { case GameType.None: break; case GameType.Bullet: break; case GameType.Blitz: break; case GameType.Rapid: item.EngineRankIDE = rankRule.RankIDE; break; case GameType.Long: break; default: break; } #endregion break; case ChessTypeE.Centaur: item.CentaurRankIDE = rankRule.RankIDE; break; case ChessTypeE.Correspondence: item.CorrespondenceRankIDE = rankRule.RankIDE; break; } //Save Ranking item.Save(); }