その後も「覚えて」を繰り返し、違うコメントを増やしていきます。
その後で、buffer2に読み込んだメモの文章から「映画」と含まれた文章を画面に表示したいです。
しかし、この表示したい部分がうまく解決できずにいます。
// 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
if (strcmp(buffer, buffer2)==1) {
hyouzi = 1;
}
実際に「覚えて」を繰り返し、違うコメントを増やしてから、「映画」と打ち込んでエンターキーを押すと、
if (p != NULL or hyouzi == 1) {
DrawFormatString(100, 500, GetColor(5, 105, 19), " buffer2は%s", buffer2);
どうか今回の問題を解決するためのデバッグの方法と何が原因なのか教えて頂けないでしょうか。
#pragma warning(disable: 4996)
#include "DxLib.h"
#include <string>
char String[256];
int InputHandle;
int InputHandleA;
int modoru = 0;
int mozicount = 0;
int gimonnlock = 0;
int gimon = 0;
int my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。
{
//s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。
const size_t a = strlen(s2);
//無限ループする。
for (;;) {
//関数memcmpの返り値が0の時は一致した時なので、==0とする。
if (memcmp(s1, s2, a) == 0)
return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
//入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
else if (*s1 == '\0')
return 0;//入っていなかった
//文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。
else
++s1;
}
}
int rireki = 0;
int rireki2 = 0;
int LEFTmark = 0;
const char* str[100] = {
"はい!","はい!大好きです!!あなたはどんな映画が好きですか? " ,"そうですね、、、私は恋愛映画が好きです!",
"人間観察が好きだからかもしれません。","申し訳ありません。わかりません。" ,"おはようございます。今日は何をなさるんですか?"
,"そうですか。体を動かしたり外に出てみてはいかがですか?" ,"無理しないで、少し横になりましょう。" ,"大丈夫ですか?無理をしすぎでは?"
,"どうかゆっくり休んでください","何かあればいつでも呼んでください。","何を覚えますか?" };//ここで文字を直接書いてるので、この文字のバイト数が各posmozi[]に入るだけ
int frame[100] = { 10,10 ,10,10,10,10,10,10,10 ,10,10 ,10};//次の一文字が出るまでのカウンタとして働いている、ここの数値を変えることで文字が一文字ずつ出るまでの間隔を設定できる。
int posmozi[100];//文字のバイト数が入る箱を表している。
int countS[100];//次の文字が出るまでのカウントするためのもの
int z;//関数drawString外でも使えるように外にも定義を書いた。zの数値は関係なく、文字列が入った数列がif文により同じ変数zの時にframe[z]と同じになるまで+1されていったり、+2バイトor+1バイトされていくため、
//文字が一文字ずつ入っていく、なんでzの変数に値を入れて動かす必要がないのだ。ちなみにfor (z = 0; z < 3; ++z)で書いてしまうとキーAを押した際のif文に関係なく関数drawStringの最初のzどこかに値が入っただけで繰り返しを開始してしまうため、今回のように同じ変数zの時にフレームを利用して描画するようにした。
char c = str[z][posmozi[z]];//関数drawString外でも使えるように外にも定義を書いた。
void drawString(int z, int x, int y, int color)
{
c = str[z][posmozi[z]];//posmozi[z]
if (countS[z] == 0 && c != '\0')
posmozi[z] += IsDBCSLeadByte(c) ? 2 : 1;
if (++countS[z] == frame[z]) countS[z] = 0;
DrawFormatString(x, y, color, "%.*s", posmozi[z], str[z]);
DrawFormatString(300, 300, (0, 0, 255), "countS[0]は%d", countS[0]);
}
int memory = 0;
int Skey = 0;
const int PAD_DOWN = 0;
char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
char buffer2[256];
char* p;
FILE* outputfile; // 出力ストリーム
int hyouzi = 0;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
SetGraphMode(1500, 780, 32); // ウィンドウの大きさを指定
ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用
// DXライブラリの初期化
if (DxLib_Init() == -1) return -1;
SetFontSize(42); //サイズを42に変更
// 描画先を裏にする
SetDrawScreen(DX_SCREEN_BACK);
// キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
//MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
InputHandle = MakeKeyInput(150, FALSE, FALSE, FALSE); //これで総計150バイトの文字データを保持できる。
// 作成したキー入力ハンドルをアクティブにする
SetActiveKeyInput(InputHandle);
// キー入力終了待ちループ
// (ProcessMessageをループごとに行う)
while (ProcessMessage() == 0)
{
// 画面の初期化
ClearDrawScreen();
//まずは描画する部分から作る。
// 入力モードを描画
DrawKeyInputModeString(640, 480);
// 入力途中の文字列を描画
DrawKeyInputString(0, 0, InputHandle);//InputHandleはint型とリファレンスに書いてあったんで
//その後にif文での分岐を考える。
// 入力が終了している場合は終了
//ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。
//エンターキーが押された時の部分。
if (CheckKeyInput(InputHandle) != 0) {
LEFTmark = 678;
hyouzi = 0;
gimon = 0;
++mozicount;
// 入力された文字列を取得、その文字列を数値に変換
GetKeyInputString(buffer, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードに変換したものを上でchar型で定義したbufferに入れる。
if (my_str2(buffer, "覚えて")) {
// キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
//MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
z = 11;
// 入力された文字列を取得、その文字列を数値に変換
// GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
++mozicount;
memory = 1;
gimon = 0;
}
//覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。
else if(memory == 0){
outputfile = fopen("da.txt", "r"); // ファイルを読み込み用にオープン(開く)
if (outputfile == NULL) { // オープンに失敗した場合
printf("cannot open\n"); // エラーメッセージを出して
exit(1); // 異常終了
}
//fgetsがNULLになるまで繰り返す
//fgets(str,256,lf)!=NULL
//と同じです。このように短縮することも可能
//★bufferには文字入力の文字列を入れたので、ここにはメモからの文字列は入れられない。なので新しくbuffer2を作る。
while ((p = fgets(buffer2, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer2の中に入れる。
{
if (my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "どんな") && my_str2(buffer, "?") ||
my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "?")) {
// message = "どんな映画が好きなんですか?";
// DrawFormatString(100, 300, GetColor(255, 255, 0), "%s", buffer);
++mozicount;
gimonnlock = 1;
if (my_str2(buffer2, "映画")) {
LEFTmark = 893;
if (((strstr(buffer2, buffer))) != NULL) { //映画という言葉に反応はしているが、その後のメモの文章を特定の文章を描画する部分がない。
LEFTmark = 893893;
z = 5;
}
}
}
//★ここにこいつを書くとおはようと書かれなかった場合にz=4ということになってしまう。
//else {
// z = 4;
// ++mozicount;
//}
/* 配列の要素を出力 */
//inputに入った文字のデータを数値化するために input.c_str()を定義して、下のif文に使った。
//変数inputに入る前はchar型のbufferに文字列が入るので、my_str2はchar*型を引数にとるため、char*型は文字列を定義するので、
//関数my_str2にはそのまま文字列が使えるので、その文字列が入っているbufferを直接書いた。
// 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
if (strcmp(buffer, buffer2)==1) {
hyouzi = 1;
}
// 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致しない文字が出てきた場合
if (hyouzi == 0) {
if (strcmp(buffer, buffer2) != NULL) {
gimon = 1;
}
}
}
fclose(outputfile); // ファイルをクローズ(閉じる)
}
//できればエンターキーを押して、次の文章を記憶できるようにしたかったが、文章には必ずと言っていいほど「は」や「とは」
//が入るし、定義のように覚えさせたいので「覚えて」の後に下のような条件で文章を記憶するようにさせた。
if (memory == 1 && my_str2(buffer, "とは")or memory == 1 && my_str2(buffer, "は")or memory == 1 && my_str2(buffer, "が")) {
// キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
//MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
// 入力された文字列を取得、その文字列を数値に変換
// GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
++mozicount;
memory = 2;
}
//duration = 1;
// 再度インプットハンドルをアクティブにする
SetActiveKeyInput(InputHandle);
// 入力文字列を初期化する
SetKeyInputString("", InputHandle);
//++mozicount;
}
//エンターキーが押されていないときでの処理
if (memory == 2) {
LEFTmark = 100;
//例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。//このような変換をしたようなもの。
outputfile = fopen("da.txt", "w+"); // ファイルを書き込み用にオープン(開く)
if (outputfile == NULL) { // オープンに失敗した場合
printf("cannot open\n"); // エラーメッセージを出して
exit(1); // 異常終了
}
fprintf(outputfile, "%s\n", buffer); // ファイルに書く
fclose(outputfile); // ファイルをクローズ(閉じる)
//fclose(fp);//ファイルに書き込んだときにウィンドウが消えるようになっているので、memoryが1になった瞬間に書き込んでいるうんぬん以前に
//ファイルが閉じるのでウィンドウが消えてしまう。
memory = 0;
// return 0;//ここで0になると終了してしまうので書き込んだ後も言葉が打ち込めるようにここを消す。
}
//if (CheckKeyInput(InputHandle) == 0) {
// z = 6;
// ++mozicount;
// }
// DrawFormatString(100, 150, GetColor(255, 255, 0), "ProcessMessage()は%d,modoruは%d", ProcessMessage(), modoru);
DrawFormatString(0, 150, GetColor(255, 255, 0), "mozicountは%d,zは%d", mozicount,z);
DrawFormatString(0, 250, GetColor(255, 255, 0), " LEFTmarkは%d",LEFTmark);
DrawFormatString(100, 100, GetColor(255, 255, 0), " gimonnlockは%d,memoryは%d, Skeyは%d", gimonnlock, memory, Skey);
DrawFormatString(100, 300, GetColor(255, 255, 0), "bufferは%s", buffer);
DrawFormatString(100, 400, GetColor(5, 105, 0), "gimonは%d,hyouziは%d", gimon, hyouzi);
//新しい言葉の処理
//文字カウントが1の時
if (mozicount > 0) {
drawString(z, 10, 100, GetColor(5, 255, 255));
}
if (p != NULL or hyouzi == 1) {
DrawFormatString(100, 500, GetColor(5, 105, 19), " buffer2は%s", buffer2);
}
if (hyouzi == 0 && gimon == 1) {
DrawFormatString(100, 600, GetColor(5, 105, 0), "申し訳ありません%sとは何ですか?", buffer);
}
// 裏画面の内容を表画面に反映させる
ScreenFlip();
}
// 用済みのインプットハンドルを削除する
DeleteKeyInput(InputHandle);
// 画面の初期化
ClearDrawScreen();
// 裏画面の内容を表画面に反映させる
ScreenFlip();
// キー入力待ち
// WaitKey();
//ループないやループから出た後で何かしらの問題が発生したら終了する。
// DXライブラリの使用終了
DxLib_End();
// 終了
return 0;
}