示例#1
0
        private void RetornaRespostaParaUsuario(RespostasUsuario respostasUsuario, List <Regra> regrasPossiveis)
        {
            if (regrasPossiveis.Count == 0)
            {
                var noContent = new CustomMsgBox("FIM", "Não existe resultado possível!", MessageBoxType.E_OK);
                noContent.ShowDialog();
                return;
            }

            else if (regrasPossiveis.Count == 1)
            {
                string msg = "";
                foreach (var objetivo in regrasPossiveis.First().condicaoObjetivos)
                {
                    msg += $"{objetivo.Fato.Nome} {Util.ParseOperador(objetivo.Operador)} {objetivo.Resposta.Descricao}\n";
                }
                var msgBox = new CustomMsgBox("Resultado", msg, MessageBoxType.E_OK);
                msgBox.ShowDialog();
                return;
            }

            else
            {
                string msg = "";
                foreach (var regra in regrasPossiveis)
                {
                    foreach (var objetivo in regra.condicaoObjetivos)
                    {
                        msg += $"{objetivo.Fato.Nome} {Util.ParseOperador(objetivo.Operador)} {objetivo.Resposta.Descricao}\n";
                    }
                }

                var msgBox = new CustomMsgBox("Possibilidades", msg, MessageBoxType.E_OK);
                msgBox.ShowDialog();
                return;
            }
        }
示例#2
0
        private void button3_Click(object sender, EventArgs e)
        {
            var regras = ObterRegrasComObjetivosAlvo().ToList();

            if (regras.Count() == 0)
            {
                var noContent = new CustomMsgBox("Falha na inicialização", "É necessário selecionar pelomenos um objetivo antes de inicializar.", MessageBoxType.E_OK);
                noContent.ShowDialog();
                return;
            }

            var fatos = GetDistinctFatos(regras);

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

            var respostasUsuario = new RespostasUsuario();

            var regrasPossiveis = new List <Regra>();

            bool boolPrimeiroLoop = true;

            foreach (var fato in fatos)
            {
                using (var perguntas = new Perguntas(fato))
                {
                    perguntas.ShowDialog();

                    var resposta = GetResposta(fato, perguntas);

                    if (boolPrimeiroLoop)
                    {
                        boolPrimeiroLoop = false;
                        foreach (var regra in regras)
                        {
                            if (!regra.Condicao.Any(c => c.Fato.Nome == fato.Nome)) //na regra, nao importa o fato atual, somente outro
                            {
                                regrasPossiveis.Add(regra);
                            }
                            else
                            {
                                foreach (var condicao in regra.Condicao)
                                {
                                    if (fato.Nome == condicao.Fato.Nome)
                                    {
                                        if (VerificaRespostaBaseadoNoTipo(fato.Tipo, condicao.Operador, condicao.Resposta, resposta))
                                        {
                                            regrasPossiveis.Add(regra);
                                            if (regra.Condicao.Count == 1 && regrasPossiveis.Count == 1 && regras.Count == 1)
                                            {
                                                RetornaRespostaParaUsuario(respostasUsuario, regrasPossiveis);
                                                return;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (regrasPossiveis.Count == 0)
                        {
                            RetornaRespostaParaUsuario(respostasUsuario, regrasPossiveis);
                            return;
                        }
                    }
                    else
                    {
                        var copy = new List <Regra>();
                        copy.AddRange(regrasPossiveis);
                        foreach (var regra in copy)
                        {
                            var possuiConectorOu = regra.Condicao.Any(c => c.Conectivo == Conectivo.OU);
                            if (regra.Condicao.Any(c => c.Fato.Nome == fato.Nome))
                            {
                                foreach (var condicao in regra.Condicao)
                                {
                                    if (fato.Nome == condicao.Fato.Nome)
                                    {
                                        if (!VerificaRespostaBaseadoNoTipo(fato.Tipo, condicao.Operador, condicao.Resposta, resposta))
                                        {
                                            regrasPossiveis.Remove(regra);
                                        }
                                    }
                                }
                            }
                        }
                    }

                    respostasUsuario.AdicionaResposta(fato, resposta);
                }
            }

            RetornaRespostaParaUsuario(respostasUsuario, regrasPossiveis);
        }