📄 backgammon.c
字号:
int *mover,*movee;{ int k; for(i = 0; i <= 24; i++){ count = 0; if(mover[i] == 0) continue; if((k=25-i-die1) > 0 && movee[k] >= 2) if(mover[0] > 0) break; else continue; if(k <= 0){ if(piececount(mover, 0, 18) != 0) break; if((i+die1) != 25 && piececount(mover,19,i-1) != 0) break; } mover[i]--; mover[i+die1]++; count = 1; for(j = 0; j <= 24; j++){ if(mover[j]==0) continue; if((k=25-j-die2) > 0 && movee[k] >= 2) if(mover[0] > 0) break; else continue; if(k <= 0){ if(piececount(mover,0,18) != 0) break; if((j+die2) != 25 && piececount(mover,19,j-1) != 0) break; } mover[j]--; mover[j+die2]++; count = 2; if(die1 != die2){ moverecord(mover); if(mover[0] > 0) break; else continue; } for(l = 0; l <= 24; l++){ if(mover[l] == 0) continue; if((k=25-l-die1) > 0 && movee[k] >= 2) if(mover[0] > 0) break; else continue; if(k <= 0){ if(piececount(mover, 0, 18) != 0) break; if((l+die2) != 25 && piececount(mover,19,l-1) != 0) break; } mover[l]--; mover[l+die1]++; count=3; for(m=0;m<=24;m++){ if(mover[m]==0) continue; if((k=25-m-die1) >= 0 && movee[k] >= 2) if(mover[0] > 0) break; else continue; if(k <= 0){ if(piececount(mover,0,18) != 0) break; if((m+die2) != 25 && piececount(mover,19,m-1) != 0) break; } count=4; moverecord(mover); if(mover[0] > 0) break; } if(count == 3) moverecord(mover); else{ mover[l]++; mover[l+die1]--; } if(mover[0] > 0) break; } if(count == 2) moverecord(mover); else{ mover[j]++; mover[j+die1]--; } if(mover[0] > 0) break; } if(count == 1) moverecord(mover); else{ mover[i]++; mover[i+die1]--; } if(mover[0] > 0) break; }}moverecord(mover)int *mover;{ int t; if(imoves < MAXIMOVES) { for(t = 0; t <= 3; t++) moves[imoves].pos[t] = NIL; switch(count) { case 4: moves[imoves].pos[3]=m; moves[imoves].mov[3]=die1; case 3: moves[imoves].pos[2]=l; moves[imoves].mov[2]=die1; case 2: moves[imoves].pos[1]=j; moves[imoves].mov[1]=die2; case 1: moves[imoves].pos[0]=i; moves[imoves].mov[0]=die1; imoves++; } } switch(count) { case 4: break; case 3: mover[l]++; mover[l+die1]--; break; case 2: mover[j]++; mover[j+die2]--; break; case 1: mover[i]++; mover[i+die1]--; }}strategy(player,playee)int *player,*playee;{ int k, n, nn, bestval, moveval, prob; n = 0; if(imoves == 0) return(NIL); goodmoves[0] = NIL; bestval = -32000; for(k = 0; k < imoves; k++){ if((moveval=eval(player,playee,k,&prob)) < bestval) continue; if(moveval > bestval){ bestval = moveval; n = 0; } if(n<MAXGMOV){ goodmoves[n]=k; probmoves[n++]=prob; } } if(level=='e' && n>1){ nn=n; n=0; prob=32000; for(k = 0; k < nn; k++){ if((moveval=probmoves[k]) > prob) continue; if(moveval<prob){ prob=moveval; n=0; } goodmoves[n]=goodmoves[k]; probmoves[n++]=probmoves[k]; } } return(goodmoves[(rand()>>4)%n]);}eval(player,playee,k,prob)int *player,*playee,k,*prob;{ int newtry[31], newother[31], *r, *q, *p, n, sum, first; int ii, lastwhite, lastbrown; *prob = sum = 0; r = player+25; p = newtry; q = newother; while(player<r){ *p++= *player++; *q++= *playee++; } q=newtry+31; for(p = newtry+25; p < q; p++) /* zero out spaces for hit pieces */ *p = 0; for(n = 0; n < 4; n++){ if(moves[k].pos[n] == NIL) break; newtry[moves[k].pos[n]]--; newtry[ii=moves[k].pos[n]+moves[k].mov[n]]++; if(ii<25 && newother[25-ii]==1){ newother[25-ii]=0; newother[0]++; if(ii<=15 && level=='e') /* hit if near other's home */ sum++; } } for(lastbrown = 0; newother[lastbrown] == 0; lastbrown++); ; for(lastwhite = 0; newtry[lastwhite] == 0; lastwhite++) ; lastwhite = 25-lastwhite; if(lastwhite<=6 && lastwhite<lastbrown) sum=1000; /* experts running game. */ /* first priority is to */ /* get all pieces into */ /* white's home */ if(lastwhite<lastbrown && level=='e' && lastwhite>6) { for(sum = 1000; lastwhite > 6; lastwhite--) sum = sum-lastwhite*newtry[25-lastwhite]; } for(first = 0; first < 25; first++) if(newother[first] != 0) /*find other's first piece*/ break; q = newtry+25; for(p = newtry+1; p < q;) /* blocked points are good */ if(*p++ > 1) sum++; if(first > 5) { /* only stress removing pieces if */ /* homeboard cannot be hit */ q = newtry+31; p=newtry+25; for(n = 6; p < q; n--) sum += *p++ * n; /*remove pieces, but just barely*/ } if(level != 'b'){ r = newtry+25-first; /*singles past this point can't be hit*/ for(p = newtry+7; p < r; ) if(*p++ == 1) /*singles are bad after 1st 6 points if they can be hit*/ sum--; q = newtry+3; for(p = newtry; p < q; ) /*bad to be on 1st three points*/ sum -= *p++; } for(n = 1; n <= 4; n++) *prob += n*getprob(newtry,newother,6*n-5,6*n); return(sum);}instructions(){ register fd, r; char buf[BUFSIZ]; if((fd = open(RULES, 0)) < 0) { fprintf(stderr, "back: cannot open %s\n", RULES); return; } while(r = read(fd, buf, BUFSIZ)) write(1, buf, r);}getprob(player,playee,start,finish)int *player,*playee,start,finish;{ /*returns the probability (times 102) that any pieces belonging to 'player' and lying between his points 'start' and 'finish' will be hit by a piece belonging to playee */ int k, n, sum; sum = 0; for(; start <= finish; start++){ if(player[start] == 1){ for(k = 1; k <= 12; k++){ if((n=25-start-k) < 0) break; if(playee[n] != 0) sum += probability[k]; } } } return(sum);}prtbrd(){ int k; static char undersc[]="______________________________________________________"; fprintf(stdout, "White's Home\n%s\r",undersc); for(k = 1; k <= 6; k++) fprintf(stdout, "%4d",k); fprintf(stdout, " "); for(k = 7; k <= 12; k++) fprintf(stdout, "%4d",k); putchar('\n'); numline(brown, white, 1, 6); fprintf(stdout, " "); numline(brown, white, 7, 12); putchar('\n'); colorline(brown, 'B', white, 'W', 1, 6); fprintf(stdout, " "); colorline(brown, 'B', white, 'W', 7, 12); putchar('\n'); if(white[0] != 0) fprintf(stdout, "%28dW\n",white[0]); else putchar('\n'); if(brown[0] != 0) fprintf(stdout, "%28dB\n", brown[0]); else putchar('\n'); colorline(white, 'W', brown, 'B', 1, 6); fprintf(stdout, " "); colorline(white, 'W', brown, 'B', 7, 12); fprintf(stdout, "\n%s\r",undersc); numline(white, brown, 1, 6); fprintf(stdout, " "); numline(white, brown, 7, 12); putchar('\n'); for(k = 24; k >= 19; k--) fprintf(stdout, "%4d",k); fprintf(stdout, " "); for(k = 18; k >= 13; k--) fprintf(stdout, "%4d",k); fprintf(stdout, "\nBrown's Home\n\n\n\n\n");}numline(upcol,downcol,start,fin)int *upcol,*downcol,start,fin;{ int k, n; for(k = start; k <= fin; k++){ if((n = upcol[k]) != 0 || (n = downcol[25-k]) != 0) fprintf(stdout, "%4d", n); else fprintf(stdout, " "); }}colorline(upcol,c1,downcol,c2,start,fin)int *upcol,*downcol,start,fin;char c1,c2;{ int k; char c; for(k = start; k <= fin; k++){ c = ' '; if(upcol[k] != 0) c = c1; if(downcol[25-k] != 0) c = c2; fprintf(stdout, " %c",c); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -