亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eval.c

?? gun C 環境下編寫的
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* GNU Chess 5.0 - eval.c - evaluation 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 <stdlib.h>
#include "common.h"
#include "eval.h"

int LoneKing (int, int);
int ScoreKBNK (int, int);
int KPK (int);
int BishopTrapped (short);
int DoubleQR7 (short);

BitBoard passed[2];
BitBoard weaked[2];

static int PawnSq[2][64] = 
{
{  0,  0,  0,  0,  0,  0,  0,  0,
   5,  5,  5,-10,-10,  5,  5,  5,
  -2, -2, -2,  6,  6, -2, -2, -2,
   0,  0,  0, 25, 25,  0,  0,  0,
   2,  2, 12, 16, 16, 12,  2,  2,
   4,  8, 12, 16, 16, 12,  4,  4,
   4,  8, 12, 16, 16, 12,  4,  4,
   0,  0,  0,  0,  0,  0,  0,  0},
{  0,  0,  0,  0,  0,  0,  0,  0,
   4,  8, 12, 16, 16, 12,  4,  4,
   4,  8, 12, 16, 16, 12,  4,  4,
   2,  2, 12, 16, 16, 12,  2,  2,
   0,  0,  0, 25, 25,  0,  0,  0,
  -2, -2, -2,  6,  6, -2, -2, -2,
   5,  5,  5,-10,-10,  5,  5,  5,
   0,  0,  0,  0,  0,  0,  0,  0}
};

static const int Passed[2][8] =
{ { 0, 48, 48, 120, 144, 192, 240, 0}, {0, 240, 192, 144, 120, 48, 48, 0} };
/* Penalties for one or more isolated pawns on a given file */
static const int isolani_normal[8] = {
  -8, -10, -12, -14, -14, -12, -10, -8
};
/* Penalties if the file is half-open (i.e. no enemy pawns on it) */
static const int isolani_weaker[8] = {
  -22, -24, -26, -28, -28, -26, -24, -22
};

static const BitBoard d2e2[2] =
		 { ULL(0x0018000000000000), ULL(0x0000000000001800) };
static const BitBoard brank7[2]  = { ULL(0x000000000000FF00),
				     ULL(0x00FF000000000000) };
static const BitBoard brank8[2]  = { ULL(0x00000000000000FF),
				     ULL(0xFF00000000000000) };
static const BitBoard brank67[2] = { ULL(0x0000000000FFFF00),
				     ULL(0x00FFFF0000000000) };
static const BitBoard brank58[2] = { ULL(0x00000000FFFFFFFF),
				     ULL(0xFFFFFFFF00000000) };

