mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-24 11:06:58 +08:00
We really don't need to have global endgame functions. We can allocate them on the heap at initialization time and store the corresponding pointer directly in the functions maps. To avoid leaks we just need to remember to deallocate them in map d'tor. These functions are always created in couple, one for each color, so remove a lot of redundant hard coded info and just use the minimum required: the type and the corresponding named string. This greatly simplifies the code and also it is less error prone, now is much simpler to add a new endgame specialized function: just add the corresponding enum in endgame.h and the obvious add_xx() call in EndgameFunctions c'tor, and of course, the most important part, the EvaluationFunction<xxx>::apply() specialization in endgame.cpp No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
103 lines
2.5 KiB
C++
103 lines
2.5 KiB
C++
/*
|
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
|
Copyright (C) 2008-2009 Marco Costalba
|
|
|
|
Stockfish is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Stockfish is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
#if !defined(ENDGAME_H_INCLUDED)
|
|
#define ENDGAME_H_INCLUDED
|
|
|
|
////
|
|
//// Includes
|
|
////
|
|
|
|
#include "position.h"
|
|
#include "scale.h"
|
|
#include "value.h"
|
|
|
|
|
|
////
|
|
//// Types
|
|
////
|
|
|
|
enum EndgameType {
|
|
|
|
// Evaluation functions
|
|
KXK, // Generic "mate lone king" eval
|
|
KBNK, // KBN vs K
|
|
KPK, // KP vs K
|
|
KRKP, // KR vs KP
|
|
KRKB, // KR vs KB
|
|
KRKN, // KR vs KN
|
|
KQKR, // KQ vs KR
|
|
KBBKN, // KBB vs KN
|
|
KmmKm, // K and two minors vs K and one or two minors
|
|
|
|
// Scaling functions
|
|
KBPK, // KBP vs K
|
|
KQKRP, // KQ vs KRP
|
|
KRPKR, // KRP vs KR
|
|
KRPPKRP, // KRPP vs KRP
|
|
KPsK, // King and pawns vs king
|
|
KBPKB, // KBP vs KB
|
|
KBPPKB, // KBPP vs KB
|
|
KBPKN, // KBP vs KN
|
|
KNPK, // KNP vs K
|
|
KPKP // KP vs KP
|
|
};
|
|
|
|
/// Template abstract base class for all special endgame functions
|
|
|
|
template<typename T>
|
|
class EndgameFunctionBase {
|
|
public:
|
|
EndgameFunctionBase(Color c) : strongerSide(c), weakerSide(opposite_color(c)) {}
|
|
virtual ~EndgameFunctionBase() {}
|
|
virtual T apply(const Position&) = 0;
|
|
|
|
protected:
|
|
Color strongerSide, weakerSide;
|
|
};
|
|
|
|
typedef EndgameFunctionBase<Value> EndgameEvaluationFunctionBase;
|
|
typedef EndgameFunctionBase<ScaleFactor> EndgameScalingFunctionBase;
|
|
|
|
|
|
/// Templates subclass for various concrete endgames
|
|
|
|
template<EndgameType>
|
|
struct EvaluationFunction : public EndgameEvaluationFunctionBase {
|
|
explicit EvaluationFunction(Color c): EndgameEvaluationFunctionBase(c) {}
|
|
Value apply(const Position&);
|
|
};
|
|
|
|
template<EndgameType>
|
|
struct ScalingFunction : public EndgameScalingFunctionBase {
|
|
explicit ScalingFunction(Color c) : EndgameScalingFunctionBase(c) {}
|
|
ScaleFactor apply(const Position&);
|
|
};
|
|
|
|
|
|
////
|
|
//// Prototypes
|
|
////
|
|
|
|
extern void init_bitbases();
|
|
|
|
|
|
#endif // !defined(ENDGAME_H_INCLUDED)
|