Advertisement
Guest User

Untitled

a guest
Jun 28th, 2020
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 20.14 KB | None | 0 0
  1. #pragma warning(disable: 4996)
  2. #include "DxLib.h"
  3. #include <string>
  4. #include <mecab.h>
  5.  
  6. int konnnitiwasound = 0;
  7. int situreisimasitasound = 0;
  8. char String[256];
  9. char StringA[256];
  10. int InputHandle;
  11. int InputHandleA;
  12. int modoru = 0;
  13. std::string input;
  14. std::string message;
  15. std::string messageA;
  16.  
  17.  
  18.  
  19. int i;
  20.  
  21. int a[1] = { 3 };
  22.  
  23. int suuti = 256;
  24.  
  25. int duration = 0;
  26. int konnnitiwa = 0;
  27. int sitaidou = 0;
  28. int sitaidouA = 0;
  29. int mozicount = 0;
  30. int mozicount2 = 0;
  31. int mozicount3 = 0;
  32. int ranndamuz = 0;
  33.  
  34. int gimonnlock = 0;
  35.  
  36. // 自作文字列比較関数
  37. int my_strcmp(const char* s1, const char* s2) {
  38.     // 先頭から走査して差があればループ終了
  39.     for (; *s1 == *s2; s1++, s2++) {
  40.         // 終了前に終端文字が見つかったら差分なし
  41.         if (*s1 == '\0' && *s2 == '\0') { return 0; }
  42.     } return *s1 > * s2 ? 1 : -1;
  43. }
  44.  
  45. int my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。
  46.  
  47. {
  48.     //s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。
  49.     const size_t a = strlen(s2);
  50.     //無限ループする。
  51.     for (;;) {
  52.         //関数memcmpの返り値が0の時は一致した時なので、==0とする。
  53.         if (memcmp(s1, s2, a) == 0)
  54.  
  55.             return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
  56. //入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
  57.         else if (*s1 == '\0')
  58.  
  59.             return 0;//入っていなかった
  60. //文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。
  61.         else
  62.  
  63.             ++s1;
  64.  
  65.     }
  66.  
  67. }
  68.  
  69. int rireki = 0;
  70. int rireki2 = 0;
  71. int   LEFTmark = 0;
  72. const char* str[100] = {
  73.     "どんな映画が好きなんですか?","はい!大好きです!!あなたはどんな映画が好きですか? " ,"そうですね、、、私は恋愛映画が好きです!",
  74. "人間観察が好きだからかもしれません。","申し訳ありません。わかりません。" ,"おはようございます。今日は何をなさるんですか?"
  75. ,"そうですか。体を動かしたり外に出てみてはいかがですか?" ,"無理しないで、少し横になりましょう。" ,"大丈夫ですか?無理をしすぎでは?"
  76. ,"どうかゆっくり休んでください","何かあればいつでも呼んでください。","何を覚えますか?" };//ここで文字を直接書いてるので、この文字のバイト数が各posmozi[]に入るだけ
  77. int frame[100] = { 10,10 ,10,10,10,10,10,10,10 ,10,10 ,10};//次の一文字が出るまでのカウンタとして働いている、ここの数値を変えることで文字が一文字ずつ出るまでの間隔を設定できる。
  78. int posmozi[100];//文字のバイト数が入る箱を表している。
  79. int countS[100];//次の文字が出るまでのカウントするためのもの
  80. int z;//関数drawString外でも使えるように外にも定義を書いた。zの数値は関係なく、文字列が入った数列がif文により同じ変数zの時にframe[z]と同じになるまで+1されていったり、+2バイトor+1バイトされていくため、
  81. //文字が一文字ずつ入っていく、なんでzの変数に値を入れて動かす必要がないのだ。ちなみにfor (z = 0; z < 3; ++z)で書いてしまうとキーAを押した際のif文に関係なく関数drawStringの最初のzどこかに値が入っただけで繰り返しを開始してしまうため、今回のように同じ変数zの時にフレームを利用して描画するようにした。
  82. char c = str[z][posmozi[z]];//関数drawString外でも使えるように外にも定義を書いた。
  83.  
  84.  
  85. void drawString(int z, int x, int y, int color)
  86. {
  87.     c = str[z][posmozi[z]];//posmozi[z]
  88.     if (countS[z] == 0 && c != '\0')
  89.         posmozi[z] += IsDBCSLeadByte(c) ? 2 : 1;
  90.     if (++countS[z] == frame[z]) countS[z] = 0;
  91.     DrawFormatString(x, y, color, "%.*s", posmozi[z], str[z]);
  92.     DrawFormatString(300, 300, (0, 0, 255), "countS[0]は%d", countS[0]);
  93. }
  94.  
  95. /* 入力した文字列を格納 */
  96. char ch[100];
  97. /* ファイルポインタ */
  98. FILE* fp;
  99. int memoryHandle = 0;
  100. int memory = 0;
  101. int  Skey = 0;
  102. const int PAD_DOWN = 0;
  103.  
  104. char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
  105. char buffer2[256];
  106. FILE* outputfile;         // 出力ストリーム
  107. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  108. {
  109.  
  110.  
  111.     SetGraphMode(1500, 780, 32);         // ウィンドウの大きさを指定
  112.     ChangeWindowMode(TRUE);             // 全画面ではなくウインドウを使用
  113.     // DXライブラリの初期化
  114.     if (DxLib_Init() == -1) return -1;
  115.     SetFontSize(42);                             //サイズを42に変更
  116.     // 描画先を裏にする
  117.     SetDrawScreen(DX_SCREEN_BACK);
  118.  
  119.     // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  120.     //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
  121.  
  122.     InputHandle = MakeKeyInput(150, FALSE, FALSE, FALSE); //これで総計150バイトの文字データを保持できる。
  123.  
  124.     // 作成したキー入力ハンドルをアクティブにする
  125.     SetActiveKeyInput(InputHandle);
  126.  
  127.     // キー入力終了待ちループ
  128.     // (ProcessMessageをループごとに行う)
  129.  
  130.     while (ProcessMessage() == 0)
  131.     {
  132.         // 画面の初期化
  133.         ClearDrawScreen();
  134.  
  135.  
  136.         //まずは描画する部分から作る。
  137.         // 入力モードを描画
  138.         DrawKeyInputModeString(640, 480);
  139.         // 入力途中の文字列を描画
  140.         DrawKeyInputString(0, 0, InputHandle);//InputHandleはint型とリファレンスに書いてあったんで
  141.  
  142.  
  143.         //その後にif文での分岐を考える。
  144.           // 入力が終了している場合は終了
  145.           //ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。
  146.          //エンターキーが押された時の部分。
  147.         if (CheckKeyInput(InputHandle) != 0) {
  148.             LEFTmark = 678;
  149.            
  150.             // 入力された文字列を取得、その文字列を数値に変換
  151.             GetKeyInputString(buffer, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードに変換したものを上でchar型で定義したbufferに入れる。
  152.             input = buffer;//bufferに入った文字コードに変換したものを
  153.  
  154.  
  155.             DrawString(0, 0, input.c_str(), GetColor(255, 255, 255));
  156.  
  157.             if (my_str2(buffer, "覚えて")) {
  158.                 // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  159.    //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
  160.                 z = 11;
  161.                 // 入力された文字列を取得、その文字列を数値に変換
  162.            //     GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
  163.                 ++mozicount;
  164.                 memory = 1;
  165.             }
  166.             //覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。
  167.             else if(memory == 0){
  168.                 outputfile = fopen("d.txt", "r");  // ファイルを読み込み用にオープン(開く)
  169.                 if (outputfile == NULL) {          // オープンに失敗した場合
  170.                     printf("cannot open\n");         // エラーメッセージを出して
  171.                     exit(1);                         // 異常終了
  172.                 }
  173.                 //fgetsがNULLになるまで繰り返す
  174.          //fgets(str,256,lf)!=NULL
  175.          //と同じです。このように短縮することも可能
  176.                 while (fgets(buffer2, 256, outputfile) )//メモに書いた文字列をbuffer2の中に入れる。
  177.                 {
  178.  
  179.  
  180.  
  181.                     /* 配列の要素を出力 */
  182.  
  183.                         //inputに入った文字のデータを数値化するために input.c_str()を定義して、下のif文に使った。
  184.  
  185.                     //変数inputに入る前はchar型のbufferに文字列が入るので、my_str2はchar*型を引数にとるため、char*型は文字列を定義するので、
  186.                     //関数my_str2にはそのまま文字列が使えるので、その文字列が入っているbufferを直接書いた。
  187.  
  188.  
  189.  
  190.                     if (my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "どんな") && my_str2(buffer, "?") ||
  191.                         my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "?")) {
  192.                         //  message = "どんな映画が好きなんですか?";
  193.                        // DrawFormatString(100, 300, GetColor(255, 255, 0), "%s", buffer);
  194.                         LEFTmark = 893;
  195.                         ++mozicount;
  196.                         gimonnlock = 1;
  197.                         if (my_str2(buffer2, "映画")) {
  198.                             //  message = "どんな映画が好きなんですか?";
  199.                            
  200.                            // ++mozicount;
  201.                          
  202.  
  203.                         }
  204.                     }
  205.                    // else if (my_str2(buffer, "映画") && my_str2(buffer, "好き")) {
  206.                         //  message = "どんな映画が好きなんですか?";
  207.                        // konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  208.                    //     PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  209.                     //    z = 0;//はい、好きです。あなたはどんな映画が好きですか?
  210.                      //   ++mozicount;
  211.                     //}
  212.                     if (gimonnlock == 1 && my_str2(buffer, "なぜ") ||
  213.                         gimonnlock == 1 && my_str2(buffer, "何で") ||
  214.                         gimonnlock == 1 && my_str2(buffer, "なんで")) {
  215.                         //  message = "どんな映画が好きなんですか?";
  216.                         konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  217.                         PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  218.                         z = 3;//人間観察が好きだからです。
  219.                         ++mozicount;
  220.                         gimonnlock = 0;
  221.                     }
  222.                     //★ここに以下の物を書くと上のif分が書いていなかったときにこっちに来るようになってしまい、一番最初のifとelse ifが正しく動かないので、上の二つの
  223.                     //ifは同じ個所もあるが違う条件もお互いに含むためお互いにただのif文でいい。
  224.                    // else if (my_str2(buffer, "映画") && my_str2(buffer, "好き")) {
  225.                    //     //  message = "どんな映画が好きなんですか?";
  226.                    //     konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  227.                    //     PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  228.                    //     z = 0;//はい、好きです。あなたはどんな映画が好きですか?
  229.                    //     ++mozicount;
  230.                    // }
  231.  
  232.                     if (my_str2(buffer, "映画") && my_str2(buffer, "事実") || my_str2(buffer, "映画") && my_str2(buffer, "アクション")) {
  233.                         //  message = "どんな映画が好きなんですか?";
  234.                        // konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  235.                         //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  236.                         z = 2;
  237.                         ++mozicount;
  238.                     }
  239.  
  240.                     if (my_str2(buffer, "おはよう")) {
  241.                         //  message = "どんな映画が好きなんですか?";
  242.                         //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  243.                         //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  244.                         z = 5;//おはようございます。
  245.                         ++mozicount;
  246.                     }
  247.  
  248.                     if (my_str2(buffer, "決めて") && my_str2(buffer, "ない") || my_str2(buffer, "考えて") && my_str2(buffer, "ない")
  249.                         || my_str2(buffer, "知ら") && my_str2(buffer, "ない")) {
  250.                         //  message = "どんな映画が好きなんですか?";
  251.                         //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  252.                         //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  253.                         z = 6;//そうですか。体を動かしたり外に出てみてはいかがですか?
  254.                         ++mozicount;
  255.                     }
  256.                     if (my_str2(buffer, "気分") or my_str2(buffer, "体調") && my_str2(buffer, "悪い")) {
  257.                         //  message = "どんな映画が好きなんですか?";
  258.                         //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  259.                         //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  260.                         ranndamuz = GetRand(1);
  261.                         if (ranndamuz == 0) {
  262.                             z = 7;//無理しないで、少し横になりましょう。
  263.                         }
  264.                         if (ranndamuz == 1) {
  265.                             z = 8;//大丈夫ですか?無理をし過ぎなのでは?
  266.                         }
  267.                         ++mozicount;
  268.                     }
  269.                     if (ranndamuz == 1 && my_str2(buffer, "そう") && my_str2(buffer, "かも")) {
  270.                         //  message = "どんな映画が好きなんですか?";
  271.                         //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  272.                         //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  273.  
  274.                         if (ranndamuz == 1) {
  275.                             z = 9;//どうかゆっくり休んでください。
  276.                             ranndamuz = 0;//ranndamuzを0にする。
  277.                         }
  278.                         ++mozicount;
  279.                     }
  280.                     if (my_str2(buffer, "はい")) {
  281.                         //  message = "どんな映画が好きなんですか?";
  282.                         //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  283.                         //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  284.  
  285.                         z = 10;//何かあればいつでも呼んでください。
  286.  
  287.                         ++mozicount;
  288.                     }
  289.                     //★ここにこいつを書くとおはようと書かれなかった場合にz=4ということになってしまう。
  290.                     //else {
  291.                     //    z = 4;
  292.                     //    ++mozicount;
  293.                     //}
  294.  
  295.                 }
  296.  
  297.  
  298.                 fclose(outputfile);          // ファイルをクローズ(閉じる)
  299.  
  300.             }
  301.             //できればエンターキーを押して、次の文章を記憶できるようにしたかったが、文章には必ずと言っていいほど「は」や「とは」
  302.             //が入るし、定義のように覚えさせたいので「覚えて」の後に下のような条件で文章を記憶するようにさせた。
  303.             if (memory == 1 && my_str2(buffer, "とは")or memory == 1 && my_str2(buffer, "は")) {
  304.                 // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  305.    //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
  306.                
  307.                 // 入力された文字列を取得、その文字列を数値に変換
  308.            //     GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
  309.                 ++mozicount;
  310.                 memory = 2;
  311.        
  312.             }
  313.             //duration = 1;
  314.             // 再度インプットハンドルをアクティブにする
  315.             SetActiveKeyInput(InputHandle);
  316.             // 入力文字列を初期化する
  317.             SetKeyInputString("", InputHandle);
  318.             //++mozicount;
  319.  
  320.         }
  321.  
  322.         //エンターキーが押されていないときでの処理
  323.         if (memory == 2) {
  324.             LEFTmark = 100;
  325.             //例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。//このような変換をしたようなもの。
  326.          
  327.  
  328.             outputfile = fopen("d.txt", "a+");  // ファイルを書き込み用にオープン(開く)
  329.             if (outputfile == NULL) {          // オープンに失敗した場合
  330.                 printf("cannot open\n");         // エラーメッセージを出して
  331.                 exit(1);                         // 異常終了
  332.             }
  333.  
  334.             fprintf(outputfile, "%s\n", buffer); // ファイルに書く
  335.  
  336.             fclose(outputfile);          // ファイルをクローズ(閉じる)
  337.  
  338.             //fclose(fp);//ファイルに書き込んだときにウィンドウが消えるようになっているので、memoryが1になった瞬間に書き込んでいるうんぬん以前に
  339.             //ファイルが閉じるのでウィンドウが消えてしまう。
  340.             memory = 0;
  341.             // return 0;//ここで0になると終了してしまうので書き込んだ後も言葉が打ち込めるようにここを消す。
  342.  
  343.         }
  344.         //if (CheckKeyInput(InputHandle) == 0) {
  345.         //    z = 6;
  346.         //    ++mozicount;
  347.        // }
  348.  
  349.         //  DrawFormatString(100, 150, GetColor(255, 255, 0), "ProcessMessage()は%d,modoruは%d", ProcessMessage(), modoru);
  350.         DrawFormatString(0, 150, GetColor(255, 255, 0), "zは%d,konnnitiwaは%d,sitaidouは%d,mozicountは%d", z, konnnitiwa, sitaidou, mozicount);
  351.         DrawFormatString(0, 250, GetColor(255, 255, 0), "mozicount2は%d,input.c_str()は%d,  LEFTmarkは%d", mozicount2, input.c_str(), LEFTmark);
  352.         DrawFormatString(100, 100, GetColor(255, 255, 0), " gimonnlockは%d,memoryは%d, Skeyは%d", gimonnlock, memory, Skey);
  353.         DrawFormatString(100, 300, GetColor(255, 255, 0), "bufferは%s", buffer);
  354.         DrawFormatString(100, 400, GetColor(5, 105, 0), " buffer2は%s", buffer2);
  355.  
  356.  
  357.         //新しい言葉の処理
  358.  
  359.             //文字カウントが1の時
  360.         if (mozicount > 0) {
  361.             drawString(z, 10, 100, GetColor(5, 255, 255));
  362.  
  363.         }
  364.  
  365.  
  366.         // 裏画面の内容を表画面に反映させる
  367.         ScreenFlip();
  368.  
  369.  
  370.  
  371.  
  372.  
  373.     }
  374.  
  375.     // 用済みのインプットハンドルを削除する
  376.     DeleteKeyInput(InputHandle);
  377.  
  378.     // 画面の初期化
  379.     ClearDrawScreen();
  380.  
  381.     // 裏画面の内容を表画面に反映させる
  382.     ScreenFlip();
  383.  
  384.     // キー入力待ち
  385.    // WaitKey();
  386.  
  387.     //ループないやループから出た後で何かしらの問題が発生したら終了する。
  388.     // DXライブラリの使用終了
  389.     DxLib_End();
  390.  
  391.     // 終了
  392.     return 0;
  393. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement