コード例 #1
0
        private void AtualizarPosicao(PosicaoList <Classificacao> clas,
                                      Posicao <Classificacao> vencedor, Posicao <Classificacao> derrotado, Placar placar)
        {
            int  qtdeQueda;
            bool trocaPosicao;
            var  regra = placar.Regra;

            if (regra.Nome == RegrasBusiness.ESTOU_FORA)
            {
                if (vencedor.Data.Jogador != derrotado.Data.Jogador)
                {
                    var msg = "Quando um jogador desiste, a partida deve ser entre ele mesmo.";
                    msg += $"\r\n[ Data: {placar.Data} - '{vencedor.Data.Jogador}' x '{derrotado.Data.Jogador}']";
                    throw new InvalidOperationException(msg);
                }
                clas.RemoveByKey(derrotado.Data.Jogador);
                return;
            }

            switch (regra.Nome)
            {
            case RegrasBusiness.DESAFIO_DENTE_POR_DENTE:
                trocaPosicao = vencedor.Index > derrotado.Index;
                qtdeQueda    = Math.Abs(vencedor.Index - derrotado.Index);
                break;

            case RegrasBusiness.DESAFIO_LIDER:

                if (vencedor.Index != 0 && derrotado.Index != 0)
                {
                    var msg = $"O desafio entre '{vencedor.Data.Jogador}' e "
                              + $"'{derrotado.Data.Jogador}' é inválido. "
                              + "Nenhum dos dois possui a liderança.";
                    msg += $"\r\n[ Data: {placar.Data} - '{vencedor.Data.Jogador}' x '{derrotado.Data.Jogador}']";
                    throw new InvalidOperationException(msg);
                }

                trocaPosicao = (vencedor.Index != 0);
                qtdeQueda    = Math.Abs(derrotado.Index - (clas.Count - 1));

                break;

            default:
                trocaPosicao = vencedor.Index > derrotado.Index;
                qtdeQueda    = 1;
                break;
            }

            if (trocaPosicao)
            {
                var(posDerrotado, posVencedor) = (vencedor.Index, derrotado.Index);

                clas[posDerrotado] = derrotado.Data;
                clas[posVencedor]  = vencedor.Data;
                return;
            }

            clas.Remove(derrotado.Index);
            clas.InsertOrUpdate(derrotado.Index + qtdeQueda, derrotado.Data);
        }
コード例 #2
0
 private static void VerificarClassificacao(PosicaoList <Classificacao> lista, string jogador,
                                            Posicao <Classificacao> posicao)
 {
     if (posicao.Data == null)
     {
         posicao.Data = new Classificacao()
         {
             Jogador  = jogador,
             Alterado = true, Data = DateTime.Now,
         };
         lista[posicao.Index] = posicao.Data;
     }
 }
コード例 #3
0
        public IEnumerable <Classificacao> RecalcularClassificacao(Classificacao[] clas, Placar[] placares)
        {
            var classifs = new PosicaoList <Classificacao>();

            classifs.InsertRange(clas, item => item.Posicao - 1);

            var dataMaisAntiga = classifs.Select(a => a.Data).OrderBy(a => a).First();

            placares = placares.Where(a => a.Data >= dataMaisAntiga)
                       .OrderBy(a => a.Data)
                       .ThenBy(a => a.DataPublicacao)
                       .ToArray();

            foreach (var placar in placares)
            {
                if (placar.JogadorAGols == null || placar.JogadorBGols == null)
                {
                    continue;
                }

                var clasJogadorA = classifs[placar.JogadorA.Nome];
                var clasJogadorB = classifs[placar.JogadorB.Nome];

                VerificarClassificacao(classifs, placar.JogadorA.Nome, clasJogadorA);
                VerificarClassificacao(classifs, placar.JogadorB.Nome, clasJogadorB);

                var golsA = placar.JogadorAGols ?? 0;
                var golsB = placar.JogadorBGols ?? 0;

                clasJogadorA.Data.Alterado = true;
                clasJogadorB.Data.Alterado = true;

                if (placar.Regra.Nome != RegrasBusiness.ESTOU_FORA && (string.IsNullOrWhiteSpace(placar.Origem) == true || placar.Origem == "app"))
                {
                    if (golsA == golsB)
                    {
                        AtualizarEstatistica(clasJogadorA.Data, 0, 1, 0, golsA, golsB);
                        AtualizarEstatistica(clasJogadorB.Data, 0, 1, 0, golsB, golsA);
                        continue;
                    }
                    else if (golsA > golsB)
                    {
                        AtualizarEstatistica(clasJogadorA.Data, 1, 0, 0, golsA, golsB);
                        AtualizarEstatistica(clasJogadorB.Data, 0, 0, 1, golsB, golsA);
                    }
                    else
                    {
                        AtualizarEstatistica(clasJogadorA.Data, 0, 0, 1, golsA, golsB);
                        AtualizarEstatistica(clasJogadorB.Data, 1, 0, 0, golsB, golsA);
                    }
                }

                if (placar.JogadorAGols > placar.JogadorBGols)
                {
                    AtualizarPosicao(classifs, clasJogadorA, clasJogadorB, placar);
                }
                else
                {
                    AtualizarPosicao(classifs, clasJogadorB, clasJogadorA, placar);
                }
            }

            foreach (var item in classifs.GetPosicoes())
            {
                var jogador = item.Data;
                jogador.PosicaoAnterior = jogador.Posicao;
                jogador.Posicao         = item.Index + 1;
            }

            return(classifs);
        }