#include #include #include #include #include #include #define DICT "/usr/local/dict/words" #define EDICT "/crp/dict/web2" #define MAXERR 7 #define MINSCORE 0 #define MINLEN 7 char *dictfile; int alive,lost; FILE *dict; long int dictlen; float errors=0, words=0; int setup(void); int startnew(void); int stateout(void); int getguess(void); int wordout(void); int youwon(void); int fatal(char *s); double frand(void); int getword(void); int pscore(void); int main(int argc, char **argv) { if(argc==1) dictfile=DICT; else if(*argv[1]=='-') dictfile=EDICT; else dictfile=argv[1]; setup(); for(;;) { startnew(); while(alive>0) { stateout(); getguess(); } words=words+1; if(lost) wordout(); else youwon(); } } int setup(void) { int tvec[2]; struct stat statb; time((time_t*)tvec); srand(tvec[1]+tvec[2]); if((dict=fopen(dictfile,"r"))==NULL) fatal("no dictionary"); if(stat(dictfile,&statb)<0) fatal("can't stat"); dictlen=statb.st_size; } double frand(void) { return(rand()/32768.); } char word[26],alph[26],realword[26]; int startnew(void) { int i; long int pos; char buf[128]; for(i=0;i<26;i++) word[i]=alph[i]=realword[i]=0; pos=frand()*dictlen; fseek(dict,pos,0); fscanf(dict,"%s\n",buf); getword(); alive=MAXERR; lost=0; } int stateout(void) { int i; printf("guesses: "); for(i=0;i<26;i++) if(alph[i]!=0) putchar(alph[i]); printf(" word: %s ",word); printf("errors: %d/%d\n",MAXERR-alive,MAXERR); } int getguess(void) { char gbuf[128],c; int ok=0,i; loop: printf("guess: "); if(gets(gbuf)==NULL) { putchar('\n'); exit(0); } if((c=gbuf[0])<'a' || c>'z') { printf("lower case\n"); goto loop; } if(alph[c-'a']!=0) { printf("you guessed that\n"); goto loop; } else alph[c-'a']=c; for(i=0;realword[i]!=0;i++) if(realword[i]==c) { word[i]=c; ok=1; } if(ok==0) { alive--; errors=errors+1; if(alive<=0) lost=1; return; } for(i=0;word[i]!=0;i++) if(word[i]=='.') return; alive=0; lost=0; return; } int wordout(void) { errors=errors+2; printf("the answer was %s, you blew it\n",realword); } int youwon(void) { printf("you win, the word is %s\n",realword); } int fatal(char *s) { fprintf(stderr,"%s\n",s); exit(1); } int getword(void) { char wbuf[128],c; int i,j; loop: if(fscanf(dict,"%s\n",wbuf)==EOF) { fseek(dict,0L,0); goto loop; } if((c=wbuf[0])>'z' || c<'a') goto loop; for(i=j=0;wbuf[j]!=0;i++,j++) { if(wbuf[j]=='-') j++; wbuf[i]=wbuf[j]; } wbuf[i]=0; if(i'z') goto loop; pscore(); strcpy(realword,wbuf); for(j=0;j