< 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> | #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 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]=""; //ループカウンタ用一時変数 int i,j; //正解文字列の長さ用一時変数 int ans_len; //入力文字列の長さ用一時変数 int player_len; //機能「乱数を使って選択し表示します」 srand(time(NULL)); sel_question=rand()%10; puts(question[sel_question][0]); for(i=0;question[sel_question][1][i]!='\0';){ if(SJISMultiCheck(question[sel_question][1][i])){ strcat(hint_str,"*"); i+=2; } else{ strcat(hint_str,"*"); i++; } } while(1){ //機能「ヒント文字列の表示」 printf("ヒント:%s\n",hint_str); //機能「その問題の答えをプレイヤーはキーボードから入力」 fgets(player_ans,79,stdin); //機能「ヒント文字列の更新」 ans_len=strlen(question[sel_question][1]); player_len=strlen(player_ans); j=0; for(i=0;(i<ans_len)&&(i<player_len);){ while(j<i){ if(SJISMultiCheck(question[sel_question][1][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]==question[sel_question][1][i])&& (player_ans[i+1]==question[sel_question][1][i+1])){ hint_str[i]=question[sel_question][1][i]; hint_str[i+1]=question[sel_question][1][i+1]; } i+=2; } else{//半角文字の場合 if(player_ans[i]==question[sel_question][1][i]){ hint_str[i]=question[sel_question][1][i]; } i++; } } } //機能「成否を判定します」 if(player_ans[0]!='\0')player_ans[strlen(player_ans)-1]='\0'; if(!strcmp(player_ans,question[sel_question][1]))break; puts("違います。もう一度入力してください。"); } //機能「クリア表示して終了」 puts("正解です。Enterを押すと終了します。"); //終了待ち getchar(); return 0; } |
機能名 | 行数 |
---|---|
乱数を使って選択し表示します | 13 |
ヒント文字列の表示 | 1 |
その問題の答えをプレイヤーはキーボードから入力 | 1 |
ヒント文字列の更新 | 29 |
成否を判定します | 3 |
クリア表示して終了 | 1 |
< 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> | /******************************************** 乱数を使って問題を選択して表示する 戻り値:選択された問題のID const char (*question)[2][64]:選択対象の問題セット。 size_t question_cnt:questionの要素数 char *hint:[出力]ヒント文字列を格納する領域 size_t hint_cnt:hintの要素数 ********************************************/ srand(time(NULL)); sel_question=rand()%10; puts(question[sel_question][0]); for(i=0;question[sel_question][1][i]!='\0';){ if(SJISMultiCheck(question[sel_question][1][i])){ strcat(hint_str,"*"); i+=2; } else{ strcat(hint_str,"*"); i++; } } } |
< 1> < 2> < 3> < 4> < 5> < 6> < 7> < 8> < 9> < 10> < 11> < 12> < 13> < 14> < 15> < 16> < 17> < 18> < 19> < 20> < 21> < 22> < 23> < 24> | /******************************************** 乱数を使って問題を選択して表示する 戻り値:選択された問題のID const char (*question)[2][64]:選択対象の問題セット。 size_t question_cnt:questionの要素数 char *hint:[出力]ヒント文字列を格納する領域 size_t hint_cnt:hintの要素数 ********************************************/ sel_question=rand()%10; 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++; } } } |
< 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> | /******************************************** 乱数を使って問題を選択して表示する 戻り値:選択された問題のID 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; 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++; } } } |
< 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> | /******************************************** 乱数を使って問題を選択して表示する 戻り値: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++; } } } |
< 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> | /******************************************** 乱数を使って問題を選択して表示する 戻り値: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; } |
< 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> | #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; } 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]=""; //ループカウンタ用一時変数 int i,j; //正解文字列の長さ用一時変数 int ans_len; //入力文字列の長さ用一時変数 int player_len; srand(time(NULL)); //機能「乱数を使って選択し表示します」 sel_question=SelectQuestion(question,10,hint_str,80); while(1){ //機能「ヒント文字列の表示」 printf("ヒント:%s\n",hint_str); //機能「その問題の答えをプレイヤーはキーボードから入力」 fgets(player_ans,79,stdin); //機能「ヒント文字列の更新」 ans_len=strlen(question[sel_question][1]); player_len=strlen(player_ans); j=0; for(i=0;(i<ans_len)&&(i<player_len);){ while(j<i){ if(SJISMultiCheck(question[sel_question][1][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]==question[sel_question][1][i])&& (player_ans[i+1]==question[sel_question][1][i+1])){ hint_str[i]=question[sel_question][1][i]; hint_str[i+1]=question[sel_question][1][i+1]; } i+=2; } else{//半角文字の場合 if(player_ans[i]==question[sel_question][1][i]){ hint_str[i]=question[sel_question][1][i]; } i++; } } } //機能「成否を判定します」 if(player_ans[0]!='\0')player_ans[strlen(player_ans)-1]='\0'; if(!strcmp(player_ans,question[sel_question][1]))break; puts("違います。もう一度入力してください。"); } //機能「クリア表示して終了」 puts("正解です。Enterを押すと終了します。"); //終了待ち getchar(); return 0; } |