/* * This file was produced by CTANGLE 3.x, * from CWEB source in w.race3 */ #include #include #include #define ONE (1<<25) #define TO_REAL(x)((int)(x*ONE+.5)) #define TO_DOUBLE(x)(((double)x)/ONE) #define hash_size 100003 #define compute_hash(x)((x.w1*3121+x.w2*479)%hash_size) #define HASH_STATS /*1:*/ #line 25 "w.race3" #ifdef RISC_OS #include "load+save.h" #endif/*3:*/ #line 61 "w.race3" typedef int real;/*:3*//*4:*/ #line 72 "w.race3" typedef int board;/*:4*//*5:*/ #line 100 "w.race3" typedef unsigned int word; typedef struct{ word w1,w2; real equity0; real equity1; real equity2; }hash_entry;/*:5*//*6:*/ #line 113 "w.race3" hash_entry*hash_table;/*:6*//*11:*/ #line 187 "w.race3" #ifdef HASH_STATS int h_lookups=0; int h_hits=0; int h_misses=0; int h_collisions=0; #endif/*:11*//*19:*/ #line 344 "w.race3" int first_call=1; real doubled_equity,undoubled_equity0,undoubled_equity1;/*:19*//*36:*/ #line 586 "w.race3" hash_entry move[126]; int move_n=0;/*:36*//*7:*/ #line 122 "w.race3" void pos_to_64bit(board p1,board p2,hash_entry*h){ int i,j=0,t; word*wp; h->w1=0;h->w2=0;/*8:*/ #line 134 "w.race3" wp= &(h->w1); t=p1; for(i=0;t;++i){ j+=t&15; if(j>=32){j-=32;wp= &(h->w2);} *wp|=1<>=4; }/*:8*//*9:*/ #line 153 "w.race3" wp= &(h->w2); j=54-32; t=p2; for(i=0;i<=6;++i){ j-=t&15; if(j<0){j+=32;wp= &(h->w1);} *wp|=1<>=4; }/*:9*/ #line 128 "w.race3" }/*:7*//*14:*/ #line 234 "w.race3" int analyze(board p1,board p2){ board pp=p1; int i,j,k,l; int d1,d2; int n; hash_entry h; int hash; real avg0=0,avg1=0,avg2=0; real e0,e1,e2; int fc=first_call;first_call=0; pos_to_64bit(p1,p2,&h);hash=compute_hash(h); if(!fc){/*15:*/ #line 261 "w.race3" #ifdef HASH_STATS ++h_lookups; #endif if(hash_table[hash].w1==h.w1&&hash_table[hash].w2==h.w2){ #ifdef HASH_STATS ++h_hits; #endif return hash; } #ifdef HASH_STATS else++h_misses; #endif/*:15*/ #line 247 "w.race3" }/*16:*/ #line 282 "w.race3" for(d1=6;d1;--d1){ for(d2=d1-1;d2;--d2){/*20:*/ #line 363 "w.race3" #undef BREAK #define BREAK break2 e0= -2*ONE;e1= -2*ONE;e2= -2*ONE; for(k=0;k<2;++k){ for(i=5;i>=0;--i){/*23:*/ #line 433 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:23*/ #line 369 "w.race3" for(j=i-k;j>=0;--j){ if(j==i-d1&&d1>d2)continue;/*25:*/ #line 460 "w.race3" #undef DIE #undef POINT #define DIE d2 #define POINT j/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:25*//*22:*/ #line 418 "w.race3" n=analyze(p2,pp); if(-hash_table[n].equity0>e0)e0= -hash_table[n].equity0; if(-hash_table[n].equity2>e1)e1= -hash_table[n].equity2; if(-hash_table[n].equity1>e2)e2= -hash_table[n].equity1;/*:22*//*30:*/ #line 511 "w.race3" #undef DIE #undef POINT #define DIE d2 #define POINT j/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:30*/ #line 374 "w.race3" }/*29:*/ #line 501 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:29*/ #line 376 "w.race3" } d1+=d2;d2=d1-d2;d1-=d2; } BREAK: if(d1=0;--i){/*23:*/ #line 433 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:23*/ #line 394 "w.race3" for(j=i;j>=0;--j){/*26:*/ #line 470 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT j/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:26*/ #line 396 "w.race3" for(k=j;k>=0;--k){/*27:*/ #line 480 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT k/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:27*/ #line 398 "w.race3" for(l=k;l>=0;--l){/*28:*/ #line 490 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT l/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:28*//*22:*/ #line 418 "w.race3" n=analyze(p2,pp); if(-hash_table[n].equity0>e0)e0= -hash_table[n].equity0; if(-hash_table[n].equity2>e1)e1= -hash_table[n].equity2; if(-hash_table[n].equity1>e2)e2= -hash_table[n].equity1;/*:22*//*33:*/ #line 541 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT l/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:33*/ #line 402 "w.race3" }/*32:*/ #line 531 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT k/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:32*/ #line 404 "w.race3" }/*31:*/ #line 521 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT j/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:31*/ #line 406 "w.race3" }/*29:*/ #line 501 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:29*/ #line 408 "w.race3" } BREAK: avg0+=e0;avg1+=e1;avg2+=e2; if(fc)printf("equities after %d%d are %lf, %lf, %lf\n",d1,d1, TO_DOUBLE(e0),TO_DOUBLE(e1),TO_DOUBLE(e2));/*:21*/ #line 290 "w.race3" } avg0/=36;avg1/=36;avg2/=36;/*:16*//*17:*/ #line 322 "w.race3" e2=2*avg2;if(e2>ONE)e2=ONE; h.equity0=(e2>=avg0)?e2:avg0; h.equity1=(e2>=avg1)?e2:avg1; h.equity2=avg2; #ifdef HASH_STATS if(hash_table[hash].w1)++h_collisions; #endif hash_table[hash]=h;/*:17*/ #line 251 "w.race3" if(fc){/*18:*/ #line 335 "w.race3" undoubled_equity0=avg0; undoubled_equity1=avg1; doubled_equity=2*avg2;/*:18*/ #line 253 "w.race3" } return hash; }/*:14*//*37:*/ #line 597 "w.race3" #undef BREAK #define BREAK break_roll void analyze_roll(board p1,board p2,int d1,int d2){ int i=0,j=0,k=0,l=0; board pp=p1; real e0=0,e1,e2; int h; first_call=0; if(d1==d2){ for(i=5;i>=0;--i){/*23:*/ #line 433 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:23*/ #line 608 "w.race3" for(j=i;j>=0;--j){/*26:*/ #line 470 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT j/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:26*/ #line 610 "w.race3" for(k=j;k>=0;--k){/*27:*/ #line 480 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT k/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:27*/ #line 612 "w.race3" for(l=k;l>=0;--l){/*28:*/ #line 490 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT l/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:28*//*38:*/ #line 645 "w.race3" if(e0){ move[move_n].w1=i+(j<<8)+(k<<16)+(l<<24); move[move_n].equity0= -ONE;move[move_n].equity1= -ONE;move[move_n].equity2= -ONE; ++move_n; e0=0; }else{ h=analyze(p2,pp); move[move_n]=hash_table[h]; move[move_n++].w1=i+(j<<8)+(k<<16)+(l<<24); }/*:38*//*33:*/ #line 541 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT l/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:33*/ #line 616 "w.race3" }/*32:*/ #line 531 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT k/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:32*/ #line 618 "w.race3" }/*31:*/ #line 521 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT j/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:31*/ #line 620 "w.race3" }/*29:*/ #line 501 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:29*/ #line 622 "w.race3" } }else{ for(k=0;k<2;++k){ for(i=5;i>=0;--i){/*23:*/ #line 433 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:23*/ #line 627 "w.race3" for(j=i-k;j>=0;--j){ if(j==i-d1&&d1>d2)continue;/*25:*/ #line 460 "w.race3" #undef DIE #undef POINT #define DIE d2 #define POINT j/*24:*/ #line 443 "w.race3" if((pp>>(POINT<<2))&15){ if(pp<=15<<(POINT<<2)){ pp-=1<<((POINT<<2)); if(POINT>=DIE)pp+=1<<((POINT-DIE)<<2); }else{ if(POINT>=DIE){pp+=1<<((POINT-DIE)<<2);pp-=1<<(POINT<<2);} else if(POINT==DIE-1){pp-=1<<(POINT<<2);} else continue; } }else continue; if(!pp){e0=ONE;e1=ONE;e2=ONE;pp=p1;goto BREAK;}/*:24*//*:25*/ #line 630 "w.race3" BREAK:/*38:*/ #line 645 "w.race3" if(e0){ move[move_n].w1=i+(j<<8)+(k<<16)+(l<<24); move[move_n].equity0= -ONE;move[move_n].equity1= -ONE;move[move_n].equity2= -ONE; ++move_n; e0=0; }else{ h=analyze(p2,pp); move[move_n]=hash_table[h]; move[move_n++].w1=i+(j<<8)+(k<<16)+(l<<24); }/*:38*//*30:*/ #line 511 "w.race3" #undef DIE #undef POINT #define DIE d2 #define POINT j/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:30*/ #line 633 "w.race3" }/*29:*/ #line 501 "w.race3" #undef DIE #undef POINT #define DIE d1 #define POINT i/*34:*/ #line 551 "w.race3" pp+=1<<(POINT<<2); if(POINT>=DIE)pp-=1<<((POINT-DIE)<<2);/*:34*//*:29*/ #line 635 "w.race3" } d1+=d2;d2=d1-d2;d1-=d2; } } }/*:37*//*49:*/ #line 872 "w.race3" char*move_to_string(int m,int d1,int d2){ static char s[18]; int i,j,k,l; i=m&255;j=(m>>8)&255;k=(m>>16)&255;l=(m>>24)&255; i++;j++;k++;l++; if(d1==d2) sprintf(s,"%d/%d %d/%d %d/%d %d/%d", i,(i-d1<0)?0:(i-d1),j,(j-d1<0)?0:(j-d1), k,(k-d1<0)?0:(k-d1),l,(l-d1<0)?0:(l-d1)); else{ if(k>1){l=d1;d1=d2;d2=l;} sprintf(s,"%d/%d %d/%d", i,(i-d1<0)?0:(i-d1),j,(j-d2<0)?0:(j-d2)); } return s; }/*:49*//*51:*/ #line 922 "w.race3" void error(char*s){ fprintf(stderr,"! %s.\n",s); exit(8); }/*:51*/ #line 33 "w.race3" int main(int argc,char*argv[]){/*40:*/ #line 700 "w.race3" board*player;int point;int men; board player1,player2; char*hash_in=0; char*hash_out=0; int d1=0,d2=0;/*:40*//*39:*/ #line 674 "w.race3" --argc;++argv; player= &player1;point=0;men=0; player1=0;player2=0; while(argc){ if(!strcmp(*argv,"-r")){/*41:*/ #line 710 "w.race3" --argc;++argv; if(argc<2)error("A roll needs 2 numbers"); d1=atoi(*argv);if(d1<=0||d1>6)error("Dice can show only 1,2,3,4,5,6"); --argc;++argv; d2=atoi(*argv);if(d2<=0||d2>6)error("Dice can show only 1,2,3,4,5,6");/*:41*/ #line 679 "w.race3" } else if(!strcmp(*argv,"-i")){/*42:*/ #line 720 "w.race3" --argc;++argv; if(!argc)error("-i requires a filename"); hash_in= *argv;/*:42*/ #line 681 "w.race3" } else if(!strcmp(*argv,"-o")){/*43:*/ #line 728 "w.race3" --argc;++argv; if(!argc)error("-o requires a filename"); hash_out= *argv;/*:43*/ #line 683 "w.race3" } else if(!strcmp(*argv,"-")){ if(player!= &player1)error("Backgammon only has two players"); player= &player2;point=0;men=0;} else{char*cp;int x; x=(int)strtol(*argv,&cp,10); if(*cp||x<0||x>15-men||point>=6)error("Illegal position"); *player+=x<<(point<<2);men+=x;++point; } --argc;++argv; } if(player!= &player2)error("Backgammon needs two players");/*:39*//*44:*/ #line 739 "w.race3" hash_table=(hash_entry*)malloc(hash_size*sizeof(hash_entry)); if(!hash_table)error("No room for hash table"); if(hash_in){ #ifdef RISC_OS int sz=file_size(hash_in); if(sz<0)/*13:*/ #line 206 "w.race3" memset(hash_table,0,hash_size*sizeof(hash_entry));/*:13*/ #line 745 "w.race3" else if(sz!=hash_size*sizeof(hash_entry))error("Bad hashfile"); else load_file(hash_in,hash_table); #else FILE*f;int x; f=fopen(hash_in,"rb"); if(f){ x=fread(hash_table,sizeof(hash_entry),hash_size,f); fclose(f); if(x>(i<<2))&15; p+=(i+1)*((player1>>(i<<2))&15); } printf("Player 1 : %2d men, %2d pips : ",t,p); for(i=0;i<=5;++i) printf("%d ",(player1>>(i<<2))&15); t=p=0;for(i=0;i<=5;++i){ t+=(player2>>(i<<2))&15; p+=(i+1)*((player2>>(i<<2))&15); } printf("\nPlayer 2 : %2d men, %2d pips : ",t,p); for(i=0;i<=5;++i) printf("%d ",(player2>>(i<<2))&15); printf("\n\n"); }/*:46*/ #line 769 "w.race3" if(d1){ analyze_roll(player1,player2,d1,d2);/*48:*/ #line 839 "w.race3" {int i; real e0= -2*ONE,e1= -2*ONE,e2= -2*ONE; real a0,a1,a2; int m0,m1,m2; printf("Results of analysis:\n\n"); if(d1==d2) printf("Move Centre Player1 Player2\n"); else printf("Move Centre Player1 Player2\n"); for(i=0;ie0){e0=a0;m0=move[i].w1;} if(a1>e1){e1=a1;m1=move[i].w1;} if(a2>e2){e2=a2;m2=move[i].w1;} } printf("\nBest moves:\n"); printf("Cube in centre: %s %lf\n",move_to_string(m0,d1,d2),TO_DOUBLE(e0)); printf("Cube with player 1: %s %lf\n",move_to_string(m1,d1,d2),TO_DOUBLE(e1)); printf("Cube with player 2: %s %lf\n",move_to_string(m2,d1,d2),TO_DOUBLE(e2)); }/*:48*/ #line 772 "w.race3" }else{ analyze(player1,player2);/*47:*/ #line 812 "w.race3" {double x; printf("\nResults of analysis:\n"); printf("0. Cube in centre.\n"); printf(" Equity (no double): %lf\n",TO_DOUBLE(undoubled_equity0)); printf(" Equity (double accepted): %lf\n",TO_DOUBLE(doubled_equity)); printf(" Equity (double declined): %lf\n",1.); printf("1. Cube with player 1.\n"); printf(" Equity (no double): %lf\n",TO_DOUBLE(undoubled_equity1)); printf(" Equity (double accepted): %lf\n",TO_DOUBLE(doubled_equity)); printf(" Equity (double declined): %lf\n",1.); printf("2. Cube with player 2. (Player 1 cannot double.)\n"); printf(" Equity: %lf\n\n",TO_DOUBLE(doubled_equity)/2); x=(doubled_equity>ONE?ONE:doubled_equity); if(x>undoubled_equity1) printf("Player 1 has a redouble"); else if(x>undoubled_equity0) printf("Player 1 has an initial double (but no redouble)"); if(x>undoubled_equity0) printf(", which player 2 should %s.\n",doubled_equity>ONE?"drop":"take"); else printf("Player 1 should not double, wherever the cube is.\n"); }/*:47*/ #line 775 "w.race3" } #ifdef HASH_STATS printf("\n** hash table: %d lookups %d hits %d misses (%d collisions)\n", h_lookups,h_hits,h_misses,h_collisions); #endif/*:45*//*50:*/ #line 901 "w.race3" if(hash_out){ #ifdef RISC_OS if(save_file(hash_out,hash_table,hash_size*sizeof(hash_entry),0xFFD)) error("Couldn't write hashfile"); #else FILE*f;int x; f=fopen(hash_out,"wb"); if(f){ x=fwrite(hash_table,sizeof(hash_entry),hash_size,f); fclose(f); if(x