Advertisement
Guest User

Untitled

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