
/// АВТОР Бренкман Андрей (Brenkman Andrey)
/// ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ 2.05.10
/// УРОВЕНЬ МОЕГО ДОВЕРИЯ 50%


//!
#include "Header_constants.h"
#include "Undo.h"
#include "List.h"
#include "Position.h"

#define TEST_H 0 // включаем-выключаем(1-0) режим вывода в файл тестовой информации


/// реализуем ZObrist-ключи


namespace ZObrist
{

/// поля класса
//////////////////////////////////////////////////////////////////////////////////////
//private:

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

	/// РАБОТА С ХЕШ - КЛЮЧОМ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++

	///---------------------------------------------------------------------------
	/// каждой возможной позиции каждой возможной фигуры 
	/// присваиваем случайное число
	void ini_random_piese_key();

	///---------------------------------------------------------------------------
	/// инициализируем ключ начальной позиции
	void start_position_random_key
	(
		struct Position & position/// представление доски
	);

	///---------------------------------------------------------------------------
	/// меняем ключ во время хода
	void modification_random_key
	(
		struct Position & position,/// представление доски
		bool  colour_figure,/// цвет ходящей стороны
		unsigned __int8 i,/// номер хода по списку
		struct List & list_surplus_moves,/// представление списка ходов
		struct Undo & undo///информация для отката хода
	);


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

	///---------------------------------------------------------------------------
	/// генерируем случайный 64 битный ключ
	unsigned __int64 rand_64();


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

	/// ПОВТОРЫ ПОЗИЦИЙ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

	///---------------------------------------------------------------------------
	/// возвращаем количество ходов в строке игры переданной из оболочки
	__int32 get_save_cnt_move();

	///---------------------------------------------------------------------------
	/// инициализируем хеш-массив повторов возрастающими числами что бы исключить ложное срабатывание
	void ini_hash_three();

	///---------------------------------------------------------------------------
	/// инициализируем хеш-массив повторов возрастающими числами что бы исключить ложное срабатывание
	void ini_hash_string_moves();

	///---------------------------------------------------------------------------
	/// запоминаем хеш-ключ на текущей глубине
	/// нужно для детектора повторов в линии варианта
	void save_hash_three
	(
		unsigned __int64 key,/// хеш-ключ
		unsigned __int8 depth /// глубина
	);

	///---------------------------------------------------------------------------
	/// запоминаем хеш-ключ для текущего хода
	/// нужно для детектора повторов в линии партии переданной оболочкой
	void save_hash_string_moves
	(
		unsigned __int64 key,/// хеш-ключ
		unsigned __int16 cnt_move /// счетчик ходов
	);

	///---------------------------------------------------------------------------
	/// анализируем линию ключей полученную из строки партии. если видим совпадение то возвращаем 1 иначе 0
	/// конечно совпадение не должно быть трехкратным ведь тогда это уже ничья
	bool analysis_hash_string_moves
	(
		unsigned __int8 depth /// глубина
	);

};