int ScoreP (short side)
/***************************************************************************
 *
 *  Pawn evaluation is based on the following factors (which is being
 *  constantly updated!).
 *
 *  1.  Pawn square tables.
 *  2.  Passed pawns.
 *  3.  Backward pawns.
 *  4.  Pawn base under attack.
 *  5.  Doubled pawns 
 *  6.  Isolated pawns 
 *  7.  Connected passed pawns on 6/7th rank.
 *  8.  Unmoved & blocked d, e pawn
 *  9.  Passed pawn which cannot be caught.
 *  10. Pawn storms.
 *
 ***************************************************************************/
{
   int xside;
   int s, sq, i, i1;
   int n1, n2, backward;
   int nfile[8];
   int EnemyKing;
   BitBoard c, t, p, blocker, *e;
   PawnSlot *ptable;

   if (board.b[side][pawn] == NULLBITBOARD)
      return (0);
   xside = 1^side;
   EnemyKing = board.king[xside];
   p = board.b[xside][pawn];
   c = t = board.b[side][pawn];
   ptable = PawnTab[side] + (PawnHashKey & PHashMask);
   TotalPawnHashCnt++;
   if (ptable->phase == phase && ptable->pkey == KEY(PawnHashKey))
   {
      GoodPawnHashCnt++;
      s = ptable->score;
      passed[side] = ptable->passed;
      weaked[side] = ptable->weaked;
      goto phase2; 
   }

   s = 0;
   passed[side] = NULLBITBOARD;
   weaked[side] = NULLBITBOARD;
   memset (nfile, 0, sizeof (nfile));
   while (t)
   {
      sq = leadz (t);
      CLEARBIT (t, sq);
      s += PawnSq[side][sq]; 

      /*  Passed pawns  */
      if ((p & PassedPawnMask[side][sq]) == NULLBITBOARD)
      {
	 if ((side == white && (FromToRay[sq][sq|56] & c) == 0) ||
	     (side == black && (FromToRay[sq][sq&7] & c) == 0)) 
         {
            passed[side] |= BitPosArray[sq];
            s += (Passed[side][RANK(sq)] * phase) / 12;
         }
      }

      /*  Backward pawns */
      backward = false;
    /*   i = sq + (side == white ? 8 : -8); */
      if ( side == white ) {
 	 i = sq + 8;  }
      else {
         i= sq - 8; }

      if (!(PassedPawnMask[xside][i] & ~FileBit[ROW(sq)] & c) &&
	  cboard[i] != pawn)
      {
         n1 = nbits (c & MoveArray[ptype[xside]][i]);
         n2 = nbits (p & MoveArray[ptype[side]][i]);
         if (n1 < n2)
            backward = true;
      }
      if (!backward && (BitPosArray[sq] & brank7[xside]))
      {
         i1 = 1;
         i = i + (side == white ? 8 : -8);
         if (!(PassedPawnMask[xside][i] & ~FileBit[ROW(i1)] & c))
         {
            n1 = nbits (c & MoveArray[ptype[xside]][i]);
            n2 = nbits (p & MoveArray[ptype[side]][i]);
            if (n1 < n2)
               backward = true;
         }
      }
      if (backward)
      {
         weaked[side] |= BitPosArray[sq];
         s += BACKWARDPAWN;
      }

      /* Pawn base under attack */
      if ((MoveArray[ptype[side]][sq] & p) && (MoveArray[ptype[side]][sq] & c))
         s += PAWNBASEATAK;
 
      /*  Increment file count for isolani & doubled pawn evaluation */
      nfile[ROW(sq)]++;
   }

   for (i = 0; i <= 7; i++)
   {
      /* Doubled pawns */
      if (nfile[i] > 1)
         s += DOUBLEDPAWN;

      /* Isolated pawns */
      if (nfile[i] && (!(c & IsolaniMask[i])))
      {
	 /* Isolated on a half-open file */
         if (!(FileBit[i] & board.b[xside][pawn]))
	   s += isolani_weaker[i] * nfile[i];
	 else /* Normal isolated pawn */
           s += isolani_normal[i] * nfile[i];
	 weaked[side] |= (c & FileBit[i]);
      }
   }


  if (computerplays == side) {

    /* Penalize having eight pawns */
    if (nbits(board.b[computerplays][pawn]) == 8)
        s += EIGHT_PAWNS;

    /* Detect stonewall formation in enemy */
    if (nbits(stonewall[xside] & board.b[xside][pawn]) == 3)
      s += STONEWALL;

    /* Locked pawns */
    n = 0;
    if (side == white)
      n = nbits((c >> 8) & board.b[xside][pawn] &
               boxes[1]);
    else
      n = nbits((c << 8) & board.b[xside][pawn] &
               boxes[1]);
    if (n > 1)
      s += n * LOCKEDPAWNS;
  }


   /* Save the score into the pawn hash table */ 
   ptable->pkey = KEY(PawnHashKey);
   ptable->passed = passed[side];
   ptable->weaked = weaked[side];
   ptable->score = s;
   ptable->phase = phase;

/***************************************************************************
 *  
 *  This section of the pawn code cannot be saved into the pawn hash as
 *  they depend on the position of other pieces.  So they have to be 
 *  calculated again.
 *
 ***************************************************************************/
phase2:

   /* Pawn on f6/c6 with Queen against castled king is very strong */
   c = board.b[side][pawn];
   sq = board.king[xside];
   if (side == white && board.b[side][queen] && 
	(BitPosArray[C6] | BitPosArray[F6]) & c)
   {
      if (c & BitPosArray[F6] && sq > H6 && distance[sq][G7]==1)
         s += PAWNNEARKING;
      if (c & BitPosArray[C6] && sq > H6 && distance[sq][B7]==1)
         s += PAWNNEARKING;
   }
   else if (side == black && board.b[side][queen] &&
	(BitPosArray[C3] | BitPosArray[F3]) & c)
   {
      if (c & BitPosArray[F3] && sq < A3 && distance[sq][G2]==1)
         s += PAWNNEARKING;
      if (c & BitPosArray[C3] && sq < A3 && distance[sq][B2]==1)
         s += PAWNNEARKING;
   }

   /* Connected passed pawns on 6th or 7th rank */
   t = passed[side] & brank67[side];
   if (t && (board.pmaterial[xside] == ValueR || 
	(board.pmaterial[xside] == ValueN &&
	pieces[xside] == board.b[xside][knight])))
   {
      n1 = ROW(board.king[xside]);
      n2 = RANK(board.king[xside]);
      for (i = 0; i <= 6; i++)
      {
	 if (t & FileBit[i] && t & FileBit[i+1] && (n1 < i-1 || n1 > i+1 ||
		(side == white && n2 < 4) || (side == black && n2 > 3)))
            s += CONNECTEDPP;
      }
   }

   /* Pawn on d2,e2/d7,e7 is blocked  */
   blocker = board.friends[side] | board.friends[xside];
   if (side == white && (((c & d2e2[white]) >> 8) & blocker))
      s += BLOCKDEPAWN;
   if (side == black && (((c & d2e2[black]) << 8) & blocker))
      s += BLOCKDEPAWN;

   /* Enemy has no pieces & King is outside of passed pawn square */
   if (passed[side] && board.pmaterial[xside]==0)
   {
      e = board.b[xside];
      i1 = board.king[xside];
      p = passed[side];
      while (p)
      {
         sq = leadz (p);
	 CLEARBIT (p, sq);
	 if (board.side == side)
         {
	    if (!(SquarePawnMask[side][sq] & board.b[xside][king]))
	       s += ValueQ * Passed[side][RANK(sq)] / PFACTOR;
         }
         else if (!(MoveArray[king][i1] & SquarePawnMask[side][sq]))
	    s += ValueQ * Passed[side][RANK(sq)] / PFACTOR;
      }
   }

  /* If both sides are castled on different sides, bonus for pawn storms */
  c = board.b[side][pawn];
  if (abs (ROW (board.king[side]) - ROW (board.king[xside])) >= 4 &&
	PHASE < 6)
  {
     n1 = ROW (board.king[xside]);
     p = (IsolaniMask[n1] | FileBit[n1]) & c;
     while (p)
     {
        sq = leadz (p);
        CLEARBIT (p, sq);
        s += 10 * (5 - distance[sq][board.king[xside]]);
     }
  }

   return (s);
}

