コード例 #1
0
ファイル: Game.cs プロジェクト: rafeyhusain/InfinityChess
        public override void Save()
        {
            System.Data.SqlClient.SqlTransaction t = SqlHelper.BeginTransaction(Config.ConnectionString);

            try
            {
                if (GameResultIDE != GameResultE.InProgress && GameResultIDE != GameResultE.None && GameResultIDE != GameResultE.NoResult)
                {
                    if (GameResultIDE != GameResultE.WhiteBye || GameResultIDE != GameResultE.BlackBye)
                    {
                        Elo e = new Elo(this);
                        e.Update(t);
                    }

                    if (this.Challenge.Stake > 0 && this.Challenge.Flate != 0)
                    {
                        UserFini.UpdateFiniTransfer(t, base.Cxt, this, this.Challenge.Stake, this.Challenge.Flate);
                    }

                    if (this.IsTournamentMatch)
                    {
                        if (this.GameResultIDE == GameResultE.Draw)
                        {
                            this.TournamentMatch.TournamentMatchStatusE = TournamentMatchStatusE.Draw;
                            this.TournamentMatch.GameResultID           = this.GameResultID;
                            this.TournamentMatch.Save(t);
                        }
                        else
                        {
                            string matchID = this.TournamentMatch.TournamentMatchID.ToString();
                            this.TournamentMatch.GameResultID = this.GameResultID;
                            TournamentMatches.UpdateStatus(t, base.Cxt, TournamentMatchStatusE.Finsihed, matchID, this.GameResultIDE);
                        }

                        this.TournamentMatch.UpdateUserPoints(t);
                    }
                }

                base.Save(t);

                SqlHelper.CommitTransaction(t);
                if (IsFinished)
                {
                    TournamentMatch.CreateChildMatchIfRequired(Cxt, this.TournamentMatch, null);
                }
            }
            catch (Exception ex)
            {
                SqlHelper.RollbackTransaction(t);
                Log.Write(Cxt, ex);
            }
        }
コード例 #2
0
        static int GetRoundInProgress(Cxt cxt, Tournament tournament)
        {
            DataTable dt = TournamentMatches.GetTournamentsMatchByTournamentID(tournament.TournamentID);
            DataTable dtTournamentUsers = TournamentUsers.GetTournamentUsersByTournamentID(StatusE.Active, tournament.TournamentID);

            foreach (DataRow item in dt.Rows)
            {
                TournamentMatch tm = new TournamentMatch(cxt, item);
                if (tm.TournamentMatchStatusE == TournamentMatchStatusE.InProgress || tm.TournamentMatchStatusE == TournamentMatchStatusE.Scheduled)
                {
                    return((int)MsgE.ErrorTournamentNextRoundStarted);
                }
            }

            object    objId    = dt.Compute("max(Round)", "");
            int       round    = Convert.ToInt32(objId);
            DataTable dtRounds = TournamentRounds.GetTournamentWinnersByRound(tournament.TournamentID, round);

            if (round == 0 && TournamentMatch.IsPreliminaryRound(round, dtTournamentUsers)) // if it is prelimiry round
            {
                if (dtRounds.Rows.Count == TournamentMatch.CountPreliminaryRoundUsers(dtTournamentUsers))
                {
                    return(0);
                }
                else
                {
                    return((int)MsgE.ErrorTournamentNextRoundStarted);
                }
            }

            DataTable dtUsers = TournamentUsers.GetTournamentUsersByRound(tournament.TournamentID, round);

            if (dtRounds.Rows.Count != dtUsers.Rows.Count / 2)
            {
                return((int)MsgE.ErrorTournamentNextRoundStarted);
            }

            return(0);
        }
コード例 #3
0
        public static void CreateSchavengenSystem(Cxt cxt, SqlTransaction trans, Tournament tournament, DataTable dtTournamentUsers)
        {
            int roundValue = 1;
            int val        = 0;

            TournamentMatches.DeleteTournamentMatchByTournamentID(trans, tournament.TournamentID);

            Teams Teams = new Teams(cxt, Teams.GetTeamsByTournamentID(tournament.TournamentID));

            roundValue = 1;
            int round = dtTournamentUsers.Rows.Count / Teams.Count;

            int doubleRoundNo = tournament.DoubleRoundNo * 2;

            if (doubleRoundNo == 0)
            {
                doubleRoundNo = 1;
            }

            bool isWhite = false;

            for (int k = 0; k <= doubleRoundNo - 1; k++)
            {
                if (isWhite)
                {
                    isWhite = false;
                }
                else
                {
                    isWhite = true;
                }

                //Teams Teams = new Teams(cxt, Teams.GetTeamsByTournamentID(tournament.TournamentID));

                if (Teams.Count > 0)
                {
                    DataTable dtCalculatePair = SchTeamPairing(Teams.Count);
                    Team      teamW           = null;
                    Team      teamB           = null;

                    for (int i = 0; i < dtCalculatePair.Rows.Count; i++)
                    {
                        DataRow drCal = dtCalculatePair.Rows[i];

                        teamW = Teams[Convert.ToInt32(drCal["TeamA"]) - 1];
                        teamB = Teams[Convert.ToInt32(drCal["TeamB"]) - 1];

                        dtTournamentUsers.DefaultView.RowFilter = "TeamID = " + teamW.TeamID.ToString() + " or TeamID = " + teamB.TeamID.ToString();
                        dtTournamentUsers.DefaultView.Sort      = "TeamID";
                        TournamentUsers tu = new TournamentUsers(cxt, dtTournamentUsers.DefaultView.ToTable());



                        if (tu.Count > 0)
                        {
                            CreateSchavengenMatches(cxt, tournament, tu, isWhite, k, round, ref val, ref roundValue);
                            tournament.TournamentMatches.Save(trans);
                        }
                    }
                }
            }
        }
コード例 #4
0
        static void CreateKnockoutTournamentMatches(Cxt cxt, TournamentUsers tournamentUsers, TournamentMatches tournamentMatches, int round, Tournament Tournament)
        {
            if (tournamentUsers.Count > 0)
            {
                for (int i = 0; i < tournamentUsers.Count / 2; i++)
                {
                    TournamentUser userW = new TournamentUser(cxt, tournamentUsers.DataTable.Rows[i]);
                    TournamentUser userB = new TournamentUser(cxt, tournamentUsers.DataTable.Rows[tournamentUsers.Count - i - 1]);

                    TournamentMatch tournamentMatch = new TournamentMatch(cxt, 0);
                    tournamentMatch.Round                = round;
                    tournamentMatch.WhiteUserID          = userW.UserID;
                    tournamentMatch.BlackUserID          = userB.UserID;
                    tournamentMatch.TournamentID         = Tournament.TournamentID;
                    tournamentMatch.TournamentMatchTypeE = TournamentMatchTypeE.Normal;

                    if (Tournament.TournamentStartDate > DateTime.Now)
                    {
                        tournamentMatch.MatchStartDate = Tournament.TournamentStartDate;
                    }
                    else
                    {
                        tournamentMatch.MatchStartDate = DateTime.Now;
                    }

                    if (Tournament.TournamentStartTime > DateTime.Now)
                    {
                        tournamentMatch.MatchStartTime = Tournament.TournamentStartTime;
                    }
                    else
                    {
                        tournamentMatch.MatchStartTime = DateTime.Now;
                    }

                    tournamentMatch.TimeMin = Tournament.TimeControlMin;
                    tournamentMatch.TimeSec = Tournament.TimeControlSec;

                    tournamentMatch.TournamentMatchStatusE = TournamentMatchStatusE.Scheduled;
                    tournamentMatch.EloWhiteBefore         = userW.EloBefore;
                    tournamentMatch.EloBlackBefore         = userB.EloBefore;
                    tournamentMatch.CreatedBy   = Ap.CurrentUserID;
                    tournamentMatch.DateCreated = DateTime.Now;
                    tournamentMatch.StatusID    = (int)StatusE.Active;
                    tournamentMatches.Add(tournamentMatch);
                }
            }
        }
