< 1> < 2> < 3> < 4> < 5> < 6> < 7> < 8> < 9> < 10> < 11> < 12> < 13> < 14> < 15> < 16> < 17> < 18> < 19> < 20> < 21> < 22> < 23> < 24> < 25> < 26> < 27> < 28> < 29> < 30> < 31> < 32> < 33> < 34> < 35> < 36> < 37> < 38> < 39> < 40> < 41> < 42> < 43> < 44> < 45> < 46> < 47> < 48> < 49> < 50> < 51> < 52> < 53> < 54> < 55> < 56> < 57> < 58> < 59> < 60> < 61> < 62> < 63> < 64> < 65> < 66> < 67> < 68> < 69> < 70> < 71> < 72> < 73> < 74> < 75> < 76> < 77> < 78> < 79> < 80> < 81> < 82> < 83> < 84> < 85> < 86> < 87> < 88> < 89> < 90> < 91> < 92> < 93> < 94> < 95> < 96> < 97> < 98> < 99> <100> <101> <102> <103> <104> <105> <106> <107> <108> <109> <110> <111> <112> <113> <114> <115> <116> <117> <118> <119> <120> <121> <122> <123> <124> <125> <126> <127> <128> <129> <130> | #include <stdlib.h> #include <string.h> #include <time.h> int SJISMultiCheck(unsigned char c){ if(((c>=0x81)&&(c<=0x9f))||((c>=0xe0)&&(c<=0xfc)))return 1; else return 0; } int SelectQuestion(const char (*question)[2][64],size_t question_cnt,char *hint,size_t hint_cnt){ /******************************************** 乱数を使って問題を選択して表示する 戻り値:0以上:選択された問題のID -1:失敗 const char (*question)[2][64]:選択対象の問題セット。 size_t question_cnt:questionの要素数 char *hint:[出力]ヒント文字列を格納する領域 size_t hint_cnt:hintの要素数 ********************************************/ int i,sel_question; sel_question=rand()%question_cnt; if(hint_cnt<=strlen(question[sel_question][1]))return -1; hint[0]='\0'; puts(question[sel_question][0]); for(i=0;question[sel_question][1][i]!='\0';){ if(SJISMultiCheck(question[sel_question][1][i])){ strcat(hint,"*"); i+=2; } else{ strcat(hint,"*"); i++; } } return sel_question; } void HintUpdate(const char question[2][64],const char *player_ans,char *hint_str){ /*********************************************** ヒント文字列を入力された答えに合わせて更新する。 const char question[2][64]:選択されている問題 const char *player_ans:入力された答え char *hint_str:[入出力]更新するヒント文字列 ***********************************************/ int i,j,ans_len,player_len; const char *answer_str; answer_str=question[1]; ans_len=strlen(answer_str); player_len=strlen(player_ans); j=0; for(i=0;(i<ans_len)&&(i<player_len);){ while(j<i){ if(SJISMultiCheck(answer_str[j]))j+=2; else j++; } if(i!=j){ if(SJISMultiCheck(player_ans[i]))i+=2; else i++; } else{ if(SJISMultiCheck(player_ans[i])){//日本語文字の場合 if((player_ans[i]==answer_str[i])&& (player_ans[i+1]==answer_str[i+1])){ hint_str[i]=answer_str[i]; hint_str[i+1]=answer_str[i+1]; } i+=2; } else{//半角文字の場合 if(player_ans[i]==answer_str[i]){ hint_str[i]=answer_str[i]; } i++; } } } } int main(void){ //ソース上に直接書き込んだ問題 char question[10][2][64]={ {"「プログラム」を英語で書くと?","program"}, {"日本で一番高い山は?","富士山"}, {"3*5=","15"}, {"「library」をカタカナ読みすると?","ライブラリ"}, {"日本の都道府県の数は?","47"}, {"「檸檬」はなんて読む?","れもん"}, {"「万」の上の単位は?","億"}, {"「迎撃」はなんて読む?","げいげき"}, {"22+33*5=","187"}, {"「メモリ」を英語で書くと?","memory"} }; //選択された問題 int sel_question; //入力された答え char player_ans[80]=""; //ヒント文字列 char hint_str[80]=""; srand(time(NULL)); //機能「乱数を使って選択し表示します」 sel_question=SelectQuestion(question,10,hint_str,80); while(1){ //機能「ヒント文字列の表示」 printf("ヒント:%s\n",hint_str); //機能「その問題の答えをプレイヤーはキーボードから入力」 fgets(player_ans,79,stdin); if(player_ans[0]!='\0')player_ans[strlen(player_ans)-1]='\0'; //機能「ヒント文字列の更新」 HintUpdate(question[sel_question],player_ans,hint_str); //機能「成否を判定します」 if(!strcmp(player_ans,question[sel_question][1]))break; puts("違います。もう一度入力してください。"); } //機能「クリア表示して終了」 puts("正解です。Enterを押すと終了します。"); //終了待ち getchar(); return 0; } |
< 1> < 2> < 3> < 4> < 5> < 6> < 7> < 8> < 9> < 10> < 11> < 12> < 13> < 14> < 15> < 16> < 17> < 18> < 19> < 20> < 21> < 22> < 23> < 24> < 25> < 26> < 27> | /******************************************* ファイルから問題を最大10問読み込み、問題セットを作る 戻り値:読み込めた問題の数 char question[10][2][64]:[出力]読み込んだ問題セットを出力する対象 *******************************************/ FILE *fp;//ファイルハンドル用 int readid;//読み取り中の問題番号 int len; if((fp=fopen("086question.txt","r"))==NULL)return 0;//(1)「086question.txt」を読み取りモードで開く for(readid=0;readid<10;readid++){ if(fgets(question[readid][0],63,fp)==NULL)break;//(2)問題文を読み込む len=strlen(question[readid][0]); if((len>=1)&&(question[readid][0][len-1]=='\n'))question[readid][0][len-1]='\0';//(3)改行を削除 if(fgets(question[readid][1],63,fp)==NULL)break;//正解文を読み込む len=strlen(question[readid][1]); if((len>=1)&&(question[readid][1][len-1]=='\n'))question[readid][1][len-1]='\0'; } fclose(fp); return readid; } |
< 1> < 2> < 3> < 4> < 5> < 6> < 7> < 8> < 9> < 10> < 11> < 12> < 13> < 14> < 15> < 16> < 17> < 18> < 19> < 20> < 21> < 22> < 23> < 24> < 25> < 26> < 27> < 28> < 29> < 30> < 31> < 32> < 33> < 34> < 35> < 36> < 37> < 38> < 39> < 40> < 41> < 42> < 43> < 44> < 45> < 46> < 47> < 48> < 49> < 50> < 51> < 52> < 53> < 54> < 55> < 56> < 57> < 58> < 59> < 60> < 61> < 62> < 63> < 64> < 65> < 66> < 67> < 68> < 69> < 70> < 71> < 72> < 73> < 74> < 75> < 76> < 77> < 78> < 79> < 80> < 81> < 82> < 83> < 84> < 85> < 86> < 87> < 88> < 89> < 90> < 91> < 92> < 93> < 94> < 95> < 96> < 97> < 98> < 99> <100> <101> <102> <103> <104> <105> <106> <107> <108> <109> <110> <111> <112> <113> <114> <115> <116> <117> <118> <119> <120> <121> <122> <123> <124> <125> <126> <127> <128> <129> <130> <131> <132> <133> <134> <135> <136> <137> <138> <139> <140> <141> <142> <143> <144> <145> <146> <147> <148> <149> <150> <151> <152> <153> <154> <155> <156> <157> <158> | #include <stdlib.h> #include <string.h> #include <time.h> int SJISMultiCheck(unsigned char c){ if(((c>=0x81)&&(c<=0x9f))||((c>=0xe0)&&(c<=0xfc)))return 1; else return 0; } int SelectQuestion(const char (*question)[2][64],size_t question_cnt,char *hint,size_t hint_cnt){ /******************************************** 乱数を使って問題を選択して表示する 戻り値:0以上:選択された問題のID -1:失敗 const char (*question)[2][64]:選択対象の問題セット。 size_t question_cnt:questionの要素数 char *hint:[出力]ヒント文字列を格納する領域 size_t hint_cnt:hintの要素数 ********************************************/ int i,sel_question; sel_question=rand()%question_cnt; if(hint_cnt<=strlen(question[sel_question][1]))return -1; hint[0]='\0'; puts(question[sel_question][0]); for(i=0;question[sel_question][1][i]!='\0';){ if(SJISMultiCheck(question[sel_question][1][i])){ strcat(hint,"*"); i+=2; } else{ strcat(hint,"*"); i++; } } return sel_question; } void HintUpdate(const char question[2][64],const char *player_ans,char *hint_str){ /*********************************************** ヒント文字列を入力された答えに合わせて更新する。 const char question[2][64]:選択されている問題 const char *player_ans:入力された答え char *hint_str:[入出力]更新するヒント文字列 ***********************************************/ int i,j,ans_len,player_len; const char *answer_str; answer_str=question[1]; ans_len=strlen(answer_str); player_len=strlen(player_ans); j=0; for(i=0;(i<ans_len)&&(i<player_len);){ while(j<i){ if(SJISMultiCheck(answer_str[j]))j+=2; else j++; } if(i!=j){ if(SJISMultiCheck(player_ans[i]))i+=2; else i++; } else{ if(SJISMultiCheck(player_ans[i])){//日本語文字の場合 if((player_ans[i]==answer_str[i])&& (player_ans[i+1]==answer_str[i+1])){ hint_str[i]=answer_str[i]; hint_str[i+1]=answer_str[i+1]; } i+=2; } else{//半角文字の場合 if(player_ans[i]==answer_str[i]){ hint_str[i]=answer_str[i]; } i++; } } } } int LoadQuestion(char question[10][2][64]){ /******************************************* ファイルから問題を最大10問読み込み、問題セットを作る 戻り値:読み込めた問題の数 char question[10][2][64]:[出力]読み込んだ問題セットを出力する対象 *******************************************/ FILE *fp;//ファイルハンドル用 int readid;//読み取り中の問題番号 int len; if((fp=fopen("086question.txt","r"))==NULL)return 0;//(1)「086question.txt」を読み取りモードで開く for(readid=0;readid<10;readid++){ if(fgets(question[readid][0],63,fp)==NULL)break;//(2)問題文を読み込む len=strlen(question[readid][0]); if((len>=1)&&(question[readid][0][len-1]=='\n'))question[readid][0][len-1]='\0';//(3)改行を削除 if(fgets(question[readid][1],63,fp)==NULL)break;//正解文を読み込む len=strlen(question[readid][1]); if((len>=1)&&(question[readid][1][len-1]=='\n'))question[readid][1][len-1]='\0'; } fclose(fp); return readid; } int main(void){ //問題セット char question[10][2][64]; //選択された問題 int sel_question; //入力された答え char player_ans[80]=""; //ヒント文字列 char hint_str[80]=""; //読み込めた問題数 int question_cnt; //機能「問題をファイルから読み込んで問題セットを構築する」 question_cnt=LoadQuestion(question); if(question_cnt==0){ puts("問題を読み込めませんでした。"); getchar(); return 1;//続行できないのでここで終了する } printf("%d問の問題が利用できます。\n",question_cnt); srand(time(NULL)); //機能「乱数を使って選択し表示します」 sel_question=SelectQuestion(question,question_cnt,hint_str,80); while(1){ //機能「ヒント文字列の表示」 printf("ヒント:%s\n",hint_str); //機能「その問題の答えをプレイヤーはキーボードから入力」 fgets(player_ans,79,stdin); if(player_ans[0]!='\0')player_ans[strlen(player_ans)-1]='\0'; //機能「ヒント文字列の更新」 HintUpdate(question[sel_question],player_ans,hint_str); //機能「成否を判定します」 if(!strcmp(player_ans,question[sel_question][1]))break; puts("違います。もう一度入力してください。"); } //機能「クリア表示して終了」 puts("正解です。Enterを押すと終了します。"); //終了待ち getchar(); return 0; } |