static const int Outpost[2][64] =
{
  { 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 0, 1, 1, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 1, 1, 0, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0 }
};


static inline int CTL(short sq, short piece __attribute__ ((unused)), short side)
/***************************************************************************
 *
 *  Return a score corresponding to the number of squares in the bitboard
 *  target multiplied by a specified bonus for controlling each square.
 *
 *  Can be used for control of the center and attacks around the king.
 *
 ***************************************************************************/
{
  int s, n, EnemyKing, FriendlyKing;
  BitBoard controlled;

  s = 0;

  EnemyKing = board.king[1^side];
  FriendlyKing = board.king[side];

  controlled = AttackXFrom (sq, side);

  /* Center control */
  n = nbits (controlled & boxes[0]);
  s += 4*n;

  /* Attacks against enemy king */
  n = nbits (controlled & DistMap[EnemyKing][2]);
  s += n;

  /* Defenses for friendly king */
  n = nbits (controlled & DistMap[FriendlyKing][2]);
  s += n;

  /* Mobility */
  n = nbits(controlled);
  s += 4*n;

  return (s);
}

int ScoreN (short side)
/***************************************************************************
 *
 *  1.  central knight - distance from enemy king.
 *  2.  mobility/control/attack
 *  3.  outpost knight protected by pawn.
 *  4.  knight attacking weak pawns.
 *
 ***************************************************************************/
{
   int xside;
   int s, s1, sq;
   int EnemyKing;
   BitBoard c, t;

   if (board.b[side][knight] == NULLBITBOARD)
      return (0);
   xside = side^1;
   s = s1 = 0;
   c = board.b[side][knight];
   t = board.b[xside][pawn]; 
   EnemyKing = board.king[xside];

   if ( c & pinned )
   {
	s += PINNEDKNIGHT * nbits(c & pinned);
   }

   while (c)
   {
      sq = leadz (c);
      CLEARBIT (c, sq);

      /* Control */
      s1 = CTL(sq,knight,side);
  
      if ( (BitPosArray[sq] & rings[3]) != NULLBITBOARD)
	s1 += KNIGHTONRIM;

      if (Outpost[side][sq] && 
	  !(t & IsolaniMask[ROW(sq)] & PassedPawnMask[side][sq]) )
      {
         s1 += OUTPOSTKNIGHT;

    	 /* Knight defended by own pawn */
         if (MoveArray[ptype[xside]][sq] & board.b[side][pawn])
            s1 += OUTPOSTKNIGHT;
      }
    
      /* Attack on weak opponent pawns */
      if (MoveArray[knight][sq] & weaked[xside])
         s1 += ATAKWEAKPAWN;

      s += s1;
   }

   return (s);
}


