Advertisement
Guest User

Untitled

a guest
Jun 30th, 2020
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.34 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.  
  18. char my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。
  19.  
  20. {
  21.     //s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。
  22.     const size_t a = strlen(s2);
  23.     //無限ループする。
  24.     for (;;) {
  25.         //関数memcmpの返り値が0の時は一致した時なので、==0とする。
  26.         if (memcmp(s1, s2, a) == 0)
  27.  
  28.             return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
  29. //入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
  30.         else if (*s1 == '\0')
  31.  
  32.             return 0;//入っていなかった
  33. //文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。
  34.         else
  35.  
  36.             ++s1;
  37.  
  38.     }
  39.  
  40. }
  41.  
  42.  
  43. int LEFTmark = 0;
  44. int memory = 0;
  45. std::string result;
  46. char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
  47. char buffer2[256];
  48. char input[256];
  49. char* p;
  50. FILE* outputfile;         // 出力ストリーム
  51. int hyouzi = 0;
  52.  
  53. std::string find_word(const std::string& file, const std::string& buffer) {
  54.     std::string result;
  55.     std::ifstream stream(file);
  56.     if (stream.is_open()) {
  57.         std::vector<std::string> lines;
  58.         std::string line;
  59.         // bufferを含む文字列の集合をlinesに求める
  60.         while (std::getline(stream, line)) {
  61.             if (line.find(buffer) != std::string::npos) {
  62.                 lines.push_back(line);
  63.             }
  64.         }
  65.         // linesが空でなければ、そのうちいずれかをデタラメに返す
  66.         if (!lines.empty()) {
  67.             std::random_device gen;
  68.             std::uniform_int_distribution<int> dist(0, lines.size() - 1);
  69.             result = lines.at(dist(gen));
  70.         }
  71.     }
  72.     return result;
  73. }
  74. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  75. {
  76.  
  77.  
  78.     SetGraphMode(1500, 780, 32);         // ウィンドウの大きさを指定
  79.     ChangeWindowMode(TRUE);             // 全画面ではなくウインドウを使用
  80.     // DXライブラリの初期化
  81.     if (DxLib_Init() == -1) return -1;
  82.     SetFontSize(42);                             //サイズを42に変更
  83.     // 描画先を裏にする
  84.     SetDrawScreen(DX_SCREEN_BACK);
  85.  
  86.     // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  87.     //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
  88.  
  89.     InputHandle = MakeKeyInput(150, FALSE, FALSE, FALSE); //これで総計150バイトの文字データを保持できる。
  90.  
  91.     // 作成したキー入力ハンドルをアクティブにする
  92.     SetActiveKeyInput(InputHandle);
  93.  
  94.     // キー入力終了待ちループ
  95.     // (ProcessMessageをループごとに行う)
  96.  
  97.     while (ProcessMessage() == 0)
  98.     {
  99.         // 画面の初期化
  100.         ClearDrawScreen();
  101.  
  102.  
  103.         //まずは描画する部分から作る。
  104.         // 入力モードを描画
  105.         DrawKeyInputModeString(640, 480);
  106.         // 入力途中の文字列を描画
  107.         DrawKeyInputString(0, 0, InputHandle);//InputHandleはint型とリファレンスに書いてあったんで
  108.  
  109.  
  110.         //その後にif文での分岐を考える。
  111.           // 入力が終了している場合は終了
  112.           //ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。
  113.          //エンターキーが押された時の部分。
  114.         if (CheckKeyInput(InputHandle) != 0) {
  115.             LEFTmark = 678;
  116.             hyouzi = 0;
  117.             gimon = 0;
  118.             ++mozicount;
  119.             // 入力された文字列を取得、その文字列を数値に変換
  120.             GetKeyInputString(buffer, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードに変換したものを上でchar型で定義したbufferに入れる。
  121.  
  122.             //覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。
  123.             if (memory == 0) {
  124.                 outputfile = fopen("da.txt", "r");  // ファイルを読み込み用にオープン(開く)
  125.                 if (outputfile == NULL) {          // オープンに失敗した場合
  126.                     printf("cannot open\n");         // エラーメッセージを出して
  127.                     exit(1);                         // 異常終了
  128.                 }
  129.                 //fgetsがNULLになるまで繰り返す
  130.          //fgets(str,256,lf)!=NULL
  131.          //と同じです。このように短縮することも可能
  132.                 //★bufferには文字入力の文字列を入れたので、ここにはメモからの文字列は入れられない。なので新しくbuffer2を作る。
  133.                 while ((p = fgets(buffer2, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer2の中に入れる。
  134.  
  135.                 {
  136.  
  137.  
  138.  
  139.                     // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
  140.                     if (my_str2(buffer, buffer2) == 0) {
  141.                         std::string result = find_word("da.txt", buffer);
  142.                         LEFTmark = 213;
  143.                         break;
  144.                      
  145.                     }
  146.  
  147.                     // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致しない文字が出てきた場合
  148.                     if (hyouzi == 0) {
  149.                         if (strcmp(buffer, buffer2) != NULL) {
  150.                             gimon = 1;
  151.                         }
  152.                     }
  153.  
  154.  
  155.                 }
  156.  
  157.                 fclose(outputfile);          // ファイルをクローズ(閉じる)
  158.  
  159.             }
  160.             //できればエンターキーを押して、次の文章を記憶できるようにしたかったが、文章には必ずと言っていいほど「は」や「とは」
  161.             //が入るし、定義のように覚えさせたいので「覚えて」の後に下のような条件で文章を記憶するようにさせた。
  162.             if (memory == 1 && my_str2(buffer, "とは") or memory == 1 && my_str2(buffer, "は") or memory == 1 && my_str2(buffer, "が")) {
  163.                 // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
  164.    //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
  165.  
  166.                 // 入力された文字列を取得、その文字列を数値に変換
  167.            //     GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
  168.                 ++mozicount;
  169.                 memory = 2;
  170.  
  171.             }
  172.             //duration = 1;
  173.             // 再度インプットハンドルをアクティブにする
  174.             SetActiveKeyInput(InputHandle);
  175.             // 入力文字列を初期化する
  176.             SetKeyInputString("", InputHandle);
  177.             //++mozicount;
  178.  
  179.         }
  180.  
  181.         //エンターキーが押されていないときでの処理
  182.         if (memory == 2) {
  183.             LEFTmark = 100;
  184.             //例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。//このような変換をしたようなもの。
  185.  
  186.  
  187.             outputfile = fopen("da.txt", "a+");  // ファイルを書き込み用にオープン(開く)
  188.             if (outputfile == NULL) {          // オープンに失敗した場合
  189.                 printf("cannot open\n");         // エラーメッセージを出して
  190.                 exit(1);                         // 異常終了
  191.             }
  192.  
  193.             fprintf(outputfile, "%s\n", buffer); // ファイルに書く
  194.  
  195.             fclose(outputfile);          // ファイルをクローズ(閉じる)
  196.  
  197.             //fclose(fp);//ファイルに書き込んだときにウィンドウが消えるようになっているので、memoryが1になった瞬間に書き込んでいるうんぬん以前に
  198.             //ファイルが閉じるのでウィンドウが消えてしまう。
  199.             memory = 0;
  200.             // return 0;//ここで0になると終了してしまうので書き込んだ後も言葉が打ち込めるようにここを消す。
  201.  
  202.         }
  203.      
  204.         //新しい言葉の処理
  205.  
  206.             //文字カウントが1の時
  207.        
  208.         if (p != NULL or hyouzi == 1) {
  209.  
  210.      
  211.             DrawFormatString(100, 500, GetColor(5, 105, 19), " buffer2は%s,resultは%s", buffer2, result.c_str());
  212.  
  213.  
  214.         }
  215.  
  216.         if (hyouzi == 0 && gimon == 1) {
  217.  
  218.             DrawFormatString(100, 600, GetColor(5, 105, 0), "申し訳ありません%sとは何ですか?", buffer);
  219.         }
  220.  
  221.         // 裏画面の内容を表画面に反映させる
  222.         ScreenFlip();
  223.  
  224.  
  225.  
  226.  
  227.  
  228.     }
  229.  
  230.     // 用済みのインプットハンドルを削除する
  231.     DeleteKeyInput(InputHandle);
  232.  
  233.     // 画面の初期化
  234.     ClearDrawScreen();
  235.  
  236.     // 裏画面の内容を表画面に反映させる
  237.     ScreenFlip();
  238.  
  239.     // キー入力待ち
  240.    // WaitKey();
  241.  
  242.     //ループないやループから出た後で何かしらの問題が発生したら終了する。
  243.     // DXライブラリの使用終了
  244.     DxLib_End();
  245.  
  246.     // 終了
  247.     return 0;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement