Guest User

Untitled

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