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