Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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();
        }