Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: TSCP strength improvements (attack function)

Author: Michel Langeveld

Date: 09:30:40 01/11/04

Go up one level in this thread


The attack function change made it 38.3% quicker, it is now as follows:

6    412    358329    -10  b1c3 i8h6 i1h3 b8c6 e2e4 e7e5
7   3086   2813188     18  b1c3 i8h6 i1h3 b8c6 e2e4 e7e5 f2f4

6    273    363232    -10  b1c3 i8h6 i1h3 b8c6 e2e4 e7e5
7   1901   2868337     18  b1c3 i8h6 i1h3 b8c6 e2e4 e7e5 f2f4

Did I squeeze it far enough?

/* attack() returns TRUE if square sq is being attacked by side
   s and FALSE otherwise. */
BOOL attack(int sq, int s)
{
   int j, p, o;
   int sq144, fromfield, fromfield144;

   //are we attacked by a pawn?
   if (s == LIGHT) {

      //attacked from left
     if (col[sq] != 0) {
         fromfield = sq + 9;
         if (piece[fromfield] == PAWN && color[fromfield] == s)
            return TRUE;
      }

      //attacked from right
      if (col[sq] != 9) {
         fromfield = sq + 11;
         if (piece[fromfield] == PAWN && color[fromfield] == s)
   	      return TRUE;
      }
   }
   else {
      //attacked from left
      if (col[sq] != 0) {
         fromfield = sq - 11;
         if (piece[fromfield] == PAWN && color[fromfield] == s)
            return TRUE;
      }

      //attacked from right
      if (col[sq] != 9) {
         fromfield = sq - 9;
         if (piece[fromfield] == PAWN && color[fromfield] == s)
            return TRUE;
      }
   }

   sq144 = mailbox80_to_144[sq];

   //8 knight directions
   for (j = 0; j < 8; ++j) {
      o = offset[KNIGHT][j];
      fromfield = mailbox144_to_80[sq144 + o];

      //are we from board?
      if (fromfield == -1) continue;

      if (color[fromfield] == s) {
         p = piece[fromfield];
         if (p == KNIGHT || p == ARCHBISHOP || p == CHANCELLOR)
            return TRUE;
      }
   }

   //bishops 4 directions (also valid for archbishop, queens)
   for (j = 0; j < 4; ++j) {
      o = offset[BISHOP][j];
      for (fromfield144 = sq144;;) {
         fromfield144 += o;
         fromfield = mailbox144_to_80[fromfield144];

         //are we still on board?
         if (fromfield == -1) break;

         //we have a piece
         if (color[fromfield] != EMPTY) {
            //is it an opponent piece?
            if (color[fromfield] == s)
            {
               p = piece[fromfield];
               if (p == BISHOP || p == ARCHBISHOP || p == QUEEN)
                  return TRUE;
            }
            //we can stop slider doesn't go further
            break;
         }
      }
   }

   //4 rook directions (also valid for chancelor, queens)
   for (j = 0; j < 4; ++j) {
      o = offset[ROOK][j];
      for (fromfield144 = sq144;;) {
         fromfield144 += o;
         fromfield = mailbox144_to_80[fromfield144];

         //are we still on board?
         if (fromfield == -1) break;

         //we have a piece
         if (color[fromfield] != EMPTY) {
            //is it an opponent piece?
            if (color[fromfield] == s)
            {
               p = piece[fromfield];
               if (p == ROOK || p == CHANCELLOR || p == QUEEN)
                  return TRUE;
            }
            //we can stop slider doesn't go further
            break;
         }
      }
   }

   //look this field is attacked by a king
   fromfield144 = mailbox80_to_144[kings[side]];

   //we calculate a vector between the king of this attacking
   //color and the current field
   o = abs(fromfield144 - sq144);

   if (o == 1 || o == 11 || o == 12 || o == 13)
   {
      return TRUE;
   }

  return FALSE;
}



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.