/******************/ /* 小倉百人一首 */ /******************/ #include #include #include #include #include void REDtxt(int*); // テキストファイルを読む void explode(char*,char*,int); // 項目を取り出す char kami[100][64]; // 上の句 char simo[100][64]; // 下の句 char yomi[100][64]; // 詠み人 int utaNo; // 歌番号 int utaNoB[10]; // 場の歌番号 void main( ) { char c[128]; int N,i,j; printf("\n##################\n"); printf("\n# 小倉百人一首 #\n"); printf("\n##################\n"); printf("\n 0を入力すると終了します\n\n"); fflush(stdout); srand(time(NULL)); // 乱数の準備 REDtxt(&N); // テキストファイルを読む if ( N==0 ) goto END; while ( 1 ) { //--10首選択-- for( i=0; i<10; i++ ) { utaNoB[i]=rand( )%100+1; // 歌番号計算 } //--読み札選択-- utaNo=utaNoB[rand( )%10]; // 読み札歌番号計算 // 下の句表示 printf("\n【下の句】"); fflush(stdout); for( i=0; i<10; i++ ) { j=utaNoB[i]-1; // 場の歌添え字 printf("\n%3d: %s",j+1,&simo[j][0]); fflush(stdout); } // 上の句表示 printf("\n\n\n【上の句】"); fflush(stdout); printf("\n %s\n",&kami[utaNo-1][0]); fflush(stdout); while( 1 ) { printf("\n歌番号: "); fflush(stdout); gets(c); // 歌番号入力 if ( strcmp(c,"0")==0 ) break; if ( atoi(c)==utaNo ) // 歌番号が一致 { Beep(660,100); Beep(523,200); // ミド break; } Beep(440,100); Sleep(50); Beep(440,300); // ドド printf("お手つきです\n\n"); fflush(stdout); continue; } printf("\n----------------------------------\n"); fflush(stdout); if ( strcmp(c,"0")==0 ) break; } END: ; } void REDtxt( /*--------------------------*/ /* テキストファイルを読む */ /*--------------------------*/ int *N) // 行数 { FILE *fp=NULL; char buf[512],*cp; int i; *N=0; memset(&kami[0][0],'\0',6400); // 上の句 memset(&simo[0][0],'\0',6400); // 下の句 memset(&yomi[0][0],'\0',6400); // 詠み人 fp=fopen("ogura100.txt","r"); // テキストファイル開く if ( fp==NULL ) goto END; for( i=0; i<100; i++ ) { cp=fgets(buf,500,fp); // テキストファイル読む if ( cp==NULL ) break; // EOF explode("\t",buf,i); // 項目を取り出す (*N)++; } END: if ( fp!=NULL ) fclose(fp); // テキストファイル閉じる } void explode( /*------------------------------------*/ /* テキストデータから項目を取り出す */ /*------------------------------------*/ char *kugiri, // 区切り文字 char *buf, // テキスト1行 int i) { char *cp0,*cp; // 文字列アドレス int len; len=strlen(buf); // 文字列長さ if ( len==0 ) goto END; if ( buf[len-1]=='\n' ) buf[len-1]='\0'; // 改行文字をnullに //--上の句-- cp0=buf; cp=strstr(cp0,kugiri); // 区切り文字検索 if ( cp==NULL ) goto END; len=cp-cp0; // 項目の文字数 memcpy(&kami[i][0],cp0,len); // 上の句 //--下の句-- cp0=cp+1; // 次の文字のアドレス cp=strstr(cp0,kugiri); // 区切り文字検索 if ( cp==NULL ) goto END; len=cp-cp0; // 項目の文字数 memcpy(&simo[i][0],cp0,len); // 下の句 //--詠み人-- cp0=cp+1; // 次の文字のアドレス strcpy(&yomi[i][0],cp0); // 詠み人 END: ; }