⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ttable.c

📁 一款运行在linux上的象棋游戏。用GTK/GNOME环境下用GLADE开发。
💻 C
字号:
/* GNU Chess 5.0 - ttable.c - transposition table code   Copyright (c) 1999-2002 Free Software Foundation, Inc.   GNU Chess is based on the two research programs    Cobalt by Chua Kong-Sian and Gazebo by Stuart Cracraft.   GNU Chess 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 2, or (at your option)   any later version.   GNU Chess 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 GNU Chess; see the file COPYING.  If not, write to   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.   Contact Info:      bug-gnu-chess@gnu.org     cracraft@ai.mit.edu, cracraft@stanfordalumni.org, cracraft@earthlink.net*/#include <stdio.h>#include <string.h>#include "common.h"void TTPut (uint8_t side, uint8_t depth, uint8_t ply, int alpha, int beta, 	    int score, int move)/**************************************************************************** * *  Uses a two-tier depth-based transposition table.  The criteria for  *  replacement is as follows. *  1.  The first element is replaced whenever we have a position with *      at least the same depth. In that case the element is moved to *      the second slot. *  2.  The second slot is otherwise always replaced. *  Problem may be that the first elements eventually get filled with *  outdated entries. Might add an age counter later. *  The & ~1 is a trick to clear the last bit making the offset even.  * ****************************************************************************/{   HashSlot *t;   t = HashTab[side] + ((HashKey & TTHashMask) & ~1);    if (depth < t->depth)      t++;   else if (t->flag)      *(t+1) = *t;   if (t->flag)      CollHashCnt++;   TotalPutHashCnt++;   t->move = move;   t->key = HashKey;   t->depth = depth;   if (t->depth == 0)      t->flag = QUIESCENT;   else if (score >= beta)      t->flag = LOWERBOUND;            else if (score <= alpha)      t->flag = UPPERBOUND;   else        t->flag = EXACTSCORE;   if (MATESCORE(score))      t->score = score + ( score > 0 ? ply : -ply);   else      t->score = score;}uint8_t TTGet (uint8_t side, uint8_t depth, uint8_t ply, 	       int *score, int *move)/***************************************************************************** * *  Probe the transposition table.  There are 2 entries to be looked at as *  we are using a 2-tier transposition table. * *****************************************************************************/{   HashSlot *t;   TotalGetHashCnt++;   t = HashTab[side] + ((HashKey & TTHashMask) & ~1);     if (HashKey != t->key && HashKey != (++t)->key)      return (0);   GoodGetHashCnt++;   *move = t->move;   *score = t->score;   if (t->depth == 0)      return (QUIESCENT);   if (t->depth < depth && !MATESCORE (t->score))      return (POORDRAFT);   if (MATESCORE(*score))      *score -= (*score > 0 ? ply : -ply);   return (t->flag);}short TTGetPV (uint8_t side, uint8_t ply, int score, int *move)/***************************************************************************** * *  Probe the transposition table.  There are 2 entries to be looked at as *  we are using a 2-tier transposition table.  This routine merely wants to *  get the PV from the hash, nothing else. * *****************************************************************************/{   HashSlot *t;   int s;   t = HashTab[side] + ((HashKey & TTHashMask) & ~1);     s = t->score;   if (MATESCORE(s))      s -= (s > 0 ? ply : -ply);   if (HashKey == t->key && ((ply & 1 && score == s)||(!(ply & 1) && score == -s)))   {      *move = t->move;      return (1);   }   t++;   s = t->score;   if (MATESCORE(s))      s -= (s > 0 ? ply : -ply);   if (HashKey == t->key && ((ply & 1 && score == s)||(!(ply & 1) && score == -s)))   {      *move = t->move;      return (1);   }   return (0); }void TTClear (void)/**************************************************************************** *    *  Zero out the transposition table. * ****************************************************************************/{   memset (HashTab[white], 0, HashSize * sizeof (HashSlot));   memset (HashTab[black], 0, HashSize * sizeof (HashSlot));}void PTClear (void)/**************************************************************************** *    *  Zero out the pawn transposition table. * ****************************************************************************/{   memset (PawnTab[white], 0, PAWNSLOTS * sizeof (PawnSlot));   memset (PawnTab[black], 0, PAWNSLOTS * sizeof (PawnSlot));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -