1 /* 2 * Copyright (c) 1980, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)one.c 8.1 (Berkeley) 05/31/93"; 10 #endif /* not lint */ 11 12 #include "back.h" 13 14 makmove (i) 15 register int i; 16 17 { 18 register int n, d; 19 int max; 20 21 d = d0; 22 n = abs(g[i]-p[i]); 23 max = (*offptr < 0? 7: last()); 24 if (board[p[i]]*cturn <= 0) 25 return (checkd(d)+2); 26 if (g[i] != home && board[g[i]]*cturn < -1) 27 return (checkd(d)+3); 28 if (i || D0 == D1) { 29 if (n == max? D1 < n: D1 != n) 30 return (checkd(d)+1); 31 } else { 32 if (n == max? D0 < n && D1 < n: D0 != n && D1 != n) 33 return (checkd(d)+1); 34 if (n == max? D0 < n: D0 != n) { 35 if (d0) 36 return (checkd(d)+1); 37 swap; 38 } 39 } 40 if (g[i] == home && *offptr < 0) 41 return (checkd(d)+4); 42 h[i] = 0; 43 board[p[i]] -= cturn; 44 if (g[i] != home) { 45 if (board[g[i]] == -cturn) { 46 board[home] -= cturn; 47 board[g[i]] = 0; 48 h[i] = 1; 49 if (abs(bar-g[i]) < 7) { 50 (*inopp)--; 51 if (*offopp >= 0) 52 *offopp -= 15; 53 } 54 } 55 board[g[i]] += cturn; 56 if (abs(home-g[i]) < 7 && abs(home-p[i]) > 6) { 57 (*inptr)++; 58 if (*inptr+*offptr == 0) 59 *offptr += 15; 60 } 61 } else { 62 (*offptr)++; 63 (*inptr)--; 64 } 65 return (0); 66 } 67 68 moverr (i) 69 register int i; 70 71 { 72 register int j; 73 74 if (tflag) 75 curmove (20,0); 76 else 77 writec ('\n'); 78 writel ("Error: "); 79 for (j = 0; j <= i; j++) { 80 wrint (p[j]); 81 writec ('-'); 82 wrint (g[j]); 83 if (j < i) 84 writec (','); 85 } 86 writel ("... "); 87 movback (i); 88 } 89 90 91 checkd (d) 92 register int d; 93 94 { 95 if (d0 != d) 96 swap; 97 return (0); 98 } 99 100 last () { 101 register int i; 102 103 for (i = home-6*cturn; i != home; i += cturn) 104 if (board[i]*cturn > 0) 105 return (abs(home-i)); 106 } 107 108 movback (i) 109 register int i; 110 111 { 112 register int j; 113 114 for (j = i-1; j >= 0; j--) 115 backone(j); 116 } 117 118 backone (i) 119 register int i; 120 121 { 122 board[p[i]] += cturn; 123 if (g[i] != home) { 124 board[g[i]] -= cturn; 125 if (abs(g[i]-home) < 7 && abs(p[i]-home) > 6) { 126 (*inptr)--; 127 if (*inptr+*offptr < 15 && *offptr >= 0) 128 *offptr -= 15; 129 } 130 } else { 131 (*offptr)--; 132 (*inptr)++; 133 } 134 if (h[i]) { 135 board[home] += cturn; 136 board[g[i]] = -cturn; 137 if (abs(bar-g[i]) < 7) { 138 (*inopp)++; 139 if (*inopp+*offopp == 0) 140 *offopp += 15; 141 } 142 } 143 } 144