#include "a_structure.h"
//-----------------------------------------------------------------------------------
/* +
 * оценка позиции
 *
 * АВТОР ChessTerminator75
 * ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ 24.02.2009
*/
//---------------------------------------------------------------------------

/*******************************************
класс EVAL
оцениваем позицию

считаем 
материал (веса белых плюсуем а веса черных отнимаем)
позиционную оценку PST
мобильность фигур
атаку на окрестности короля
проходные

-------------------------------------------------------------------
План того что должно быть учтено.
Надо будет учесть следующие параметры (таблица от WildCat(Игорь Коршунов)
1. проходные                -195 да
2. ценность полей           -173 да
4. мобильность              - 78 да
3. пешечный щит             - 69 да
5. тяжелые фигуры           - 29 ?
6. пешечная структура       - 25 ?
7. очередность хода         - 18 ?
8. атака на короля          -  9 да
9. паттерны                 -  0 ?

Элементы отнимающие силу:

Код: Выделить всё
10. разноцвет               - 19 ?
-------------------------------------------------------------------


********************************************/


class EVAL {

// с помощью этой маски пишем и стираем фигуры из битового массива
static const unsigned __int64 e_move_masks[];

// маска ладья ходы вверх
static const unsigned __int64 e_rook_up_masks[];

// маска ладья ходы вниз
static const unsigned __int64 e_rook_down_masks[];

// маска ладья ходы влево
static const unsigned __int64 e_rook_left_masks[];

// маска ладья ходы вправо
static const unsigned __int64 e_rook_right_masks[];


// маска слон ходы вверх-вправо
static const unsigned __int64 e_bishop_up_right_masks[];

// маска слон ходы вверх-влево
static const unsigned __int64 e_bishop_up_left_masks[];

// маска слон ходы вниз-вправо
static const unsigned __int64 e_bishop_down_right_masks[];

// маска слон ходы вниз-влево
static const unsigned __int64 e_bishop_down_left_masks[];


// маски ходов короля
static const unsigned __int64 e_king_moves_masks[];


// маски ходов коня
static const unsigned __int64 e_knigt_moves_masks[];

//////////////////////////////////////////////////////////////////////////////////////////
public:

//---------------------------------------------------------------------------
// считываем параметры оценки из внешнего файла
int Read_parameters_eval(
			              );

//---------------------------------------------------------------------------
// задаем параметры оценки внутри кода
void Default_parameters_eval(
			                 );

//---------------------------------------------------------------------------
// иницализируем параметры оценки
void Ini_parameters_eval(
			             );

//---------------------------------------------------------------------------
// функция получает позицию и оценивает материал и только
int Eval_forced(const T_Bitboard * p_bitboard// представление доски
				);

//---------------------------------------------------------------------------
// функция получает позицию и оценивает ее статически
int Eval_State(const T_Bitboard * p_bitboard// представление доски
			   );

//////////////////////////////////////////////////////////////////////////////////////////
private:

//---------------------------------------------------------------------------
//
inline void EVAL::King_pst(const T_Bitboard * p_bitboard,// представление доски
                           int & from_white_king,// расположение белого короля
                           int & from_black_king,// расположение черного короля
                           int stadia_w, // сумарный вес фигур у белых
                           int stadia_b, // сумарный вес фигур у черных
                           int & eval //статическая оценка
                           );

//---------------------------------------------------------------------------
//
inline void EVAL::Pawn_pst(const T_Bitboard * p_bitboard,// представление доски
                           int from_white_king,// расположение белого короля
                           int from_black_king,// расположение черного короля
                           int stadia_w, // сумарный вес фигур у белых
                           int stadia_b, // сумарный вес фигур у черных
                           int & eval //статическая оценка
                           );

//---------------------------------------------------------------------------
//
inline void EVAL::PST(const T_Bitboard * p_bitboard,// представление доски
                      int from_white_king,// расположение белого короля
                      int from_black_king,// расположение черного короля
                      int & at_white_king, // количество атаковнных полей вокруг белого короля
                      int & at_black_king, // количество атаковнных полей вокруг черного короля
                      int & eval //статическая оценка
                      );

//---------------------------------------------------------------------------
__inline int first_one(unsigned __int64 bm);

//---------------------------------------------------------------------------
__inline int last_one(unsigned __int64 bm);

//---------------------------------------------------------------------------
// штраф за разрушение щита перед королем
inline int King_shield(int n,// положение короля (from)
					   int z,// цвет короля
					   const T_Bitboard * p_bitboard,// представление доски
					   const int SHIELD// бонус за прикрытие короля
					   );

//---------------------------------------------------------------------------
// просчитываем все возможные ходы ладьи возвращаем количество ходов
// и количество атакованных полей вокруг короля
inline int Rook_amoun(unsigned __int64  all_piece,// все фигуры
                      unsigned __int64  piece,// свои фигуры
					  int from,// расположение ладьи
					  int from_king,// расположение короля
					  int & at_cnt// количество атакованных полей вокруг короля(квадрат ходов короля)
					  );

//---------------------------------------------------------------------------
// просчитываем все возможные ходы слона возвращаем количество ходов
// и количество атакованных полей вокруг короля
inline int Bishop_amoun(unsigned __int64  all_piece,// все фигуры
                        unsigned __int64  piece,// свои фигуры
					    int from,// расположение слона
					    int from_king,// расположение короля
					    int & at_cnt// количество атакованных полей вокруг короля(квадрат ходов короля)
						);

//---------------------------------------------------------------------------
// просчитываем все возможные ходы ферзя. возвращаем количество ходов
// и количество атакованных полей вокруг короля
inline int Queen_amoun(unsigned __int64  all_piece,// все фигуры
                       unsigned __int64  piece,// свои фигуры
					   int from,// расположение ферзя
					   int from_king,// расположение короля
					   int & at_cnt// количество атакованных полей вокруг короля(квадрат ходов короля)
					   );

//---------------------------------------------------------------------------
// просчитываем все возможные ходы коня. возвращаем количество ходов
// и количество атакованных полей вокруг короля
inline int Knigt_amoun(unsigned __int64  all_piece,// все фигуры
                       unsigned __int64  piece,// свои фигуры
					   int from,// расположение коня
					   int from_king,// расположение короля
					   int & at_cnt// количество атакованных полей вокруг короля(квадрат ходов короля)
					   );

////////////////////////////////////////////////////////////////////////////////////////////
public:

// значения для обсчета материала
int KING; // король
int QUEEN;// ферзь
int ROOK;// ладья 
int BISHOP;// слон 
int KNIGHT;// конь 
int PAWN;// пешка 

// безопасность короля
int BONUS_CASTLING_O_O;// бонус за короткую рокировку
int BONUS_CASTLING_O_O_O;// бонус за длинную рокировку
int BONUS_SHIELD;// бонус за прикрытие короля спереди пешкой
int BONUS_PAWNN;// штраф за сдвоенные пешки
int PERSPECTIVE_PAWNN;// проходные пешки бонус за каждую вертикаль (макс 3)
int CONTROL_SQUARE ;// коэффициент захвата пространства фигурами
int ATAK_KING;// коэффициент атаки на короля

// это момент когда может вылезти король и начинаем гнать пешки вперед
int rubikon;//рубеж перехода в эндшпиль(две ладьи и слон и пешка)
            // как только материала у врага меньше то эндшпиль  


// тестируем задание pst(piece square tables)
int test[64];

// кони должны стремиться к центру
int Pozicion_n[64];

// слоны должны стремиться контролировать главные диагонали
int Pozicion_b[64];

//бонус пешкам за продвижение
//только центральные занимают форпост
//инвертна т.е. hgfedcba
int Pawn[64];

//бонус пешкам за продвижение используем для эндшпиля
// пешки ломятся вперед
int Pawn_e[64];


//бонус проходным пешкам за продвижение используем для эндшпиля
// пешки ломятся вперед
int Perspective_pawn_e[64];

// король должен прятаться
int Pozicion_k[64];

// в эндшпиле король должен стремиться к центру
// это таблица бонусов за централизацию короля
int Pozicion_k_e[64];

// массив весов фигур: 0 - 0, 1 - пешка, 2 - конь, 3- слон, 4 - ладья, 5 - ферзь, 6 - король;
int kod[7];

// имя фигуры 0 - нет фигуры 1 - пешка 2 - конь 3 - слон 4 - ладья 5 - ферзь 6 - король
// массив перекодировок материала (пешки(1) и король(6) не учитываются)
//                0 1 2      3      4    5     6
int rubikon_kod[7];

// для того что бы понимать как идет считывание
static const int c_test[];

// кони должны стремиться к центру
static const int c_Pozicion_n[];

// слоны должны стремиться контролировать главные диагонали
static const int c_Pozicion_b[];

//бонус пешкам за продвижение
//только центральные занимают форпост
//инвертна т.е. hgfedcba
static const int c_Pawn[];

//бонус пешкам за продвижение используем для эндшпиля
// пешки ломятся вперед
static const int c_Pawn_e[];

//бонус проходным пешкам за продвижение используем для эндшпиля
// пешки ломятся вперед
static const int c_Perspective_pawn_e[];

// король должен прятаться
static const int c_Pozicion_k[];

// в эндшпиле король должен стремиться к центру
// это таблица бонусов за централизацию короля
static const int c_Pozicion_k_e[];


};//class EVAL
