Advertisement
Guest User

Untitled

a guest
Jun 26th, 2020
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 17.68 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};//次の一文字が出るまでのカウンタとして働いている、ここの数値を変えることで文字が一文字ずつ出るまでの間隔を設定できる。
  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. int Key[256];
  95.  
  96.  
  97. int gpUpdateKey()
  98. {
  99.     char tmpKey[256];
  100.     GetHitKeyStateAll(tmpKey);
  101.     for (int i = 0; i < 256; i++)
  102.         (tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++;
  103.     return 0;
  104. }
  105. int Pad[32];
  106. //ジョイパッドのボタンのための関数
  107. int gpUpdatePad()
  108. {
  109.     int padStat = GetJoypadInputState(DX_INPUT_KEY_PAD1);    //入力状態を padStat に格納
  110.     for (int i = 0; i < 28; i++) {                            //ボタン28個分ループ
  111.         if (padStat & (1 << i)) {                            //ボタンiの入力フラグが立っていたら
  112.             Pad[i]++;                                        //加算
  113.         }
  114.         else {                                            //入力がなければ
  115.             Pad[i] = 0;                                        //0 にする
  116.         }
  117.     }
  118.  
  119.     return 0;
  120. }
  121.  
  122. /* 入力した文字列を格納 */
  123. char ch[100];
  124. /* ファイルポインタ */
  125. FILE* fp;
  126. int memoryHandle = 0;
  127. int memory = 0;
  128. int  Skey = 0;
  129. const int PAD_DOWN = 0;
  130.  
  131. char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
  132. char buffer2[256];
  133.  
  134. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  135. {
  136.  
  137.  
  138.     SetGraphMode(1500, 780, 32);         // ウィンドウの大きさを指定
  139.     ChangeWindowMode(TRUE);             // 全画面ではなくウインドウを使用
  140.     // DXライブラリの初期化
  141.     if (DxLib_Init() == -1) return -1;
  142.     SetFontSize(42);                             //サイズを42に変更
  143.     // 描画先を裏にする
  144.     SetDrawScreen(DX_SCREEN_BACK);
  145.  
  146.     // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  147.     //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
  148.    
  149.         InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE);
  150.    
  151.     // 作成したキー入力ハンドルをアクティブにする
  152.     SetActiveKeyInput(InputHandle);
  153.  
  154.     // キー入力終了待ちループ
  155.     // (ProcessMessageをループごとに行う)
  156.  
  157.     while (ProcessMessage() == 0)
  158.     {
  159.        
  160.         gpUpdatePad();
  161.         gpUpdateKey();
  162.         // 画面の初期化
  163.         ClearDrawScreen();
  164.  
  165.  
  166.         //まずは描画する部分から作る。
  167.         // 入力モードを描画
  168.         DrawKeyInputModeString(640, 480);
  169.         // 入力途中の文字列を描画
  170.         DrawKeyInputString(0, 0, InputHandle);//InputHandleはint型とリファレンスに書いてあったんで
  171.  
  172.  
  173.         //その後にif文での分岐を考える。
  174.           // 入力が終了している場合は終了
  175.           //ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。
  176.          //エンターキーが押された時の部分。
  177.         if (CheckKeyInput(InputHandle) != 0) {
  178.             LEFTmark = 678;
  179.             // 入力された文字列を取得
  180.  
  181.             // 入力された文字列を取得、その文字列を数値に変換
  182.             GetKeyInputString(buffer, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードに変換したものを上でchar型で定義したbufferに入れる。
  183.             input = buffer;//bufferに入った文字コードに変換したものを
  184.  
  185.  
  186.             DrawString(0, 0, input.c_str(), GetColor(255, 255, 255));
  187.  
  188.  
  189.  
  190.  
  191.             /* 配列の要素を出力 */
  192.  
  193.                 //inputに入った文字のデータを数値化するために input.c_str()を定義して、下のif文に使った。
  194.  
  195.             //変数inputに入る前はchar型のbufferに文字列が入るので、my_str2はchar*型を引数にとるため、char*型は文字列を定義するので、
  196.             //関数my_str2にはそのまま文字列が使えるので、その文字列が入っているbufferを直接書いた。
  197.  
  198.  
  199.  
  200.             if (my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "どんな") && my_str2(buffer, "?") ||
  201.                 my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "?")) {
  202.                 //  message = "どんな映画が好きなんですか?";
  203.                 konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  204.                 PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  205.                 z = 2;//そうですね、、、恋愛映画が好き。
  206.                 ++mozicount;
  207.                 gimonnlock = 1;
  208.  
  209.             }
  210.             else if (my_str2(buffer, "映画") && my_str2(buffer, "好き")) {
  211.                 //  message = "どんな映画が好きなんですか?";
  212.                // konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  213.                 PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  214.                 z = 0;//はい、好きです。あなたはどんな映画が好きですか?
  215.                 ++mozicount;
  216.             }
  217.             if (gimonnlock == 1 && my_str2(buffer, "なぜ") ||
  218.                 gimonnlock == 1 && my_str2(buffer, "何で") ||
  219.                 gimonnlock == 1&& my_str2(buffer, "なんで")) {
  220.                 //  message = "どんな映画が好きなんですか?";
  221.                 konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  222.                 PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  223.                 z = 3;//人間観察が好きだからです。
  224.                 ++mozicount;
  225.                 gimonnlock = 0;
  226.             }
  227.             //★ここに以下の物を書くと上のif分が書いていなかったときにこっちに来るようになってしまい、一番最初のifとelse ifが正しく動かないので、上の二つの
  228.             //ifは同じ個所もあるが違う条件もお互いに含むためお互いにただのif文でいい。
  229.            // else if (my_str2(buffer, "映画") && my_str2(buffer, "好き")) {
  230.            //     //  message = "どんな映画が好きなんですか?";
  231.            //     konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  232.            //     PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  233.            //     z = 0;//はい、好きです。あなたはどんな映画が好きですか?
  234.            //     ++mozicount;
  235.            // }
  236.  
  237.             if (my_str2(buffer, "映画") && my_str2(buffer, "事実") || my_str2(buffer, "映画") && my_str2(buffer, "アクション")) {
  238.                 //  message = "どんな映画が好きなんですか?";
  239.                // konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  240.                 //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  241.                 z = 2;
  242.                 ++mozicount;
  243.             }
  244.  
  245.             if (my_str2(buffer, "おはよう")) {
  246.                 //  message = "どんな映画が好きなんですか?";
  247.                 //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  248.                 //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  249.                 z = 5;//おはようございます。
  250.                 ++mozicount;
  251.             }
  252.  
  253.             if (my_str2(buffer, "決めて") && my_str2(buffer, "ない") || my_str2(buffer, "考えて") && my_str2(buffer, "ない")
  254.                 || my_str2(buffer, "知ら") && my_str2(buffer, "ない")) {
  255.                 //  message = "どんな映画が好きなんですか?";
  256.                 //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  257.                 //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  258.                 z = 6;//そうですか。体を動かしたり外に出てみてはいかがですか?
  259.                 ++mozicount;
  260.             }
  261.             if (my_str2(buffer, "気分")or my_str2(buffer, "体調") && my_str2(buffer, "悪い")) {
  262.                 //  message = "どんな映画が好きなんですか?";
  263.                 //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  264.                 //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  265.                ranndamuz =  GetRand(1);
  266.                if(ranndamuz == 0){
  267.                    z = 7;//無理しないで、少し横になりましょう。
  268.                }
  269.                if (ranndamuz == 1) {
  270.                    z = 8;//大丈夫ですか?無理をし過ぎなのでは?
  271.                }
  272.                 ++mozicount;
  273.             }
  274.             if (ranndamuz == 1 && my_str2(buffer, "そう") && my_str2(buffer, "かも")) {
  275.                 //  message = "どんな映画が好きなんですか?";
  276.                 //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  277.                 //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  278.                
  279.                 if (ranndamuz == 1) {
  280.                     z = 9;//どうかゆっくり休んでください。
  281.                     ranndamuz = 0;//ranndamuzを0にする。
  282.                 }
  283.                 ++mozicount;
  284.             }
  285.             if ( my_str2(buffer, "はい")) {
  286.                 //  message = "どんな映画が好きなんですか?";
  287.                 //konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
  288.                 //PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
  289.  
  290.                     z = 10;//何かあればいつでも呼んでください。
  291.                  
  292.                 ++mozicount;
  293.             }
  294.             //★ここにこいつを書くとおはようと書かれなかった場合にz=4ということになってしまう。
  295.             //else {
  296.             //    z = 4;
  297.             //    ++mozicount;
  298.             //}
  299.             if (my_str2(buffer, "覚えて")) {
  300.                 // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  301.    //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
  302.                 memory = 1;
  303.                
  304.  
  305.             }
  306.            
  307.             //duration = 1;
  308.             // 再度インプットハンドルをアクティブにする
  309.             SetActiveKeyInput(InputHandle);
  310.             // 入力文字列を初期化する
  311.             SetKeyInputString("", InputHandle);
  312.  
  313.         }
  314.         //エンターキーが押されていないときでの処理
  315.         if (memory == 1) {
  316.             if (Key[KEY_INPUT_S] == 1) {
  317.              
  318.                // 入力された文字列を取得、その文字列を数値に変換
  319.                GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
  320.                //例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。このような変換をしたようなもの。
  321.                 FILE* file;                                     // ファイルポインタ(出力用)
  322.                 file = fopen("test.txt", "w");      // ファイルを書き込み用にオープン(開く)
  323.                 if (file == NULL) {                             // オープンに失敗した場合
  324.                     printf("ファイルが開けません。¥n");            // エラーメッセージを出して
  325.                     exit(1);                                    // 異常終了
  326.                 }
  327.                 /* 文字列の入力 */
  328.                 //printf("文字列を入力してください = ");
  329.                 //fgets(buffer, sizeof(256), stdin);
  330.  
  331.                 /* 入力した文字列をファイルに書き込む */
  332.                 fprintf(fp, "%s", buffer2);
  333.                 fclose(fp);
  334.  
  335.                  return 0;
  336.             }
  337.         }
  338.         //if (CheckKeyInput(InputHandle) == 0) {
  339.         //    z = 6;
  340.         //    ++mozicount;
  341.        // }
  342.  
  343.         //  DrawFormatString(100, 150, GetColor(255, 255, 0), "ProcessMessage()は%d,modoruは%d", ProcessMessage(), modoru);
  344.         DrawFormatString(0, 150, GetColor(255, 255, 0), "zは%d,konnnitiwaは%d,sitaidouは%d,mozicountは%d", z, konnnitiwa, sitaidou, mozicount);
  345.         DrawFormatString(0, 250, GetColor(255, 255, 0), "mozicount2は%d,input.c_str()は%d,  LEFTmarkは%d", mozicount2, input.c_str(), LEFTmark);
  346.         DrawFormatString(100, 100, GetColor(255, 255, 0), " gimonnlockは%d,memoryは%d, Skeyは%d", gimonnlock,memory, Skey);
  347.  
  348.      
  349.         //新しい言葉の処理
  350.  
  351.             //文字カウントが1の時
  352.         if (mozicount > 0) {
  353.             drawString(z, 10, 100, GetColor(5, 255, 255));
  354.  
  355.         }
  356.  
  357.  
  358.         // 裏画面の内容を表画面に反映させる
  359.         ScreenFlip();
  360.  
  361.  
  362.  
  363.  
  364.  
  365.     }
  366.  
  367.     // 用済みのインプットハンドルを削除する
  368.     DeleteKeyInput(InputHandle);
  369.  
  370.     // 画面の初期化
  371.     ClearDrawScreen();
  372.  
  373.     // 裏画面の内容を表画面に反映させる
  374.     ScreenFlip();
  375.  
  376.     // キー入力待ち
  377.    // WaitKey();
  378.  
  379.     //ループないやループから出た後で何かしらの問題が発生したら終了する。
  380.     // DXライブラリの使用終了
  381.     DxLib_End();
  382.  
  383.     // 終了
  384.     return 0;
  385. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement