📄 transpositiontable.cpp
字号:
/****************************************************
Author: S. Senthil kumar
File: TranspositionTable.cpp
Purpose: Implementation of the board transposition table
******************************************************/
#include "Global.h"
#include "OneMove.h"
#include "TransTableEntry.h"
#include "TranspositionTable.h"
TransTableEntry::TransTableEntry()
{
valid=0;
}
TranspositionTable::TranspositionTable()
{
//Initialize TranspositionTable
srand(32727);
for (int i=0;i<7;i++)
{
for (int j=0;j<8;j++)
{
for (int k=0;k<8;k++)
{
ZobristTable[i][j][k]=abs(rand());
HashLockTable[i][j][k]=abs(rand());
}
}
}
//Invalidate all entries initially.
for (int x=0;x<HASH_SIZE;x++)
{
hashtable[x].valid=0;
}
tdebug=0;
}
void TranspositionTable::AddEntry(int board[8][8],TransTableEntry entry)
{
int hashcode=GetHashCode(board) % HASH_SIZE;
int hashlock=GetHashLock(board);
TransTableEntry e=hashtable[hashcode];
if (e.valid)
{
//If new entry has greater or equal depth, replace entry with new one.
if ((e.depth==entry.depth && e.value<entry.value) || (e.depth<entry.depth))
{
e.move=entry.move;
e.depth=entry.depth;
e.value=entry.value;
e.hashlock=hashlock;
hashtable[hashcode]=e;
}
}
else
{
//No entry for current board posn. Set parameters for the new entry and add to hashtable
e.valid=1;
e.move=entry.move;
e.depth=entry.depth;
e.value=entry.value;
e.next=NULL;
e.hashlock=hashlock;
e.valid=1;
hashtable[hashcode]=e;
}
tdebug=0;
}
TransTableEntry TranspositionTable::LookUp(int board[8][8])
{
//Checks to see if entry present. Otherwise returns dummy invalid entry.
int hashcode=GetHashCode(board) % HASH_SIZE;
TransTableEntry dummy;dummy.valid=0;
TransTableEntry e=hashtable[hashcode];
if (hashcode<0 || e.valid==0) return dummy;
if (e.hashlock==GetHashLock(board))
{
return e;
}
else
{
return dummy;
}
}
//Not necessary. For debugging purposes
CString TranspositionTable::GetBoardArray(int board[8][8])
{
CString boardarray;
char buf[10];
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (board[i][j]<10)
boardarray+="W"+(CString)itoa(board[i][j],buf,10);
else
boardarray+=itoa(board[i][j],buf,10);
}
}
return boardarray;
}
int TranspositionTable::GetHashCode(int board[8][8])
{
//Generates hash code
int key=0;
//Iterate through each board position
//Xor repeatedly by indexing with piece,xposn,yposn on ZobristTable(random no table)
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (board[i][j]!=0)
{
key=key^ZobristTable[board[i][j]%10][i][j];
}
}
}
return key;
}
int TranspositionTable::GetHashLock(int board[8][8])
{
//Hashlock for double protection against duplicate Zobrist Keys
//Same procedure as ZobristKey
int hashlock=0;
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (board[i][j]!=0)
{
hashlock=hashlock^HashLockTable[board[i][j]%10][i][j];
}
}
}
return hashlock;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -