Computer Chess Club Archives


Search

Terms

Messages

Subject: Nullmove question

Author: Michel Langeveld

Date: 07:28:54 01/13/04


The idea of Nullmove is that you let a player have the right to do two moves
during a game. If he can't win with this right then his position is really bad,
and we count it as lost.
--------------------------------------------------------------------------------
original
6    318    343459     -8  b1c3 b8c6 i1h3 d7d6 h3f4 c8f5
7   1782   2188112      3  b1c3 d7d5 d2d4 c8f5 i1h3 i8h6 c1f4

nullmove with: if (!c && !nullmoved && depth - 1 - R > 0)
6    215    227824     -8  b1c3 b8c6 i1h3 d7d6 h3f4 c8f5
7    859   1008458      3  i1h3 d7d5 d2d4 c8f5 b1c3 i8h6 c1f4

nullmove with :if (!c && !nullmoved)
6     59     63778     -3  i1h3 d7d6 g1f3 i8h6 b1c3 b8c6
7    342    403509      3  i1h3 d7d5 d2d4 c8f5 c1f4 i8h6 b1c3

My question is do I have to protect that after a nullmove we go immediatly into
quiesce or can I live without this protection?
--------------------------------------------------------------------------------

/* search() does just that, in negamax fashion */
int search(int alpha, int beta, int depth)
{
   int i, j, x;
   int his_piece;
   BOOL c, f;

   int best_score;

   /* we're as deep as we want to be; call quiesce() to get
      a reasonable score and return it. */
   if (depth <= 0)
      return quiesce(alpha,beta);
   ++nodes;

   /* do some housekeeping every 1024 nodes */
   if ((nodes & 1023) == 0)
      checkup();

   pv_length[ply] = ply;

   /* if this isn't the root of the search tree (where we have
      to pick a move and can't simply return 0) then check to
      see if the position is a repeat. if so, we can assume that
      this line is a draw and return 0. */
   if (ply && reps())
      return 0;

   /* are we too deep? */
   if (ply >= MAX_PLY - 1)
      return eval();
   if (hply >= HIST_STACK - 1)
      return eval();

   /* are we in check? */
   c = in_check(side);

   //we are not check and did not do a nullmove before

   //Question : what if clausule can we use here?
   if (!c && !nullmoved)
   {
      //set the end marker
      first_move[ply + 1] = first_move[ply];
      makenullmove();
      x = -search(-beta, -beta + 1, depth - 1 - R);
      takebacknullmove();

      if (x >= beta)
        return beta;

      //restore that fact that we are not check
      c = FALSE;
   }

   /* if we are in check don't seach deeper */
   if (c) depth++;

   gen();
   if (follow_pv)  /* are we following the PV? */
      sort_pv();
   f = FALSE;

   best_score = -10000;

   /* loop through the moves */
   for (i = first_move[ply]; i < first_move[ply + 1]; ++i) {
      sort(i);
      if (!makemove(gen_dat[i].m))
         continue;
      f = TRUE;

      if (best_score == -10000)
         x = -search(-beta, -alpha, depth - 1);
      else
      {
         x = -search(-(alpha + 1), -alpha, depth - 1);
         if (x > alpha && x < beta)
         {
            x = -search(-beta, -alpha, depth - 1);
         }
      }

      takeback();

      if (x > best_score) {

         best_score = x;

         if (x > alpha) {

            /* this move caused a cutoff, so increase the history
               value so it gets ordered high next time we can
               search it */
            if (x >= beta) {
               addkiller(gen_dat[i].m);
               his_piece = piece[gen_dat[i].m.b.from];
               history[side][his_piece][gen_dat[i].m.b.to] += depth;
               return beta;
            }
            alpha = x;

            /* update the PV */
            pv[ply][ply] = gen_dat[i].m;
            for (j = ply + 1; j < pv_length[ply + 1]; ++j)
               pv[ply][j] = pv[ply + 1][j];
            pv_length[ply] = pv_length[ply + 1];
         }
      }
   }

   /* no legal moves? then we're in checkmate or stalemate */
   if (!f) {
      if (c)
         return -10000 + ply;
      else
         return 0;
   }

   /* fifty move draw rule */
   if (fifty >= 100)
      return 0;

   return best_score;
}



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.