Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.19 KB | None | 0 0
  1. #pragma warning(disable: 4996)
  2. #include "DxLib.h"
  3. #include <mecab.h>
  4. #pragma comment(lib, "libmecab.lib")
  5. #include <string>
  6.  
  7. int InputHandle;
  8. int mozicount = 0;
  9. int gimonnlock = 0;
  10. int gimon = 0;
  11. int memorycount = 0;
  12. int memory = 0;
  13. char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
  14. char buffer2[256];
  15. char  buffer3[256];
  16. char  buffer4[256];
  17. char  buffer5[256];
  18. char input[256];
  19. char* p;
  20. char* p1;
  21. FILE* outputfile;         // 出力ストリーム
  22. int hyouzi = 0;
  23. char* memo[1000];//関数とは関係ない。//charの配列には必ず定数値を書かなければならない、なのでメモにある文字列1000行まで読み込めるように。100とした。
  24. int n_show = 0;
  25. int show_color = GetColor(255, 0, 255);
  26. int a;
  27. const char* z = "";  // z は drawString で表示する文字列
  28. int pos[2] = { 0 };  // z の表示文字位置(初期値をゼロにする)
  29. unsigned debug_color = GetColor(255, 255, 0);
  30. unsigned z_color = GetColor(5, 255, 255);
  31. int   LEFTmark = 0;
  32. int diffrent = 0;
  33.  
  34. const char* result = "";
  35. char buf[4096];
  36. const char* words[100];
  37. int n = 0;
  38. unsigned word_color = GetColor(0, 255, 255);
  39.  
  40. char my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。
  41.  
  42. {
  43.     //s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。
  44.     const size_t a = strlen(s2);
  45.     //無限ループする。
  46.     for (;;) {
  47.         //関数memcmpの返り値が0の時は一致した時なので、==0とする。
  48.         if (memcmp(s1, s2, a) == 0)
  49.  
  50.             return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
  51. //入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
  52.         else if (*s1 == '\0')
  53.  
  54.             return 0;//入っていなかった
  55. //文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。
  56.         else
  57.  
  58.             ++s1;
  59.  
  60.     }
  61.  
  62. }
  63. // drawString -- 文字を一字ずつ表示する
  64. void drawString(int x, int y, int color, int* pos, const char* str)
  65. {
  66.     char c = str[*pos];  // *pos は pos[0] で表示文字位置
  67.     if (pos[1] == 0 && c != '\0') *pos += IsDBCSLeadByte(c) ? 2 : 1;
  68.     if (++pos[1] == 10) pos[1] = 0;  // pos[1] はフレームカウンタ
  69.     DrawFormatString(x, y, color, "%.*s", *pos, str);
  70. }
  71.  
  72.  
  73. int readMemo(char** memo, int n)
  74. {
  75.     outputfile = fopen("memo.txt", "r");
  76.     if (outputfile == NULL) return 0;
  77.     int i;
  78.     char buf[256];
  79.     memo[0] = (char*)"";
  80.     for (i = 1; i < n && fgets(buf, sizeof buf, outputfile); i++)
  81.         memo[i] = strdup(buf);
  82.     fclose(outputfile);
  83.     return i;
  84. }
  85.  
  86.  
  87. int findMemo(char** memo, int n, char* str)
  88. {
  89.     if (str[0] != '\0')
  90.         for (int i = 0; i < n; i++)
  91.             if (strstr(memo[i], str)) return i;
  92.     return 0;
  93. }
  94.  
  95. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  96. {
  97.     SetGraphMode(1500, 780, 32);         // ウィンドウの大きさを指定
  98.     ChangeWindowMode(TRUE);             // 全画面ではなくウインドウを使用
  99.     // DXライブラリの初期化
  100.     if (DxLib_Init() == -1) return -1;
  101.     SetFontSize(33);                             //サイズを42に変更
  102.     // 描画先を裏にする
  103.     SetDrawScreen(DX_SCREEN_BACK);
  104.     InputHandle = MakeKeyInput(150, FALSE, FALSE, FALSE); //これで総計150バイトの文字データを保持できる。
  105.     // 作成したキー入力ハンドルをアクティブにする
  106.     SetActiveKeyInput(InputHandle);
  107.  
  108.     while (ProcessMessage() == 0)
  109.     {
  110.         // 画面の初期化
  111.         ClearDrawScreen();
  112.         //まずは描画する部分から作る。
  113.         // 入力モードを描画
  114.         DrawKeyInputModeString(1500, 0); // 入力モードを描画
  115.         // 入力途中の文字列を描画
  116.         DrawKeyInputString(0, 0, InputHandle);//InputHandleはint型とリファレンスに書いてあったんで
  117.         //その後にif文での分岐を考える。
  118.           // 入力が終了している場合は終了
  119.           //ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。
  120.          //エンターキーが押された時の部分。
  121.         if (CheckKeyInput(InputHandle) != 0) {
  122.             LEFTmark = 678;
  123.             hyouzi = 0;
  124.             gimon = 0;
  125.             memorycount = 0;
  126.             ++mozicount;
  127.             // 入力された文字列を取得、その文字列を数値に変換
  128.             GetKeyInputString(buffer, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードに変換したものを上でchar型で定義したbufferに入れる。
  129.            
  130.             MeCab::Tagger* tagger = MeCab::createTagger("");
  131.             result = tagger->parse(buffer);
  132.             strcpy_s(buf, sizeof buf, result);
  133.             n = 0;
  134.             words[n] = strtok(buf, "\t\n");
  135.             while (n < 100 && words[n]) {
  136.                 strtok(NULL, "\t\n");
  137.                 words[++n] = strtok(NULL, "\t\n");
  138.             }
  139.  
  140.             int n_memo = readMemo(memo, 1000);//ここで関数readMemoを書くことでキーを押すたびに書き込んだ文章が読み込める。
  141.             n_show = findMemo(memo, n_memo, buffer);  // メモを検索
  142.  
  143.  
  144.             if (my_str2(buffer, "覚えて")) {
  145.  
  146.                 z = "何を覚えますか?", pos[0] = pos[1] = 0;
  147.                 ++mozicount;
  148.                 memory = 1;
  149.                 gimon = 0;
  150.             }
  151.             //覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。
  152.             else if (memory == 0) {
  153.                 outputfile = fopen("memo.txt", "r");  // ファイルを読み込み用にオープン(開く)
  154.                 if (outputfile == NULL) {          // オープンに失敗した場合
  155.                     printf("cannot open\n");         // エラーメッセージを出して
  156.                     exit(1);                         // 異常終了
  157.                 }
  158.                 z = "どうしましたか?", pos[0] = pos[1] = 0;
  159.                 //★bufferには文字入力の文字列を入れたので、ここにはメモからの文字列は入れられない。なので新しくbuffer2を作る。
  160.                 while ((fgets(buffer2, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer2の中に入れる。
  161.                 {
  162.                     //注意「?」は全角の物を打たないと反応しない
  163.                     if (my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "?")) {
  164.                         //  message = "どんな映画が好きなんですか?";
  165.                        // DrawFormatString(100, 300, GetColor(255, 255, 0), "%s", buffer);
  166.                         if (my_str2(buffer, "どんな")) {
  167.                             ++mozicount;
  168.                             gimonnlock = 1;
  169.                             if (my_str2(buffer2, "映画") && my_str2(buffer2, "どんな")) {
  170.                                 LEFTmark = 893;
  171.                                 hyouzi = 1;
  172.                                 p = strstr(buffer2, "→");//ここで→以降の文字をbuffer3に入れる。
  173.                                 p += 2;
  174.                                 strcpy(buffer3, p);//関数strcpyが指定した文字である「→」から2バイト動かしたポインタからの文字データを加算でbuffer3に入れている
  175.  
  176.                             }
  177.                         }
  178.                         if (my_str2(buffer, "なんで") or my_str2(buffer, "なぜ")) {
  179.                             ++mozicount;
  180.                             gimonnlock = 1;
  181.                             if (my_str2(buffer2, "映画") && my_str2(buffer2, "なぜ")) {
  182.                                 LEFTmark = 893;
  183.                                 hyouzi = 1;
  184.                                 p = strstr(buffer2, "→");//ここで→以降の文字をbuffer3に入れる。
  185.                                 p += 2;
  186.                                 strcpy(buffer3, p);//関数strcpyが指定した文字である「→」から2バイト動かしたポインタからの文字データを加算でbuffer3に入れている
  187.  
  188.                             }
  189.                         }
  190.                     }
  191.  
  192.                     // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
  193.                     //一致する場合は1を返すようにしたので==1とする。
  194.                       //入力がない時。
  195.                     if (buffer[0] == '\0') {
  196.                         z = "文字を入力してください。", pos[0] = pos[1] = 0;
  197.                         diffrent = 0;
  198.                     }
  199.                     else if (my_str2(buffer2, buffer) == 0) {
  200.                         z = "すいません。わかりません。", pos[0] = pos[1] = 0;
  201.                         diffrent = 1;
  202.                     }
  203.                     else if (my_str2(buffer2, words[1]) == 1) {
  204.  
  205.                         hyouzi = 1;
  206.                         gimon = 0;
  207.                         p = strstr(buffer2, "→");//ここで→以降の文字をbuffer3に入れる。
  208.                         p += 2;
  209.                         strcpy(buffer3, p);//関数strcpyが指定した文字である「→」から2バイト動かしたポインタからの文字データを加算でbuffer3に入れている
  210.                        // break;
  211.                         while ((fgets(buffer4, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer3の中に入れる。
  212.                         {
  213.                             if (my_str2(buffer4, "健康に悪い→") == 1) {
  214.                                 LEFTmark = 213;
  215.                                 hyouzi = 1;
  216.  
  217.                                 p1 = strstr(buffer4, "→");//ここで→以降の文字をbuffer3に入れる。
  218.                                 p1 += 2;
  219.                                 strcpy(buffer5, p1);
  220.                                 break;
  221.                             }
  222.                             if (my_str2(buffer4, "健康に悪い→") == 0) {
  223.                                 break;
  224.                             }
  225.                         }
  226.                     }
  227.  
  228.                     // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致しない文字が出てきた場合
  229.                     if (hyouzi == 0) {
  230.                         if (strcmp(buffer2, buffer) == 0) {
  231.                             gimon = 1;
  232.                         }
  233.                     }
  234.                 }
  235.                 fclose(outputfile);          // ファイルをクローズ(閉じる)
  236.             }
  237.             //できればエンターキーを押して、次の文章を記憶できるようにしたかったが、文章には必ずと言っていいほど「は」や「とは」
  238.             //が入るし、定義のように覚えさせたいので「覚えて」の後に下のような条件で文章を記憶するようにさせた。
  239.             if (memory == 1 && my_str2(buffer, "→")) {
  240.                 // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  241.                 ++mozicount;
  242.                 memory = 2;
  243.                 z = "記憶しました。", pos[0] = pos[1] = 0;
  244.             }
  245.             //duration = 1;
  246.             // 再度インプットハンドルをアクティブにする
  247.             SetActiveKeyInput(InputHandle);
  248.             // 入力文字列を初期化する
  249.             SetKeyInputString("", InputHandle);
  250.             //++mozicount;
  251.         }
  252.         //エンターキーが押されていないときでの処理
  253.         if (memory == 2) {
  254.             LEFTmark = 100;
  255.             //例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。//このような変換をしたようなもの。
  256.             outputfile = fopen("memo.txt", "a+");  // ファイルを書き込み用にオープン(開く)
  257.             if (outputfile == NULL) {          // オープンに失敗した場合
  258.                 printf("cannot open\n");         // エラーメッセージを出して
  259.                 exit(1);                         // 異常終了
  260.             }
  261.             fprintf(outputfile, "%s\n", buffer); // ファイルに書く
  262.             fclose(outputfile);          // ファイルをクローズ(閉じる)
  263.             //fclose(fp);//ファイルに書き込んだときにウィンドウが消えるようになっているので、memoryが1になった瞬間に書き込んでいるうんぬん以前に
  264.             //ファイルが閉じるのでウィンドウが消えてしまう。
  265.             memory = 0;
  266.             memorycount = 1;
  267.             // return 0;//ここで0になると終了してしまうので書き込んだ後も言葉が打ち込めるようにここを消す。    
  268.         }
  269.  
  270.         DrawFormatString(0, 150, GetColor(255, 255, 0), "mozicountは%d", mozicount);
  271.         DrawFormatString(0, 250, GetColor(255, 255, 0), " LEFTmarkは%d", LEFTmark);
  272.         DrawFormatString(100, 100, GetColor(255, 255, 0), " gimonnlockは%d,memoryは%d", gimonnlock, memory);
  273.         DrawFormatString(100, 300, GetColor(255, 255, 0), "hyouziは%d,gimonは%d,bufferは%s", hyouzi, gimon, buffer);
  274.         //DrawFormatString(100, 400, GetColor(5, 105, 0), " buffer2は%s", buffer2);
  275.  
  276.         if (gimon == 0 && hyouzi == 1) {
  277.             // DrawFormatString(100, 500, GetColor(5, 105, 19), " buffer2は%s", buffer2);
  278.             DrawFormatString(100, 600, GetColor(175, 80, 100), "%s%s", buffer3, buffer5);
  279.         }
  280.         if (mozicount >= 1 && gimon == 0 && hyouzi == 0 && diffrent == 1) {
  281.             DrawFormatString(10, 210, show_color, "申し訳ありません %s とは何ですか?", buffer);
  282.         }
  283.         if (mozicount >= 0 && gimon == 0 && hyouzi == 0) {
  284.             drawString(10, 100, z_color, pos, z);
  285.         }
  286.         for (int i = 0; i < n; i++)
  287.             DrawString(100, 200 + i * 40, words[i], word_color);
  288.  
  289.         // 裏画面の内容を表画面に反映させる
  290.         ScreenFlip();
  291.  
  292.     }
  293.  
  294.     // 用済みのインプットハンドルを削除する
  295.     DeleteKeyInput(InputHandle);
  296.  
  297.     // 画面の初期化
  298.     ClearDrawScreen();
  299.  
  300.     // 裏画面の内容を表画面に反映させる
  301.     ScreenFlip();
  302.  
  303.     // キー入力待ち
  304.    // WaitKey();
  305.  
  306.     //ループないやループから出た後で何かしらの問題が発生したら終了する。
  307.     // DXライブラリの使用終了
  308.     DxLib_End();
  309.  
  310.     // 終了
  311.     return 0;
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement