1 /* $NetBSD: one.c,v 1.4 1997/10/10 08:59:47 lukem 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 #include <sys/cdefs.h> 37 #ifndef lint 38 #if 0 39 static char sccsid[] = "@(#)one.c 8.1 (Berkeley) 5/31/93"; 40 #else 41 __RCSID("$NetBSD: one.c,v 1.4 1997/10/10 08:59:47 lukem Exp $"); 42 #endif 43 #endif /* not lint */ 44 45 #include "back.h" 46 47 int 48 makmove(i) 49 int i; 50 { 51 int n, d; 52 int max; 53 54 d = d0; 55 n = abs(g[i] - p[i]); 56 max = (*offptr < 0 ? 7 : last()); 57 if (board[p[i]] * cturn <= 0) 58 return (checkd(d) + 2); 59 if (g[i] != home && board[g[i]] * cturn < -1) 60 return (checkd(d) + 3); 61 if (i || D0 == D1) { 62 if (n == max ? D1 < n : D1 != n) 63 return (checkd(d) + 1); 64 } else { 65 if (n == max ? D0 < n && D1 < n : D0 != n && D1 != n) 66 return (checkd(d) + 1); 67 if (n == max ? D0 < n : D0 != n) { 68 if (d0) 69 return (checkd(d) + 1); 70 swap; 71 } 72 } 73 if (g[i] == home && *offptr < 0) 74 return (checkd(d) + 4); 75 h[i] = 0; 76 board[p[i]] -= cturn; 77 if (g[i] != home) { 78 if (board[g[i]] == -cturn) { 79 board[home] -= cturn; 80 board[g[i]] = 0; 81 h[i] = 1; 82 if (abs(bar - g[i]) < 7) { 83 (*inopp)--; 84 if (*offopp >= 0) 85 *offopp -= 15; 86 } 87 } 88 board[g[i]] += cturn; 89 if (abs(home - g[i]) < 7 && abs(home - p[i]) > 6) { 90 (*inptr)++; 91 if (*inptr + *offptr == 0) 92 *offptr += 15; 93 } 94 } else { 95 (*offptr)++; 96 (*inptr)--; 97 } 98 return (0); 99 } 100 101 void 102 moverr(i) 103 int i; 104 { 105 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 int 125 checkd(d) 126 int d; 127 { 128 if (d0 != d) 129 swap; 130 return (0); 131 } 132 133 int 134 last() 135 { 136 int i; 137 138 for (i = home - 6 * cturn; i != home; i += cturn) 139 if (board[i] * cturn > 0) 140 return (abs(home - i)); 141 return (-1); 142 } 143 144 void 145 movback(i) 146 int i; 147 { 148 int j; 149 150 for (j = i - 1; j >= 0; j--) 151 backone(j); 152 } 153 154 void 155 backone(i) 156 int i; 157 { 158 board[p[i]] += cturn; 159 if (g[i] != home) { 160 board[g[i]] -= cturn; 161 if (abs(g[i] - home) < 7 && abs(p[i] - home) > 6) { 162 (*inptr)--; 163 if (*inptr + *offptr < 15 && *offptr >= 0) 164 *offptr -= 15; 165 } 166 } else { 167 (*offptr)--; 168 (*inptr)++; 169 } 170 if (h[i]) { 171 board[home] += cturn; 172 board[g[i]] = -cturn; 173 if (abs(bar - g[i]) < 7) { 174 (*inopp)++; 175 if (*inopp + *offopp == 0) 176 *offopp += 15; 177 } 178 } 179 } 180