From af857c197b393612bf159ea798009c9b1bf5200a Mon Sep 17 00:00:00 2001 From: lukem Date: Fri, 10 Oct 1997 08:59:32 +0000 Subject: KNF & WARNSify, and only compile common_source once/* (compiles 25% faster) --- backgammon/backgammon/move.c | 541 ++++++++++++++++++++++--------------------- 1 file changed, 277 insertions(+), 264 deletions(-) (limited to 'backgammon/backgammon/move.c') diff --git a/backgammon/backgammon/move.c b/backgammon/backgammon/move.c index f96c57a1..f83ebf31 100644 --- a/backgammon/backgammon/move.c +++ b/backgammon/backgammon/move.c @@ -1,4 +1,4 @@ -/* $NetBSD: move.c,v 1.5 1995/04/29 00:44:05 mycroft Exp $ */ +/* $NetBSD: move.c,v 1.6 1997/10/10 08:59:37 lukem Exp $ */ /* * Copyright (c) 1980, 1993 @@ -33,297 +33,302 @@ * SUCH DAMAGE. */ +#include #ifndef lint #if 0 static char sccsid[] = "@(#)move.c 8.1 (Berkeley) 5/31/93"; #else -static char rcsid[] = "$NetBSD: move.c,v 1.5 1995/04/29 00:44:05 mycroft Exp $"; +__RCSID("$NetBSD: move.c,v 1.6 1997/10/10 08:59:37 lukem Exp $"); #endif #endif /* not lint */ #include "back.h" +#include "backlocal.h" #ifdef DEBUG -#include -FILE *trace; -static char tests[20]; +FILE *trace; +static char tests[20]; #endif -struct BOARD { /* structure of game position */ - int b_board[26]; /* board position */ - int b_in[2]; /* men in */ - int b_off[2]; /* men off */ - int b_st[4], b_fn[4]; /* moves */ +struct BOARD { /* structure of game position */ + int b_board[26]; /* board position */ + int b_in[2]; /* men in */ + int b_off[2]; /* men off */ + int b_st[4], b_fn[4]; /* moves */ - struct BOARD *b_next; /* forward queue pointer */ + struct BOARD *b_next; /* forward queue pointer */ }; struct BOARD *freeq = 0; struct BOARD *checkq = 0; -struct BOARD *bsave(); -struct BOARD *nextfree(); - - /* these variables are values for the - * candidate move */ -static int ch; /* chance of being hit */ -static int op; /* computer's open men */ -static int pt; /* comp's protected points */ -static int em; /* farthest man back */ -static int frc; /* chance to free comp's men */ -static int frp; /* chance to free pl's men */ - - /* these values are the values for the - * move chosen (so far) */ -static int chance; /* chance of being hit */ -static int openmen; /* computer's open men */ -static int points; /* comp's protected points */ -static int endman; /* farthest man back */ -static int barmen; /* men on bar */ -static int menin; /* men in inner table */ -static int menoff; /* men off board */ -static int oldfrc; /* chance to free comp's men */ -static int oldfrp; /* chance to free pl's men */ - -static int cp[5]; /* candidate start position */ -static int cg[5]; /* candidate finish position */ - -static int race; /* game reduced to a race */ - -move (okay) -int okay; /* zero if first move */ + + /* these variables are values for the candidate move */ +static int ch; /* chance of being hit */ +static int op; /* computer's open men */ +static int pt; /* comp's protected points */ +static int em; /* farthest man back */ +static int frc; /* chance to free comp's men */ +static int frp; /* chance to free pl's men */ + + /* these values are the values for the move chosen (so far) */ +static int chance; /* chance of being hit */ +static int openmen; /* computer's open men */ +static int points; /* comp's protected points */ +static int endman; /* farthest man back */ +static int barmen; /* men on bar */ +static int menin; /* men in inner table */ +static int menoff; /* men off board */ +static int oldfrc; /* chance to free comp's men */ +static int oldfrp; /* chance to free pl's men */ + +static int cp[5]; /* candidate start position */ +static int cg[5]; /* candidate finish position */ + +static int race; /* game reduced to a race */ + + +static int bcomp __P((struct BOARD *, struct BOARD *)); +static struct BOARD *bsave __P((void)); +static void binsert __P((struct BOARD *)); +static void boardcopy __P((struct BOARD *)); +static void makefree __P((struct BOARD *)); +static void mvcheck __P((struct BOARD *, struct BOARD *)); +static struct BOARD *nextfree __P((void)); + + +void +move(okay) + int okay; /* zero if first move */ { - register int i; /* index */ - register int l; /* last man */ - - if (okay) { - /* see if comp should double */ - if (gvalue < 64 && dlast != cturn && dblgood()) { - writel (*Colorptr); - dble(); /* double */ - /* return if declined */ + int i; /* index */ + int l; /* last man */ + + l = 0; + if (okay) { + /* see if comp should double */ + if (gvalue < 64 && dlast != cturn && dblgood()) { + writel(*Colorptr); + dble(); /* double */ + /* return if declined */ if (cturn != 1 && cturn != -1) return; } roll(); } - race = 0; - for (i = 0; i < 26; i++) { + for (i = 0; i < 26; i++) { if (board[i] < 0) l = i; } - for (i = 0; i < l; i++) { + for (i = 0; i < l; i++) { if (board[i] > 0) break; } if (i == l) race = 1; - /* print roll */ + /* print roll */ if (tflag) - curmove (cturn == -1? 18: 19,0); - writel (*Colorptr); - writel (" rolls "); - writec (D0+'0'); - writec (' '); - writec (D1+'0'); - /* make tty interruptable - * while thinking */ + curmove(cturn == -1 ? 18 : 19, 0); + writel(*Colorptr); + writel(" rolls "); + writec(D0 + '0'); + writec(' '); + writec(D1 + '0'); + /* make tty interruptable while thinking */ if (tflag) cline(); - fixtty (&noech); + fixtty(&noech); - /* find out how many moves */ + /* find out how many moves */ mvlim = movallow(); - if (mvlim == 0) { - writel (" but cannot use it.\n"); + if (mvlim == 0) { + writel(" but cannot use it.\n"); nexturn(); - fixtty (&raw); + fixtty(&raw); return; } - - /* initialize */ + /* initialize */ for (i = 0; i < 4; i++) cp[i] = cg[i] = 0; - /* strategize */ - trymove (0,0); + /* strategize */ + trymove(0, 0); pickmove(); - /* print move */ - writel (" and moves "); - for (i = 0; i < mvlim; i++) { + /* print move */ + writel(" and moves "); + for (i = 0; i < mvlim; i++) { if (i > 0) - writec (','); - wrint (p[i] = cp[i]); - writec ('-'); - wrint (g[i] = cg[i]); - makmove (i); + writec(','); + wrint(p[i] = cp[i]); + writec('-'); + wrint(g[i] = cg[i]); + makmove(i); } - writec ('.'); + writec('.'); - /* print blots hit */ + /* print blots hit */ if (tflag) - curmove (20,0); + curmove(20, 0); else - writec ('\n'); + writec('\n'); for (i = 0; i < mvlim; i++) if (h[i]) wrhit(g[i]); - /* get ready for next move */ + /* get ready for next move */ nexturn(); - if (!okay) { + if (!okay) { buflush(); - sleep (3); + sleep(3); } - fixtty (&raw); /* no more tty interrupt */ + fixtty(&raw); /* no more tty interrupt */ } - -trymove (mvnum,swapped) -register int mvnum; /* number of move (rel zero) */ -int swapped; /* see if swapped also tested */ +void +trymove(mvnum, swapped) + int mvnum; /* number of move (rel zero) */ + int swapped; /* see if swapped also tested */ { - register int pos; /* position on board */ - register int rval; /* value of roll */ + int pos; /* position on board */ + int rval; /* value of roll */ - /* if recursed through all dice - * values, compare move */ - if (mvnum == mvlim) { - binsert (bsave()); + /* if recursed through all dice values, compare move */ + if (mvnum == mvlim) { + binsert(bsave()); return; } - - /* make sure dice in always - * same order */ + /* make sure dice in always same order */ if (d0 == swapped) swap; - /* choose value for this move */ + /* choose value for this move */ rval = dice[mvnum != 0]; - /* find all legitimate moves */ - for (pos = bar; pos != home; pos += cturn) { - /* fix order of dice */ + /* find all legitimate moves */ + for (pos = bar; pos != home; pos += cturn) { + /* fix order of dice */ if (d0 == swapped) swap; - /* break if stuck on bar */ + /* break if stuck on bar */ if (board[bar] != 0 && pos != bar) break; - /* on to next if not occupied */ - if (board[pos]*cturn <= 0) + /* on to next if not occupied */ + if (board[pos] * cturn <= 0) continue; - /* set up arrays for move */ + /* set up arrays for move */ p[mvnum] = pos; - g[mvnum] = pos+rval*cturn; - if (g[mvnum]*cturn >= home) { + g[mvnum] = pos + rval * cturn; + if (g[mvnum] * cturn >= home) { if (*offptr < 0) break; g[mvnum] = home; } - /* try to move */ - if (makmove (mvnum)) + /* try to move */ + if (makmove(mvnum)) continue; else - trymove (mvnum+1,2); - /* undo move to try another */ - backone (mvnum); + trymove(mvnum + 1, 2); + /* undo move to try another */ + backone(mvnum); } - /* swap dice and try again */ + /* swap dice and try again */ if ((!swapped) && D0 != D1) - trymove (0,1); + trymove(0, 1); } - -struct BOARD * -bsave () { - register int i; /* index */ - struct BOARD *now; /* current position */ - now = nextfree (); /* get free BOARD */ +static struct BOARD * +bsave() +{ + int i; /* index */ + struct BOARD *now; /* current position */ + + now = nextfree(); /* get free BOARD */ - /* store position */ + /* store position */ for (i = 0; i < 26; i++) now->b_board[i] = board[i]; now->b_in[0] = in[0]; now->b_in[1] = in[1]; now->b_off[0] = off[0]; now->b_off[1] = off[1]; - for (i = 0; i < mvlim; i++) { + for (i = 0; i < mvlim; i++) { now->b_st[i] = p[i]; now->b_fn[i] = g[i]; } return (now); } - -binsert (new) -struct BOARD *new; /* item to insert */ + +static void +binsert(new) + struct BOARD *new; /* item to insert */ { - register struct BOARD *p = checkq; /* queue pointer */ - register int result; /* comparison result */ + struct BOARD *p = checkq; /* queue pointer */ + int result; /* comparison result */ - if (p == 0) { /* check if queue empty */ + if (p == 0) { /* check if queue empty */ checkq = p = new; p->b_next = 0; return; } - - result = bcomp (new,p); /* compare to first element */ - if (result < 0) { /* insert in front */ + result = bcomp(new, p); /* compare to first element */ + if (result < 0) { /* insert in front */ new->b_next = p; checkq = new; return; } - if (result == 0) { /* duplicate entry */ - mvcheck (p,new); - makefree (new); + if (result == 0) { /* duplicate entry */ + mvcheck(p, new); + makefree(new); return; } - - while (p->b_next != 0) { /* traverse queue */ - result = bcomp (new,p->b_next); - if (result < 0) { /* found place */ + while (p->b_next != 0) {/* traverse queue */ + result = bcomp(new, p->b_next); + if (result < 0) { /* found place */ new->b_next = p->b_next; p->b_next = new; return; } - if (result == 0) { /* duplicate entry */ - mvcheck (p->b_next,new); - makefree (new); + if (result == 0) { /* duplicate entry */ + mvcheck(p->b_next, new); + makefree(new); return; } p = p->b_next; } - /* place at end of queue */ + /* place at end of queue */ p->b_next = new; new->b_next = 0; } - -bcomp (a,b) -struct BOARD *a; -struct BOARD *b; + +static int +bcomp(a, b) + struct BOARD *a; + struct BOARD *b; { - register int *aloc = a->b_board; /* pointer to board a */ - register int *bloc = b->b_board; /* pointer to board b */ - register int i; /* index */ - int result; /* comparison result */ + int *aloc = a->b_board; /* pointer to board a */ + int *bloc = b->b_board; /* pointer to board b */ + int i; /* index */ + int result; /* comparison result */ - for (i = 0; i < 26; i++) { /* compare boards */ - result = cturn*(aloc[i]-bloc[i]); + for (i = 0; i < 26; i++) { /* compare boards */ + result = cturn * (aloc[i] - bloc[i]); if (result) - return (result); /* found inequality */ + return (result); /* found inequality */ } - return (0); /* same position */ + return (0); /* same position */ } - -mvcheck (incumbent,candidate) -register struct BOARD *incumbent; -register struct BOARD *candidate; + +static void +mvcheck(incumbent, candidate) + struct BOARD *incumbent; + struct BOARD *candidate; { - register int i; - register int result; + int i; + int result; - for (i = 0; i < mvlim; i++) { - result = cturn*(candidate->b_st[i]-incumbent->b_st[i]); + for (i = 0; i < mvlim; i++) { + result = cturn * (candidate->b_st[i] - incumbent->b_st[i]); if (result > 0) return; if (result < 0) @@ -331,28 +336,30 @@ register struct BOARD *candidate; } if (i == mvlim) return; - for (i = 0; i < mvlim; i++) { + for (i = 0; i < mvlim; i++) { incumbent->b_st[i] = candidate->b_st[i]; incumbent->b_fn[i] = candidate->b_fn[i]; } } - -makefree (dead) -struct BOARD *dead; /* dead position */ + +void +makefree(dead) + struct BOARD *dead; /* dead position */ { - dead->b_next = freeq; /* add to freeq */ + dead->b_next = freeq; /* add to freeq */ freeq = dead; } -struct BOARD * -nextfree () { - struct BOARD *new; +static struct BOARD * +nextfree() +{ + struct BOARD *new; - if (freeq == 0) { - new = (struct BOARD *)calloc (1,sizeof (struct BOARD)); - if (new == 0) { - writel ("\nOut of memory\n"); - getout(); + if (freeq == 0) { + new = (struct BOARD *) calloc(1, sizeof(struct BOARD)); + if (new == 0) { + writel("\nOut of memory\n"); + getout(0); } } else { new = freeq; @@ -362,100 +369,104 @@ nextfree () { new->b_next = 0; return (new); } - -pickmove () { - /* current game position */ - register struct BOARD *now = bsave(); - register struct BOARD *next; /* next move */ + +void +pickmove() +{ + /* current game position */ + struct BOARD *now = bsave(); + struct BOARD *next; /* next move */ #ifdef DEBUG if (trace == NULL) - trace = fopen ("bgtrace","w"); - fprintf (trace,"\nRoll: %d %d%s\n",D0,D1,race? " (race)": ""); - fflush (trace); + trace = fopen("bgtrace", "w"); + fprintf(trace, "\nRoll: %d %d%s\n", D0, D1, race ? " (race)" : ""); + fflush(trace); #endif - do { /* compare moves */ - boardcopy (checkq); + do { /* compare moves */ + boardcopy(checkq); next = checkq->b_next; - makefree (checkq); + makefree(checkq); checkq = next; movcmp(); } while (checkq != 0); - boardcopy (now); + boardcopy(now); } - -boardcopy (s) -register struct BOARD *s; /* game situation */ + +static void +boardcopy(s) + struct BOARD *s; /* game situation */ { - register int i; /* index */ + int i; /* index */ for (i = 0; i < 26; i++) board[i] = s->b_board[i]; - for (i = 0; i < 2; i++) { + for (i = 0; i < 2; i++) { in[i] = s->b_in[i]; off[i] = s->b_off[i]; } - for (i = 0; i < mvlim; i++) { + for (i = 0; i < mvlim; i++) { p[i] = s->b_st[i]; g[i] = s->b_fn[i]; } } - -movcmp () { - register int i; - register int c; + +void +movcmp() +{ + int i; #ifdef DEBUG if (trace == NULL) - trace = fopen ("bgtrace","w"); + trace = fopen("bgtrace", "w"); #endif - odds (0,0,0); - if (!race) { + odds(0, 0, 0); + if (!race) { ch = op = pt = 0; - for (i = 1; i < 25; i++) { + for (i = 1; i < 25; i++) { if (board[i] == cturn) - ch = canhit (i,1); - op += abs (bar-i); + ch = canhit(i, 1); + op += abs(bar - i); } - for (i = bar+cturn; i != home; i += cturn) - if (board[i]*cturn > 1) - pt += abs(bar-i); - frc = freemen (bar)+trapped (bar,cturn); - frp = freemen (home)+trapped (home,-cturn); + for (i = bar + cturn; i != home; i += cturn) + if (board[i] * cturn > 1) + pt += abs(bar - i); + frc = freemen(bar) + trapped(bar, cturn); + frp = freemen(home) + trapped(home, -cturn); } for (em = bar; em != home; em += cturn) - if (board[em]*cturn > 0) + if (board[em] * cturn > 0) break; - em = abs(home-em); + em = abs(home - em); #ifdef DEBUG - fputs ("Board: ",trace); + fputs("Board: ", trace); for (i = 0; i < 26; i++) - fprintf (trace, " %d",board[i]); + fprintf(trace, " %d", board[i]); if (race) - fprintf (trace,"\n\tem = %d\n",em); + fprintf(trace, "\n\tem = %d\n", em); else - fprintf (trace, - "\n\tch = %d, pt = %d, em = %d, frc = %d, frp = %d\n", - ch,pt,em,frc,frp); - fputs ("\tMove: ",trace); + fprintf(trace, + "\n\tch = %d, pt = %d, em = %d, frc = %d, frp = %d\n", + ch, pt, em, frc, frp); + fputs("\tMove: ", trace); for (i = 0; i < mvlim; i++) - fprintf (trace," %d-%d",p[i],g[i]); - fputs ("\n",trace); - fflush (trace); - strcpy (tests,""); + fprintf(trace, " %d-%d", p[i], g[i]); + fputs("\n", trace); + fflush(trace); + strcpy(tests, ""); #endif - if ((cp[0] == 0 && cg[0] == 0) || movegood()) { + if ((cp[0] == 0 && cg[0] == 0) || movegood()) { #ifdef DEBUG - fprintf (trace,"\t[%s] ... wins.\n",tests); - fflush (trace); + fprintf(trace, "\t[%s] ... wins.\n", tests); + fflush(trace); #endif - for (i = 0; i < mvlim; i++) { + for (i = 0; i < mvlim; i++) { cp[i] = p[i]; cg[i] = g[i]; } - if (!race) { + if (!race) { chance = ch; openmen = op; points = pt; @@ -468,90 +479,92 @@ movcmp () { menoff = *offptr; } #ifdef DEBUG - else { - fprintf (trace,"\t[%s] ... loses.\n",tests); - fflush (trace); + else { + fprintf(trace, "\t[%s] ... loses.\n", tests); + fflush(trace); } #endif } - -movegood () { - register int n; + +int +movegood() +{ + int n; if (*offptr == 15) return (1); if (menoff == 15) return (0); - if (race) { + if (race) { #ifdef DEBUG - strcat (tests,"o"); + strcat(tests, "o"); #endif - if (*offptr-menoff) + if (*offptr - menoff) return (*offptr > menoff); #ifdef DEBUG - strcat (tests,"e"); + strcat(tests, "e"); #endif - if (endman-em) + if (endman - em) return (endman > em); #ifdef DEBUG - strcat (tests,"i"); + strcat(tests, "i"); #endif if (menin == 15) return (0); if (*inptr == 15) return (1); #ifdef DEBUG - strcat (tests,"i"); + strcat(tests, "i"); #endif - if (*inptr-menin) + if (*inptr - menin) return (*inptr > menin); return (rnum(2)); - } else { - n = barmen-abs(board[home]); + } else { + n = barmen - abs(board[home]); #ifdef DEBUG - strcat (tests,"c"); + strcat(tests, "c"); #endif - if (abs(chance-ch)+25*n > rnum(150)) - return (n? (n < 0): (ch < chance)); + if (abs(chance - ch) + 25 * n > rnum(150)) + return (n ? (n < 0) : (ch < chance)); #ifdef DEBUG - strcat (tests,"o"); + strcat(tests, "o"); #endif - if (*offptr-menoff) + if (*offptr - menoff) return (*offptr > menoff); #ifdef DEBUG - strcat (tests,"o"); + strcat(tests, "o"); #endif - if (abs(openmen-op) > 7+rnum(12)) + if (abs(openmen - op) > 7 + rnum(12)) return (openmen > op); #ifdef DEBUG - strcat (tests,"b"); + strcat(tests, "b"); #endif if (n) return (n < 0); #ifdef DEBUG - strcat (tests,"e"); + strcat(tests, "e"); #endif - if (abs(endman-em) > rnum(2)) + if (abs(endman - em) > rnum(2)) return (endman > em); #ifdef DEBUG - strcat (tests,"f"); + strcat(tests, "f"); #endif - if (abs(frc-oldfrc) > rnum(2)) + if (abs(frc - oldfrc) > rnum(2)) return (frc < oldfrc); #ifdef DEBUG - strcat (tests,"p"); + strcat(tests, "p"); #endif - if (abs(n = pt-points) > rnum(4)) + if (abs(n = pt - points) > rnum(4)) return (n > 0); #ifdef DEBUG - strcat (tests,"i"); + strcat(tests, "i"); #endif - if (*inptr-menin) + if (*inptr - menin) return (*inptr > menin); #ifdef DEBUG - strcat (tests,"f"); + strcat(tests, "f"); #endif - if (abs(frp-oldfrp) > rnum(2)) + if (abs(frp - oldfrp) > rnum(2)) return (frp > oldfrp); return (rnum(2)); } -- cgit v1.2.3-56-ge451