public string SelecionarSuspeito(int idSala, int idJogadorSala, int idSuspeito)
        {
            try
            {
                var sala = _salaBusiness.Obter(idSala);
                if (sala == default)
                {
                    return(JsonConvert.SerializeObject(new Operacao("Sala não encontrada.", false)));
                }

                var jogadorSala = _jogadorSalaBusiness.Obter(idJogadorSala);
                if (jogadorSala == default)
                {
                    return(JsonConvert.SerializeObject(new Operacao("Jogador Sala não encontrado.", false)));
                }

                var suspeito = _suspeitoBusiness.Obter(idSuspeito);
                if (suspeito == default)
                {
                    return(JsonConvert.SerializeObject(new Operacao("Suspeito não encontrado.", false)));
                }

                if (jogadorSala.IdSala != sala.Id)
                {
                    return(JsonConvert.SerializeObject(new Operacao("Jogador Sala não pertence a sala passada.", false)));
                }

                var suspeitoDesconsiderado = jogadorSala.IdSuspeito == null ? null : _suspeitoBusiness.Obter(jogadorSala.IdSuspeito.Value);

                jogadorSala.AlterarSuspeito(suspeito.Id);
                _jogadorSalaBusiness.Alterar(jogadorSala);

                var jogador = _jogadorBusiness.Obter(jogadorSala.IdJogador);
                var retorno = Json(new
                {
                    DescricaoJogador                = jogador.Descricao,
                    DescricaoSuspeitoSelecionado    = suspeito.Descricao,
                    DescricaoSuspeitoDesconsiderado = suspeitoDesconsiderado == null ? "" : suspeitoDesconsiderado.Descricao
                }, "json");

                var operacao = new Operacao(JsonConvert.SerializeObject(retorno), true);

                return(JsonConvert.SerializeObject(operacao));
            }
            catch (Exception ex)
            {
                return(JsonConvert.SerializeObject(new Operacao(ex.Message, false)));
            }
        }
        public List <AnotacaoSuspeito> Listar(int idJogadorSala)
        {
            var lista = _anotacaoSuspeitoRepository.Listar(idJogadorSala);

            lista.ForEach(_ => _.Suspeito = _suspeitoBusiness.Obter(_.IdSuspeito));

            return(lista);
        }
예제 #3
0
        private Operacao RealizarPalpite(int idSala, int idJogadorSala, int idLocal, int idSuspeito, int idArma)
        {
            var jogadorSala = _jogadorSalaBusiness.Obter(idJogadorSala);

            if (jogadorSala == default && jogadorSala.IdSala != idSala)
            {
                return(new Operacao("Jogador não encontrado", false));
            }

            var jogadoresSala = _jogadorSalaBusiness.Listar(idSala);

            if (jogadoresSala.Count(_ => _.Jogando) <= 1)
            {
                return(new Operacao("Não é possível realizar mais palpites, pois há apenas 1 jogador", false));
            }

            var crime = _crimeBusiness.Obter(idSala);

            if (crime == default)
            {
                return(new Operacao("Crime da sala informada não encontrado", false));
            }

            if (crime.Solucionado())
            {
                return(new Operacao("A partida acabou, o caso já foi solucionado", false));
            }

            if (!jogadorSala.Jogando)
            {
                return(new Operacao("Jogador não está mais jogando", false));
            }

            if (!jogadorSala.MinhaVez())
            {
                return(new Operacao("Não está na vez desse jogador.", false));
            }

            if (jogadorSala.RealizouPalpite)
            {
                return(new Operacao("Só é permitido realizar 1 palpite por rodada.", false));
            }

            MoverJogadorSalaParaLocal(idSuspeito, idSala, idLocal);

            var armaPaupite     = _armaBusiness.Obter(idArma);
            var localPaupite    = _localBusiness.Obter(idLocal);
            var suspeitoPaupite = _suspeitoBusiness.Obter(idSuspeito);

            // Registra palpite no histórico da sala.
            var jogador = _jogadorBusiness.Obter(jogadorSala.IdJogador);

            _historicoBusiness.Adicionar(new Historico(idSala, $"O jogador {jogador.Descricao} palpitou as seguintes as cartas {armaPaupite.Descricao} (arma), {suspeitoPaupite.Descricao} (suspeito) e {localPaupite.Descricao} (local)"));

            jogadorSala.PalpiteRealizado();
            _jogadorSalaBusiness.Alterar(jogadorSala);

            // Ordena jogadores à esquerda do jogador
            var jogadoresSalaOrdenado = jogadoresSala.Where(_ => _.NumeroOrdem > jogadorSala.NumeroOrdem && _.Jogando)
                                        .OrderBy(_ => _.NumeroOrdem).ToList();

            jogadoresSalaOrdenado.AddRange(jogadoresSala.Where(_ => _.NumeroOrdem < jogadorSala.NumeroOrdem && _.Jogando)
                                           .OrderBy(_ => _.NumeroOrdem).ToList());

            foreach (var jogadorSalaEsquerda in jogadoresSalaOrdenado)
            {
                var arma     = _armaJogadorSalaBusiness.Obter(idArma, jogadorSalaEsquerda.Id);
                var local    = _localJogadorSalaBusiness.Obter(idLocal, jogadorSalaEsquerda.Id);
                var suspeito = _suspeitoJogadorSalaBusiness.Obter(idSuspeito, jogadorSalaEsquerda.Id);

                if (arma == default && local == default && suspeito == default)
                {
                    continue;
                }

                List <TipoCarta> tiposcarta = new List <TipoCarta>();

                if (arma != default)
                {
                    tiposcarta.Add(TipoCarta.Arma);
                }

                if (local != default)
                {
                    tiposcarta.Add(TipoCarta.Local);
                }

                if (suspeito != default)
                {
                    tiposcarta.Add(TipoCarta.Suspeito);
                }

                var jogadorComCarta = _jogadorBusiness.Obter(jogadorSalaEsquerda.IdJogador);
                _historicoBusiness.Adicionar(new Historico(idSala, $"O jogador {jogadorComCarta.Descricao} mostrou uma carta ao jogador {jogador.Descricao}"));

                // Sorteia a carta que que será revelado por conta do palpite
                switch (tiposcarta[new Random().Next(0, tiposcarta.Count)])
                {
                case TipoCarta.Arma:
                    return(new Operacao($"O jogador {jogadorComCarta.Descricao} lhe mostrou a carta {armaPaupite.Descricao}"));

                case TipoCarta.Local:
                    return(new Operacao($"O jogador {jogadorComCarta.Descricao} lhe mostrou a carta {localPaupite.Descricao}"));

                case TipoCarta.Suspeito:
                    return(new Operacao($"O jogador {jogadorComCarta.Descricao} lhe mostrou a carta {suspeitoPaupite.Descricao}"));
                }
            }

            Historico historico = _historicoBusiness.Adicionar(new Historico(idSala, "Nenhum jogador possui as cartas palpitadas"));

            return(new Operacao(historico.Descricao));
        }