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