int ScoreB (short side)
/****************************************************************************
 *
 *  1.  double bishops.
 *  2.  mobility/control/attack
 *  3.  outpost bishop
 *  4.  fianchetto bishop
 *  5.  Bishop pair
 *
 ****************************************************************************/
{
   int xside;
   int s, s1, n, sq, EnemyKing;
   BitBoard c, t;

   if (board.b[side][bishop] == NULLBITBOARD)
      return (0);
   s = s1 = 0;
   c = board.b[side][bishop];
   xside = side ^ 1;
   EnemyKing = board.king[xside];
   n = 0;
   t = board.b[xside][pawn];

   if ( c & pinned )
   {
	s += PINNEDBISHOP * nbits(c & pinned);
   }

   while (c)
   {
      sq = leadz (c);
      CLEARBIT (c, sq);
      n++;

      /* Control */
      s1 = CTL(sq,bishop,side);

      /*  Outpost bishop */
      if (Outpost[side][sq] && 
	  !(t & IsolaniMask[ROW(sq)] & PassedPawnMask[side][sq]))
      {
         s1 += OUTPOSTBISHOP;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区中文字幕| 久久精品夜色噜噜亚洲aⅴ| 亚洲激情图片一区| 欧美亚洲国产怡红院影院| 亚洲一区av在线| 欧美日韩国产另类不卡| 麻豆专区一区二区三区四区五区| 在线播放91灌醉迷j高跟美女 | 一区二区在线观看视频在线观看| 色婷婷国产精品| 五月婷婷激情综合| 日韩欧美一区二区三区在线| 国产一区二区日韩精品| 国产精品理伦片| 欧洲av在线精品| 日韩av电影免费观看高清完整版在线观看| 日韩免费一区二区三区在线播放| 九九精品视频在线看| 中文字幕不卡的av| 欧美日韩免费观看一区三区| 日本欧美在线看| 国产精品美女久久久久久| 欧美性色综合网| 国产乱色国产精品免费视频| 一区二区三区中文字幕精品精品| 777a∨成人精品桃花网| 国产成人av影院| 亚洲.国产.中文慕字在线| 久久久综合九色合综国产精品| 成人免费观看av| 青青草伊人久久| 日本一区二区三区久久久久久久久不| 日本二三区不卡| 国产一区久久久| 亚洲欧美区自拍先锋| 精品国产百合女同互慰| 在线亚洲免费视频| 国产精品一级片在线观看| 亚洲综合免费观看高清完整版在线| 精品日韩欧美在线| 欧美优质美女网站| 国产成人精品亚洲777人妖| 偷拍一区二区三区四区| 国产精品私人自拍| 欧美videossexotv100| av午夜一区麻豆| 国产在线视视频有精品| 日韩在线一二三区| 亚洲欧美经典视频| 欧美激情一区二区三区全黄 | 不卡的av在线| 久久99精品一区二区三区三区| 亚洲精品中文在线影院| 欧美韩国日本综合| 精品久久久网站| 91精品国产综合久久久久| 色婷婷国产精品综合在线观看| 国产成a人亚洲精品| 久久国产精品72免费观看| 日韩影院在线观看| 亚洲高清在线精品| 一区二区三区**美女毛片| 一色桃子久久精品亚洲| 久久精品亚洲麻豆av一区二区 | 久久综合资源网| 日韩一区二区三区免费观看| 欧美手机在线视频| 欧美亚州韩日在线看免费版国语版| 99久精品国产| 成人一级片网址| 成人av网站在线观看| 国产精品99久久久久久似苏梦涵 | 久久99国产精品久久99果冻传媒| 五月天一区二区| 日本中文字幕不卡| 日韩国产一二三区| 日韩电影免费在线看| 日一区二区三区| 亚洲电影在线播放| 日韩激情中文字幕| 老司机免费视频一区二区| 九九在线精品视频| 国产一区二区导航在线播放| 色婷婷综合久久久久中文一区二区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 91色乱码一区二区三区| av在线免费不卡| 91丨porny丨蝌蚪视频| 成人a级免费电影| 91亚洲精品乱码久久久久久蜜桃| 91蝌蚪porny| 欧洲一区二区三区免费视频| 欧美日韩一区国产| 欧美一二三区在线观看| 久久亚洲一区二区三区明星换脸| 欧美激情中文字幕一区二区| 亚洲丝袜美腿综合| 亚洲mv在线观看| 久久66热re国产| a级高清视频欧美日韩| 91激情在线视频| 欧美一区二区三区视频免费| 欧美成人精品福利| 国产精品少妇自拍| 午夜影院久久久| 国产麻豆一精品一av一免费| 成人app在线观看| 欧美影院一区二区| 精品日韩av一区二区| 国产精品久久久久影院亚瑟| 亚洲大片免费看| 国产精品 欧美精品| 色诱亚洲精品久久久久久| 5566中文字幕一区二区电影| 久久久www免费人成精品| 国产综合一区二区| 在线观看国产精品网站| 精品久久久久久久久久久久久久久| 国产精品久久久久久亚洲毛片| 亚洲一区二区三区四区在线免费观看 | 日本不卡123| 99久久99久久久精品齐齐| 欧美日韩一级黄| 国产亚洲欧美激情| 天天色综合天天| 99久久精品免费看国产免费软件| 91精品福利在线一区二区三区 | 精品欧美一区二区在线观看| 国产欧美视频一区二区| 日韩一区精品视频| av在线一区二区| 精品国产一区a| 亚洲男女毛片无遮挡| 激情偷乱视频一区二区三区| 欧美性大战久久久久久久蜜臀| 26uuu精品一区二区在线观看| 亚洲精品水蜜桃| 国产成人超碰人人澡人人澡| 制服丝袜亚洲播放| 伊人一区二区三区| 春色校园综合激情亚洲| 日韩欧美的一区| 香蕉影视欧美成人| 色就色 综合激情| 中文在线一区二区| 国产一区二区三区四区五区入口 | 日韩免费视频一区| 午夜精品免费在线| 色视频一区二区| 国产女主播在线一区二区| 日本v片在线高清不卡在线观看| 色久综合一二码| 亚洲欧美综合网| av电影在线不卡| 亚洲国产精品99久久久久久久久| 久久99日本精品| 日韩片之四级片| 日本欧美韩国一区三区| 在线免费观看日本欧美| 一区二区三区不卡视频| 91在线视频网址| 亚洲欧洲av色图| 99久久久久久99| 成人欧美一区二区三区白人| www.欧美日韩| 中文一区二区在线观看| 从欧美一区二区三区| 中文字幕av一区二区三区| 日韩一区二区电影在线| 日本特黄久久久高潮| 日韩一级二级三级精品视频| 三级在线观看一区二区| 91精品国产91综合久久蜜臀| 免费高清成人在线| 久久综合av免费| 丁香婷婷综合激情五月色| 中文字幕第一页久久| 91在线porny国产在线看| 亚洲美女精品一区| 欧美三电影在线| 美女视频一区二区三区| 久久综合九色综合欧美98| 国产精品一卡二卡| 综合色中文字幕| 欧美亚洲尤物久久| 美女网站在线免费欧美精品| 久久综合九色综合欧美亚洲| 国产suv精品一区二区三区| 亚洲人午夜精品天堂一二香蕉| 欧美亚洲综合久久| 久久99久久99精品免视看婷婷 | 国产精品狼人久久影院观看方式| 97se狠狠狠综合亚洲狠狠| 一卡二卡三卡日韩欧美| 欧美一区二区三区婷婷月色| 国产精品小仙女| 一区二区在线观看av| 欧美日本不卡视频| 国产在线视频不卡二| 亚洲乱码国产乱码精品精的特点 |