コード例 #5
0
        static TournamentUsers GetTournamentPreliminaryWinners1(Cxt cxt, int tournamentID, int round, DataTable dtTournamentUsers)
        {
            TournamentUsers   tuWinners         = new TournamentUsers();
            TournamentMatches tournamentMatches = new TournamentMatches(cxt, GetTournamntPlayers(tournamentID));
            TournamentMatches tmW = new TournamentMatches();
            TournamentUsers   tuW = new TournamentUsers();
            TournamentUsers   tuL = new TournamentUsers();

            int wCounter = 0, bCounter = 0, dCounter = 0;

            foreach (DataRow item in tournamentMatches.DataTable.Rows)
            {
                TournamentMatch tournamentMatch = new TournamentMatch(cxt, item);

                TournamentUser tournamentUserB = null;
                TournamentUser tournamentUserW = null;


                switch (tournamentMatch.GameResultIDE)
                {
                case GameResultE.None:
                    break;

                case GameResultE.InProgress:
                    break;

                case GameResultE.WhiteWin:
                    bCounter       += 1;
                    tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                    tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                    tuW.Add(tournamentUserW);
                    tuL.Add(tournamentUserB);
                    break;

                case GameResultE.WhiteLose:
                {
                    wCounter       += 1;
                    tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                    tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                    tuW.Add(tournamentUserB);
                    tuL.Add(tournamentUserW);
                }
                break;

                case GameResultE.Draw:
                    dCounter += 1;
                    tmW.Add(tournamentMatch);
                    break;

                case GameResultE.Absent:
                    break;

                case GameResultE.NoResult:
                    break;

                case GameResultE.WhiteBye:
                    wCounter       += 1;
                    tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                    tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                    tuW.Add(tournamentUserB);
                    tuL.Add(tournamentUserW);
                    break;

                case GameResultE.BlackBye:
                    bCounter       += 1;
                    tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                    tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                    tuW.Add(tournamentUserW);
                    tuL.Add(tournamentUserB);
                    break;

                case GameResultE.ForcedWhiteWin:
                    bCounter       += 1;
                    tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                    tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                    tuW.Add(tournamentUserW);
                    tuL.Add(tournamentUserB);
                    break;

                case GameResultE.ForcedWhiteLose:
                    wCounter       += 1;
                    tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                    tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                    tuW.Add(tournamentUserB);
                    tuL.Add(tournamentUserW);
                    break;

                case GameResultE.ForcedDraw:
                    dCounter += 1;
                    tmW.Add(tournamentMatch);
                    break;

                default:
                    break;
                }
            }

            if (dCounter > 0)
            {
                foreach (DataRow item in tmW.DataTable.Rows)
                {
                    TournamentMatch tournamentMatch = new TournamentMatch(cxt, item);
                    if (tournamentMatch.EloWhiteAfter > tournamentMatch.EloBlackAfter)
                    {
                        TournamentUser tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                        TournamentUser tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                        tuW.Add(tournamentUserW);
                        tuL.Add(tournamentUserB);
                    }
                    else if (tournamentMatch.EloBlackAfter > tournamentMatch.EloWhiteAfter)
                    {
                        TournamentUser tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                        TournamentUser tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                        tuW.Add(tournamentUserB);
                        tuL.Add(tournamentUserW);
                    }
                    else
                    {
                        TournamentUser tournamentUserB = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.BlackUserID);
                        TournamentUser tournamentUserW = TournamentUser.GetTournamentUserById(cxt, tournamentID, tournamentMatch.WhiteUserID);
                        tuW.Add(tournamentUserB);
                        tuW.Add(tournamentUserW);
                    }
                }
            }
            if (tuL.Count > 0)
            {
                foreach (DataRow item in dtTournamentUsers.Rows)
                {
                    TournamentUser tu1 = new TournamentUser(cxt, item);

                    if (!tuL.Contains("UserID = " + tu1.UserID))
                    {
                        tuWinners.Add(tu1);
                    }
                }
            }
            return(tuWinners);
        }
コード例 #6
0
        public static int GetKnockoutTournamentMatchesCount(Cxt cxt, Tournament tournament)
        {
            DataTable         dtTournamentUsers = TournamentUsers.GetTournamentUsersByTournamentID(StatusE.Active, tournament.TournamentID);
            TournamentMatches tournamentMatches = new TournamentMatches();
            TournamentUsers   tournamentUsers   = null;

            if (tournament.TournamentCurrentRound > 0)
            {
                TournamentUsers ratedTournamentUsers = null;
                if (TournamentMatch.IsPreliminaryRound(tournament.TournamentCurrentRound - 1, dtTournamentUsers))
                {
                    ratedTournamentUsers = GetTournamentPreliminaryWinners(cxt, tournament.TournamentID, tournament.TournamentCurrentRound, dtTournamentUsers);
                }
                else
                {
                    ratedTournamentUsers = GetTournamentWinners(cxt, tournament.TournamentID, tournament.TournamentCurrentRound);
                }

                if (ratedTournamentUsers.Count == 0)
                {
                    return(0);
                }

                if (tournament.TournamentCurrentRound > 2) // make sure,"tournament.TournamentCurrentRound - 1" is not preliminary round
                {
                    TournamentUsers previousRoundUsers = GetTournamentWinners(cxt, tournament.TournamentID, tournament.TournamentCurrentRound - 1);
                    if (previousRoundUsers.Count == 2 && ratedTournamentUsers.Count == 2)
                    {
                        return(0);
                    }
                }

                CreateKnockoutTournamentMatches(cxt, ratedTournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);

                if (tournament.MaxWinners >= 3 && ratedTournamentUsers.Count == 2) // for multiple winners
                {
                    ratedTournamentUsers = GetTournamentLosers(cxt, tournament.TournamentID, tournament.TournamentCurrentRound);
                    CreateKnockoutTournamentMatches(cxt, ratedTournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);
                }
            }
            else
            {
                if (dtTournamentUsers.Rows.Count == 0)
                {
                    return(0);
                }

                if (tournament.TournamentCurrentRound == 0)
                {
                    if (!TournamentMatch.IsPreliminaryRound(tournament.TournamentCurrentRound, dtTournamentUsers))
                    {
                        tournament.TournamentCurrentRound = 1;
                        tournamentUsers = new TournamentUsers(cxt, dtTournamentUsers);
                        //CreateKnockoutTournamentMatches(cxt, tournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);
                        //break;
                    }
                    else
                    {
                        tournamentUsers = GetPreliminaryRound(cxt, tournament, dtTournamentUsers);
                    }
                }

                CreateKnockoutTournamentMatches(cxt, tournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);
            }

            return(tournamentMatches.Count);
        }
コード例 #7
0
        public static void CreateKnockoutTournamentMatches(Cxt cxt, SqlTransaction trans, Tournament tournament, DataTable dtTournamentUsers)
        {
            TournamentMatches tournamentMatches = new TournamentMatches();
            TournamentUsers   tournamentUsers   = null;

            if (tournament.TournamentCurrentRound > 0)
            {
                TournamentUsers ratedTournamentUsers = null;
                if (TournamentMatch.IsPreliminaryRound(tournament.TournamentCurrentRound - 1, dtTournamentUsers))
                {
                    ratedTournamentUsers = GetTournamentPreliminaryWinners(cxt, tournament.TournamentID, tournament.TournamentCurrentRound, dtTournamentUsers);
                }
                else
                {
                    ratedTournamentUsers = GetTournamentWinners(cxt, tournament.TournamentID, tournament.TournamentCurrentRound);
                }

                if (ratedTournamentUsers.Count == 0)
                {
                    return;
                }

                if (tournament.TournamentCurrentRound > 2) // make sure,"tournament.TournamentCurrentRound - 1" is not preliminary round
                {
                    TournamentUsers previousRoundUsers = GetTournamentWinners(cxt, tournament.TournamentID, tournament.TournamentCurrentRound - 1);
                    if (previousRoundUsers.Count == 2 && ratedTournamentUsers.Count == 2)
                    {
                        return;
                    }
                }

                CreateKnockoutTournamentMatches(cxt, ratedTournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);

                if (tournament.MaxWinners >= 3 && ratedTournamentUsers.Count == 2) // for multiple winners
                {
                    ratedTournamentUsers = GetTournamentLosers(cxt, tournament.TournamentID, tournament.TournamentCurrentRound);
                    CreateKnockoutTournamentMatches(cxt, ratedTournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);
                }
            }
            else
            {
                if (dtTournamentUsers.Rows.Count == 0)
                {
                    return;
                }

                if (tournament.TournamentCurrentRound == 0)
                {
                    if (!TournamentMatch.IsPreliminaryRound(tournament.TournamentCurrentRound, dtTournamentUsers))
                    {
                        tournament.TournamentCurrentRound = 1;
                        tournamentUsers = new TournamentUsers(cxt, dtTournamentUsers);
                        //CreateKnockoutTournamentMatches(cxt, tournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);
                        //break;
                    }
                    else
                    {
                        tournamentUsers = GetPreliminaryRound(cxt, tournament, dtTournamentUsers);
                    }
                }

                CreateKnockoutTournamentMatches(cxt, tournamentUsers, tournamentMatches, tournament.TournamentCurrentRound, tournament);
            }

            if (tournamentMatches.Count > 0)
            {
                tournamentMatches.Save(trans);
            }
        }