Ejemplo n.º 1
0
        //-----------------------------------------------------------------------------------------------------------------------------------
        public static val Eval(cPosicion pos)
        {
            cEvalInfo eval = new cEvalInfo();
              pnt nPuntos;
              pnt[] movilidad = new pnt[] { 0, 0 };
              cThread thread = pos.ThreadActive();
              nPuntos = pos.GetPuntosPeon() + (pos.ColorMueve() == cColor.BLANCO ? m_Tempo : -m_Tempo);

              eval.m_Material = cMaterial.Buscar(pos, thread.m_Material, thread.m_Finales);
              nPuntos += eval.m_Material.Valor();
              if (eval.m_Material.FuncionEvaluacion())
            return eval.m_Material.Eval(pos);

              eval.m_Peones = cBonusPeones.Buscar(pos, thread.m_TablaPeones);

              Init(pos, eval, cColor.BLANCO);
              Init(pos, eval, cColor.NEGRO);

              nPuntos += SetPesos(eval.m_Peones.GetValue(), m_Pesos[cEvalPesos.ESTRUCTURA_PEONES]);

              eval.m_Ataques[cColor.BLANCO][cPieza.NAN] |= eval.m_Ataques[cColor.BLANCO][cPieza.REY];
              eval.m_Ataques[cColor.NEGRO][cPieza.NAN] |= eval.m_Ataques[cColor.NEGRO][cPieza.REY];

              bitbrd[] areaMovilidad = new bitbrd[]{   ~(eval.m_Ataques[cColor.NEGRO][cPieza.PEON] | pos.PiezasColor(cColor.BLANCO, cPieza.PEON, cPieza.REY)),
            ~(eval.m_Ataques[cColor.BLANCO][cPieza.PEON] | pos.PiezasColor(cColor.NEGRO, cPieza.PEON, cPieza.REY)) };
              nPuntos += EvalPiezas(pos, eval, movilidad, areaMovilidad, cPieza.CABALLO, cColor.BLANCO);
              nPuntos += cEval.SetPesos(movilidad[cColor.BLANCO] - movilidad[cColor.NEGRO], m_Pesos[cEvalPesos.MOVILIDAD]);

              nPuntos += EvalRey(pos, eval, cColor.BLANCO) - EvalRey(pos, eval, cColor.NEGRO);

              nPuntos += EvalAmenazas(pos, eval, cColor.BLANCO) - EvalAmenazas(pos, eval, cColor.NEGRO);

              nPuntos += EvalPeonesPasados(pos, eval, cColor.BLANCO) - EvalPeonesPasados(pos, eval, cColor.NEGRO);

              if (0 == pos.MaterialPieza(cColor.BLANCO) || 0 == pos.MaterialPieza(cColor.NEGRO))
            nPuntos += EvalPeonImparable(pos, cColor.BLANCO, eval) - EvalPeonImparable(pos, cColor.NEGRO, eval);

              if (eval.m_Material.Peso() != 0)
              {
            int s = EvalEspacio(pos, eval, cColor.BLANCO) - EvalEspacio(pos, eval, cColor.NEGRO);
            nPuntos += cEval.SetPesos(s * eval.m_Material.Peso(), m_Pesos[cEvalPesos.ESPACIO]);
              }

              factor sf = cTypes.GetFinalJuego(nPuntos) > cValoresJuego.TABLAS ? eval.m_Material.FactorDeEscala(pos, cColor.BLANCO)
                                                                 : eval.m_Material.FactorDeEscala(pos, cColor.NEGRO);
              if (eval.m_Material.Fase() < cFaseJuego.MEDIO_JUEGO
              && pos.AlfilesOpuestos()
              && (sf == cFactorEscala.NORMAL || sf == cFactorEscala.PEON))
              {
            if (pos.MaterialPieza(cColor.BLANCO) == cValoresJuego.ALFIL_MJ
            && pos.MaterialPieza(cColor.NEGRO) == cValoresJuego.ALFIL_MJ)
            {
              bool one_pawn = (pos.GetNum(cColor.BLANCO, cPieza.PEON) + pos.GetNum(cColor.NEGRO, cPieza.PEON) == 1);
              sf = one_pawn ? (8) : (32);
            }
            else
              sf = (50 * sf / cFactorEscala.NORMAL);
              }

              val v = cTypes.GetMedioJuego(nPuntos) * (eval.m_Material.Fase())
               + cTypes.GetFinalJuego(nPuntos) * (cFaseJuego.MEDIO_JUEGO - eval.m_Material.Fase()) * sf / cFactorEscala.NORMAL;

              v /= (cFaseJuego.MEDIO_JUEGO);

              return pos.ColorMueve() == cColor.BLANCO ? v : -v;
        }