home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / backgammon / common_source / one.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-08  |  3.8 KB  |  170 lines

  1. /*
  2.  * Copyright (c) 1980 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. static char sccsid[] = "@(#)one.c    5.4 (Berkeley) 6/1/90";
  36. #endif /* not lint */
  37.  
  38. #include "back.h"
  39.  
  40. makmove (i)
  41. register int    i;
  42.  
  43. {
  44.     register int    n, d;
  45.     int        max;
  46.  
  47.     d = d0;
  48.     n = abs(g[i]-p[i]);
  49.     max = (*offptr < 0? 7: last());
  50.     if (board[p[i]]*cturn <= 0)
  51.         return (checkd(d)+2);
  52.     if (g[i] != home && board[g[i]]*cturn < -1)
  53.         return (checkd(d)+3);
  54.     if (i || D0 == D1)  {
  55.         if (n == max? D1 < n: D1 != n)
  56.             return (checkd(d)+1);
  57.     } else  {
  58.         if (n == max? D0 < n && D1 < n: D0 != n && D1 != n)
  59.             return (checkd(d)+1);
  60.         if (n == max? D0 < n: D0 != n)  {
  61.             if (d0)
  62.                 return (checkd(d)+1);
  63.             swap;
  64.         }
  65.     }
  66.     if (g[i] == home && *offptr < 0)
  67.         return (checkd(d)+4);
  68.     h[i] = 0;
  69.     board[p[i]] -= cturn;
  70.     if (g[i] != home)  {
  71.         if (board[g[i]] == -cturn)  {
  72.             board[home] -= cturn;
  73.             board[g[i]] = 0;
  74.             h[i] = 1;
  75.             if (abs(bar-g[i]) < 7)  {
  76.                 (*inopp)--;
  77.                 if (*offopp >= 0)
  78.                     *offopp -= 15;
  79.             }
  80.         }
  81.         board[g[i]] += cturn;
  82.         if (abs(home-g[i]) < 7 && abs(home-p[i]) > 6)  {
  83.             (*inptr)++;
  84.             if (*inptr+*offptr == 0)
  85.                 *offptr += 15;
  86.         }
  87.     } else {
  88.         (*offptr)++;
  89.         (*inptr)--;
  90.     }
  91.     return (0);
  92. }
  93.  
  94. moverr (i)
  95. register int    i;
  96.  
  97. {
  98.     register int    j;
  99.  
  100.     if (tflag)
  101.         curmove (20,0);
  102.     else
  103.         writec ('\n');
  104.     writel ("Error:  ");
  105.     for (j = 0; j <= i; j++)  {
  106.         wrint (p[j]);
  107.         writec ('-');
  108.         wrint (g[j]);
  109.         if (j < i)
  110.             writec (',');
  111.     }
  112.     writel ("... ");
  113.     movback (i);
  114. }
  115.  
  116.  
  117. checkd (d)
  118. register int    d;
  119.  
  120. {
  121.     if (d0 != d)
  122.         swap;
  123.     return (0);
  124. }
  125.  
  126. last ()  {
  127.     register int    i;
  128.  
  129.     for (i = home-6*cturn; i != home; i += cturn)
  130.         if (board[i]*cturn > 0)
  131.             return (abs(home-i));
  132. }
  133.  
  134. movback (i)
  135. register int    i;
  136.  
  137. {
  138.     register int    j;
  139.  
  140.     for (j = i-1; j >= 0; j--)
  141.         backone(j);
  142. }
  143.  
  144. backone (i)
  145. register int    i;
  146.  
  147. {
  148.     board[p[i]] += cturn;
  149.     if (g[i] != home)  {
  150.         board[g[i]] -= cturn;
  151.         if (abs(g[i]-home) < 7 && abs(p[i]-home) > 6)  {
  152.             (*inptr)--;
  153.             if (*inptr+*offptr < 15 && *offptr >= 0)
  154.                 *offptr -= 15;
  155.         }
  156.     } else  {
  157.         (*offptr)--;
  158.         (*inptr)++;
  159.     }
  160.     if (h[i])  {
  161.         board[home] += cturn;
  162.         board[g[i]] = -cturn;
  163.         if (abs(bar-g[i]) < 7)  {
  164.             (*inopp)++;
  165.             if (*inopp+*offopp == 0)
  166.                 *offopp += 15;
  167.         }
  168.     }
  169. }
  170.