?? hangman.c
字號:
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#define DICT "/usr/dict/words"#define EDICT "/crp/dict/web2"#define MAXERR 7#define MINSCORE 0#define MINLEN 7char *dictfile;int alive,lost;FILE *dict;long int dictlen;float errors=0, words=0;main(argc,argv) 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(); }}setup(){ int tvec[2]; struct stat statb; time(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(){ return(rand()/32768.);}char word[26],alph[26],realword[26];startnew(){ 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;}stateout(){ 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);}getguess(){ 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;}wordout(){ errors=errors+2; printf("the answer was %s, you blew it\n",realword);}youwon(){ printf("you win, the word is %s\n",realword);}fatal(s) char *s;{ fprintf(stderr,"%s\n",s); exit(1);}getword(){ 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<MINLEN) goto loop; for(j=0;j<i;j++) if((c=wbuf[j])<'a' || c>'z') goto loop; pscore(); strcpy(realword,wbuf); for(j=0;j<i;word[j++]='.');}long int freq[]{ 42066, 9228, 24412, 14500, 55162, 6098, 11992, 12648, 48241, 639, 2944, 33351, 15545, 35618, 36211, 16033, 937, 36686, 34957, 37544, 17621, 5453, 3028, 1556, 12875, 1743};pscore(){ if(words!=0) printf("(%4.2f/%.0f) ",errors/words,words);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -