まずこのソースコードで現状できている事としてはまずランダムでcsvの中にある文字列を呼び出し出力させて(ローマ字もセット)制限時間60秒までのカウントダウン、60秒経過すれば終了するというプログラムとなってます。
問題は、入力した部分を赤く塗りつぶし、間違ったところだけ青で出力して最後の文字列まで入力しきった瞬間次のお題に勝手に飛びたいのが理想で、60秒経過後、入力した数、間違って入力した数、秒間平均打数を出力したいと考えてますがどうにも上手く行かず困っています。
プログラム作るのは経験なくて初心者という立場になりますが、どういう風に改善するべきか何卒ご指摘ご指導のほどお願いします!
開発環境は
visualstudio2022 DXライブラリを使用したC++です。
/* ヘッダファイル ---------------------------------------------------------------------------- */
#include "DxLib.h"
/* 記号定数(マクロ) */
#define SIZE 30
/* エントリポイント -------------------------------------------------------------------------- */
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//ウィンドウモードを変更
ChangeWindowMode(TRUE);
//背景色を黒
SetBackgroundColor(0, 0, 0);
//DXライブラリ初期化処理
if (DxLib_Init() < 0) return -1;
//文字配列
char Disp_Char[SIZE][40]; //表示文字列
char Typing_Char[SIZE][30]; //打つ文字列
int Typing_Num[50];
const char mozi3[30] = { 'a','i','u','e','o','k','s','t','n','h','m','y','r','w','\0' }; //正解判定文字列
//表示させる文字データを読込む
int FileHandle;
FileHandle = FileRead_open(".\/data/01.表示文字.csv");
for (int i = 0; i < SIZE; i++) {
FileRead_gets(Disp_Char[i], 50, FileHandle);
}
FileRead_close(FileHandle);
FileRead_close(FileHandle);
FileHandle = FileRead_open(".\/data/03.打つ文字.csv");
for (int i = 0; i < SIZE; i++) {
FileRead_gets(Typing_Char[i], 50, FileHandle);
}
FileRead_close(FileHandle);
//表示
DrawString(0, 0, "J1 やさしい ゲームタイピング画面です。", GetColor(255, 255, 255));
DrawString(0, 20, "Escキー又はBackSpaceを押すとメニュー画面に戻ります。", GetColor(255, 255, 255));
DrawString(0, 40, "Spaceキーを押すとゲームが開始されます。", GetColor(255, 255, 255));
//スペースキーが押されるまで
while (1) {
if (CheckHitKey(KEY_INPUT_SPACE) == 1) {
break;
}
}
int Rand_Num = 0;
Rand_Num = GetRand(SIZE);
DATEDATA Date;
int StartTime;
//現在時刻の入手
GetDateTime(&Date);
//現在経過時間の入手
StartTime = GetNowCount();
//計測開始から60秒が過ぎるまでループ
while (GetNowCount() - StartTime < 60000)
{
//最初に表示される黒文字
SetFontSize(30);
DrawString(150, 200, Disp_Char[Rand_Num], GetColor(255, 255, 255));
DrawString(150, 250, Typing_Char[Rand_Num], GetColor(255, 255, 255));
char String[2];
char InputChar;
char mo;
int i = 0;
// 入力される文字を随時画面中央に描画します
while (1) {
String[1] = 0;
// ESCキーが押されるか、何らかの内部エラーが発生するまでループする
while (!ProcessMessage() && (CheckHitKey(KEY_INPUT_ESCAPE) == 0)) {
ClearDrawScreen();
//表示
SetFontSize(18);
DrawString(0, 0, "J1 やさしい ゲームタイピング画面です。", GetColor(255, 255, 255));
DrawFormatString(0, 60, GetColor(255, 255, 255), "残り:%d秒", (60000 - (GetNowCount() - StartTime)) / 1000);
//最初に表示される黒文字
SetFontSize(30);
DrawString(150, 200, Disp_Char[Rand_Num], GetColor(255, 255, 255));
DrawString(150, 250, Typing_Char[Rand_Num], GetColor(255, 255, 255));
//InputAnswerに格納されている答えの文字と比較して一致するまで入力させる
InputChar = GetInputChar(TRUE);
if (InputChar != 0 && InputChar >= CTRL_CODE_CMP) {
String[0] = InputChar;
String[1] = '\0';
if (String[0] == mozi3[i]) {
break;
}
}
//計測開始から60秒が過ぎるまでループ
if (GetNowCount() - StartTime > 60000) {
break;
}
}
//計測開始から60秒が過ぎるまでループ
if (GetNowCount() - StartTime > 60000) {
break;
}
//正しく打てた文字を描画(赤色に変更します)
DrawString(i * 100 + 50, 300, Disp_Char[i], GetColor(255, 0, 0));
DrawString(i * 100 + 70, 350, Typing_Char[i], GetColor(255, 0, 0));
//次の文字に移るため
//i++;
}
//WaitTimer(2000);
//WaitKey(); // キー入力待ち
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
}