Skip to main content

第5回 HITとBLOW判定の移植

第5回 HITとBLOWを判定しよう

前回は、数字ボタンをクリックして4桁を入力できるようにしました。

現在は、4桁を入力しても判定ボタンが反応しません。

今回は、判定ボタンをクリックしたときに、

入力内容を確認する
        ↓
HIT数とBLOW数を求める
        ↓
結果またはエラーを画面へ表示する

ところまで作ります。

この回は、第4回終了時点のmain.cppから作業を始めます。


このページの進め方

このページでは、読む部分とソースを書き換える部分を分けています。

説明
    仕組みを確認する

STEP ○ ここでソースを書き換える!
    main.cppを実際に変更する

動作確認
    ビルドして実行する

STEPを上から順番に進めてください。
詳しい仕組みは、各STEPの前後にある説明で確認できます。

ソースを書き換える場所は、コード内のここから追加ここを変更この部分を削除などのコメントで示します。


1.今回の完成状態

今回のプログラムでは、次の操作ができるようになります。

  • 4桁入力して判定ボタンを押す
  • 正しい入力ならHIT数とBLOW数が表示される
  • 4桁未満ならエラーが表示される
  • 同じ数字を含む場合はエラーが表示される
  • 入力を変更すると、前回の結果やエラーが消える
  • 4 HITでも、まだ画面は切り替わらない

クリア画面への切り替えは、第7回で作ります。


2.判定ボタンを押した後の処理

判定ボタンを押すと、まず入力した内容にエラーがないか確認します。

判定を始める前に、前回の結果が残らないようにhitblow0hasResultfalseに戻します。

入力の状態 処理
エラーあり HITとBLOWは数えず、判定結果も表示しない
エラーなし HIT数とBLOW数を数え、hasResulttrueにする

つまり、入力にエラーがなかったときだけHITとBLOWを判定する処理です。


STEP 1 ここでソースを書き換える!

変更する場所hitblowの下
確認すること:エラーなくビルドできること

追加するコード

hasResultは、hitblowの直後へ追加します。

変数を追加すると、次のようになります。

// 判定結果
int hit;
int blow;

// ここに追加
// 判定結果を表示できる状態か
bool hasResult;

hasResultは、次の意味で使います。

意味
false まだ正常な判定結果はない
true HIT数とBLOW数を表示できる

判定が終わったら、次の4桁を入力できるようにinputを空にします。

ClearInputも変更する

入力を消したときは、以前の判定結果も消します。

ClearInput()の最後へ、hasResult = false;を追加します。変更箇所は下のコメントで確認します。

// 入力中の4桁をすべて消す
void ClearInput(void)
{
    inputCount = 0;
    input[0] = '\0';

    inputError = 0;
    hit = 0;
    blow = 0;

    // ここに追加
    hasResult = false;
}

STEP 2 ここでソースを書き換える!

変更する場所ClearInput()の下
確認すること:エラーなくビルドできること

追加する関数

// ここから関数を追加
// 入力内容を確認し、HIT数とBLOW数を求める
void JudgeInput(void)
{
    // 入力内容のエラー番号を受け取る
    inputError = CheckAnswerError(input);

    // 以前の判定結果をいったん消す
    hit = 0;
    blow = 0;
    hasResult = false;

    // 入力内容に問題がない場合だけ判定する
    if (inputError == 0)
    {
        hit = CountHit(answer, input);

        blow = CountBlow(answer, input);

        hasResult = true;
    }
}
// ここまで関数を追加

3.エラー番号を確認する

CheckAnswerError()の戻り値は、次の意味でした。

戻り値 意味 表示メッセージ その後の処理
0 問題なし HIT・BLOWを判定する
1 4桁ではない 4桁入力してください HIT・BLOWは判定しない
2 数字以外を含む 数字だけを入力してください HIT・BLOWは判定しない
3 同じ数字を使っている 同じ数字を使わないでください HIT・BLOWは判定しない
戻り値 意味
0 入力に問題なし
1 4桁ではない
2 数字以外を含む
3 同じ数字を含む

今回の入力は数字ボタンから行うため、通常はエラー2になりません。

それでも、コンソール版のCheckAnswerError()をそのまま再利用するため、エラー2の処理も残します。


STEP 3 ここでソースを書き換える!

変更する場所Update()内で数字をinputへ追加している場所
確認すること:エラーなくビルドできること

Update()の中で、数字を追加して文字列末尾へ\0を入れた直後を、下のコメント付きコードへ変更します。

// ここから変更
input[inputCount] = '\0';

// 入力を変更したので、
// 前回のエラーや判定結果を消す
inputError = 0;
hit = 0;
blow = 0;
hasResult = false;
// ここまで変更

なぜ入力時に消すのか

たとえば、3桁で判定すると「4桁入力してください」と表示されます。

その後4桁目を入力しても、古いエラーが残ったままだと分かりにくくなります。

入力を変更した
    ↓
古い判定結果は現在の入力に合わない
    ↓
結果とエラーを消す

STEP 4 ここでソースを書き換える!

変更する場所Update()内の数字ボタン判定の後
確認すること:エラーなくビルドできること

Update()の中には、数字ボタンを調べるfor文があります。

そのfor文が終わった後へ、次の判定ボタンの処理を追加します。

// ここから追加
// 判定ボタンをクリックしたか
if (IsPointInRect(
    mouseX,
    mouseY,
    JUDGE_BUTTON_X,
    JUDGE_BUTTON_Y,
    JUDGE_BUTTON_X + JUDGE_BUTTON_WIDTH,
    JUDGE_BUTTON_Y + JUDGE_BUTTON_HEIGHT))
{
    JudgeInput();
}
// ここまで追加

判定ボタンをクリックすると判定処理が動くようになったので、Draw()のコメントも処理内容に合わせて変更します。

// このコメントを変更
// 判定ボタンを表示する
DrawGraph(JUDGE_BUTTON_X, JUDGE_BUTTON_Y, judgeImage, TRUE);

追加する位置は次のとおりです。

数字ボタンを調べるfor文
        ↓
ここへ判定ボタンの処理を追加
        ↓
leftClickedの処理が終わる
        ↓
右クリックならClearInput()

判定範囲

描画と同じ定数を使用します。

左端:JUDGE_BUTTON_X
上端:JUDGE_BUTTON_Y
右端:JUDGE_BUTTON_X + JUDGE_BUTTON_WIDTH
下端:JUDGE_BUTTON_Y + JUDGE_BUTTON_HEIGHT

画像の表示位置とクリック判定の位置がずれないようにします。


4.UpdateとDrawの役割を分ける

判定はUpdate()で行って変数へ保存し、Draw()では保存された結果だけを表示します。

関数 役割 主な処理
Update() ゲームの状態を更新する 判定ボタンのクリックを確認する、入力内容を確認する、HIT・BLOWを数える、結果を変数へ保存する
Draw() 現在の状態を画面へ表示する inputErrorhitblowhasResultを確認し、判定結果やエラーメッセージを表示する

Draw()の中でHITやBLOWを数え直しません。


STEP 5 ここでソースを書き換える!

変更する場所Draw()内の「判定は次回作ります」という表示
確認すること:判定ボタンが完成する

Draw()の中から、次の処理を探します。

// この部分を削除
DrawString(40, 245, "HITとBLOWの判定は次回作ります。", gray);

この処理を削除し、次の処理へ置き換えます。

// ここから変更
// 正しく判定できた場合はHIT数とBLOW数を表示する
if (hasResult)
{
    DrawFormatString(40, 245, white, "HIT :%d", hit);

    DrawFormatString(40, 275, white, "BLOW:%d", blow);
}
// 入力に問題がある場合は、
// エラー番号に対応したメッセージを表示する
else if (inputError == 1)
{
    DrawString(40, 245, "4桁入力してください。", red);
}
else if (inputError == 2)
{
    DrawString(40, 245, "0~9の数字だけを入力してください。", red);
}
else if (inputError == 3)
{
    DrawString(40, 245, "同じ数字を2回使わないでください。", red);
}
// ここまで変更

表示の決め方

▲ hasResult = true
|・HIT数とBLOW数を表示する
+---------
|▲ inputError ≠ 0
||・inputErrorに対応するエラーメッセージを表示する
|▼
▼

5.HITとBLOWの判定関数

HITとBLOWの数え方は第2回で移したCountHit()CountBlow()をそのまま使用します。ここでは書き直しません。


6.ShowInputErrorを移さなかった理由

コンソール版のShowInputError()は関数内でprintf()していました。
DxLib版では、JudgeInput()でエラー番号をinputErrorへ保存し、Draw()で対応するメッセージを表示します。


7.ここまで正しく動くか確認しよう

Ctrl + F5で実行し、次の順番で確認します。

確認1 4桁未満

  1. 数字を3桁だけ入力する
  2. 判定ボタンを押す
  3. 次のメッセージが表示されることを確認する
4桁入力してください。

4桁目を追加したとき、古いエラーが消えることも確認します。

確認2 同じ数字

  1. 「入力を消す」を押す
  2. 1123と入力する
  3. 判定ボタンを押す
  4. 次のメッセージが表示されることを確認する
同じ数字を2回使わないでください。

確認3 正しい4桁

  1. 「入力を消す」を押す
  2. 重複しない4桁を入力する
  3. 判定ボタンを押す
  4. HIT数とBLOW数が表示されることを確認する
HIT :○
BLOW:○

確認4 4 HIT

デバッグ用正解として表示されている4桁を入力します。

HIT :4
BLOW:0

と表示されれば判定成功です。

この時点ではクリア画面へ移動しません。


8.うまく動かない場合

判定ボタンを押しても何も表示されない

次を確認します。

  • 判定ボタンのクリック処理をleftClickedの中へ書いたか
  • JudgeInput()を呼び出しているか
  • Draw()へ結果表示を追加したか

4桁未満でもHITとBLOWが表示される

JudgeInput()で、inputError == 0の場合だけCountHit()CountBlow()を呼んでいるか確認します。

if (inputError == 0)
{
    hit = CountHit(answer, input);

    blow = CountBlow(answer, input);

    hasResult = true;
}

入力を変えても古い結果が残る

数字を追加した直後に、次の処理があるか確認します。

inputError = 0;
hit = 0;
blow = 0;
hasResult = false;

入力を消しても結果が残る

ClearInput()の最後に、次の1行があるか確認します。

hasResult = false;

9.プログラム全体

ここまでの内容をすべて入れたmain.cppは、次のようになります。

#include "DxLib.h"

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 画面の大きさ
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;

// ゲーム内部を1秒間に更新する回数
const int UPDATE_FPS = 60;

// Update1回分の時間
const double FIXED_DELTA_TIME = 1.0 / UPDATE_FPS;

// 長時間処理が止まった場合に、
// 一度に処理する経過時間の上限
const double MAX_FRAME_TIME = 0.25;

// HIT&BLOWで使用する数字の数
const int NUMBER_COUNT = 10;

// 入力する桁数
const int INPUT_DIGIT_COUNT = 4;

// 入力欄の配置
const int INPUT_START_X = 50;
const int INPUT_START_Y = 110;
const int INPUT_IMAGE_SIZE = 80;
const int INPUT_IMAGE_GAP = 10;

// 数字ボタンの配置
const int NUMBER_BUTTON_START_X = 30;
const int NUMBER_BUTTON_START_Y = 335;
const int NUMBER_BUTTON_SIZE = 70;
const int NUMBER_BUTTON_GAP = 8;
const int NUMBER_BUTTON_COLUMNS = 5;

// 判定ボタンの配置
const int JUDGE_BUTTON_X = 120;
const int JUDGE_BUTTON_Y = 510;
const int JUDGE_BUTTON_WIDTH = 200;
const int JUDGE_BUTTON_HEIGHT = 46;


// ゲームの正解
char answer[5];

// プレイヤーの入力
char input[5];

// 現在入力されている桁数
int inputCount;

// 入力内容のエラー番号
int inputError;

// 判定結果
int hit;
int blow;
// ===== 【第5回で追加・変更】判定結果を表示できる状態か保存 ここから =====

// 判定結果を表示できる状態か
bool hasResult;
// ===== 【第5回で追加・変更】判定結果を表示できる状態か保存 ここまで =====

// マウスカーソルの座標
int mouseX;
int mouseY;

// 1回前のUpdateで取得したマウス状態
int previousMouseInput;

// 0~9の数字ボタン画像
int numberImages[NUMBER_COUNT];

// 入力欄へ表示する0~9の画像
int displayNumberImages[NUMBER_COUNT];

// 未入力の桁に表示する画像
int blankImage;

// 判定ボタン画像
int judgeImage;

// 画像の読み込み結果
int imageLoadError;


// 重複しない4桁の問題を作る
void MakeProblem(char outputAnswer[5])
{
    char temp[] = "0123456789";
    int i;

    for (i = 0; i < 100; i++)
    {
        int index1 = rand() % 10;
        int index2 = rand() % 10;
        char work;

        work = temp[index1];
        temp[index1] = temp[index2];
        temp[index2] = work;
    }

    for (i = 0; i < 4; i++)
    {
        outputAnswer[i] = temp[i];
    }

    outputAnswer[4] = '\0';
}

// 入力内容に問題がないか確認する
int CheckAnswerError(char inputData[])
{
    int i;
    int j;

    // 4桁か確認する
    if (strlen(inputData) != 4)
    {
        return 1;
    }

    // すべて数字か確認する
    for (i = 0; i < 4; i++)
    {
        if (!isdigit((unsigned char)inputData[i]))
        {
            return 2;
        }
    }

    // 同じ数字が含まれていないか確認する
    for (i = 0; i < 4; i++)
    {
        for (j = i + 1; j < 4; j++)
        {
            if (inputData[i] == inputData[j])
            {
                return 3;
            }
        }
    }

    return 0;
}

// HIT数を数える
int CountHit(char correctAnswer[], char inputData[])
{
    int count = 0;
    int i;

    for (i = 0; i < 4; i++)
    {
        if (correctAnswer[i] == inputData[i])
        {
            count++;
        }
    }

    return count;
}

// BLOW数を数える
int CountBlow(char correctAnswer[], char inputData[])
{
    int count = 0;
    int i;
    int j;

    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            if (inputData[i] == correctAnswer[j] && i != j)
            {
                count++;
            }
        }
    }

    return count;
}

// ゲームで使用する画像を読み込む
int LoadGameImages(void)
{
    char fileName[64];
    int i;

    // 0~9の画像を読み込む
    for (i = 0; i < NUMBER_COUNT; i++)
    {
        // 青い数字ボタンのファイル名を作る
        sprintf_s(fileName, sizeof(fileName), "images/%d.png", i);

        numberImages[i] = LoadGraph(fileName);

        if (numberImages[i] == -1)
        {
            return 1;
        }

        // 緑色の数字画像のファイル名を作る
        sprintf_s(fileName, sizeof(fileName), "images/%d%d.png", i, i);

        displayNumberImages[i] = LoadGraph(fileName);

        if (displayNumberImages[i] == -1)
        {
            return 1;
        }
    }

    // 未入力の桁に表示する画像を読み込む
    blankImage = LoadGraph("images/kome.png");

    if (blankImage == -1)
    {
        return 1;
    }

    // 判定ボタン画像を読み込む
    judgeImage = LoadGraph("images/judge.png");

    if (judgeImage == -1)
    {
        return 1;
    }

    return 0;
}

// 点が長方形の中にあるか調べる
bool IsPointInRect(int pointX, int pointY, int left, int top, int right, int bottom)
{
    return left <= pointX && pointX < right && top <= pointY && pointY < bottom;
}

// 入力中の4桁をすべて消す
// ===== 【第5回で追加・変更】入力消去を調整しJudgeInput()を追加 ここから =====
void ClearInput(void)
{
    inputCount = 0;
    input[0] = '\0';

    inputError = 0;
    hit = 0;
    blow = 0;
    hasResult = false;
}

// 入力内容を確認し、HIT数とBLOW数を求める
void JudgeInput(void)
{
    // 入力内容のエラー番号を受け取る
    inputError = CheckAnswerError(input);

    // 以前の判定結果をいったん消す
    hit = 0;
    blow = 0;
    hasResult = false;

    // 入力内容に問題がない場合だけ判定する
    if (inputError == 0)
    {
        hit = CountHit(answer, input);

        blow = CountBlow(answer, input);

        hasResult = true;
    }
// ===== 【第5回で追加・変更】入力消去を調整しJudgeInput()を追加 ここまで =====
}

// ゲーム開始時に1回だけ実行する
void Initialize(void)
{
    // 実行するたびに乱数の並びを変える
    srand((unsigned int)time(NULL));

    // 重複しない4桁の問題を作る
    MakeProblem(answer);

    ClearInput();

    mouseX = 0;
    mouseY = 0;
    previousMouseInput = 0;

    SetMouseDispFlag(TRUE);

    // ゲームで使用する画像を読み込む
    imageLoadError = LoadGameImages();

}

// 入力確認とゲームの更新を行う
void Update(void)
{
    int mouseInput;
    bool leftClicked;
    bool rightClicked;

    // 現在のマウス座標を取得する
    GetMousePoint(&mouseX, &mouseY);

    // 現在のマウスボタン状態を取得する
    mouseInput = GetMouseInput();

    // 左クリックした瞬間を求める
    leftClicked = (mouseInput & MOUSE_INPUT_LEFT) != 0 && (previousMouseInput & MOUSE_INPUT_LEFT) == 0;

    // 右クリックした瞬間を求める
    rightClicked = (mouseInput & MOUSE_INPUT_RIGHT) != 0 && (previousMouseInput & MOUSE_INPUT_RIGHT) == 0;

    if (leftClicked)
    {
        int i;

        // 0~9の数字ボタンを順番に調べる
        for (i = 0; i < NUMBER_COUNT; i++)
        {
            int column;
            int row;
            int x;
            int y;

            column = i % NUMBER_BUTTON_COLUMNS;

            row = i / NUMBER_BUTTON_COLUMNS;

            x = NUMBER_BUTTON_START_X + column * (NUMBER_BUTTON_SIZE + NUMBER_BUTTON_GAP);

            y = NUMBER_BUTTON_START_Y + row * (NUMBER_BUTTON_SIZE + NUMBER_BUTTON_GAP);

            if (IsPointInRect(mouseX, mouseY, x, y, x + NUMBER_BUTTON_SIZE, y + NUMBER_BUTTON_SIZE))
            {
                // 4桁未満なら数字を追加する
                if (inputCount < INPUT_DIGIT_COUNT)
                {
                    input[inputCount] = (char)('0' + i);

                    inputCount++;

                    input[inputCount] = '\0';
// ===== 【第5回で追加・変更】判定ボタンからJudgeInput()を呼び出す ここから =====

                    // 入力を変更したので、
                    // 前回のエラーや判定結果を消す
                    inputError = 0;
                    hit = 0;
                    blow = 0;
                    hasResult = false;
                }

                break;
            }
        }

        // 判定ボタンをクリックしたか
        if (IsPointInRect(
            mouseX,
            mouseY,
            JUDGE_BUTTON_X,
            JUDGE_BUTTON_Y,
            JUDGE_BUTTON_X + JUDGE_BUTTON_WIDTH,
            JUDGE_BUTTON_Y + JUDGE_BUTTON_HEIGHT))
        {
            JudgeInput();
// ===== 【第5回で追加・変更】判定ボタンからJudgeInput()を呼び出す ここまで =====
        }

    }

    // 右クリックしたら入力中の数字をすべて消す
    if (rightClicked)
    {
        ClearInput();
    }

    // 今回の状態を次回の比較用に保存する
    previousMouseInput = mouseInput;
}

// ゲーム画面を描画する
void Draw(void)
{
    unsigned int white = GetColor(255, 255, 255);

    unsigned int yellow = GetColor(255, 255, 0);

    unsigned int red = GetColor(255, 80, 80);

    unsigned int gray = GetColor(160, 160, 160);

    // ゲームタイトルを表示する
    DrawString(40, 25, "HIT & BLOW", white);

    // 完成時には削除する正解表示
    DrawFormatString(40, 55, yellow, "デバッグ用正解:%s", answer);

    // 画像の読み込みに失敗していた場合
    if (imageLoadError != 0)
    {
        DrawString(40, 110, "画像を読み込めませんでした。", red);

        DrawString(40, 140, "imagesフォルダーの場所を確認してください。", red);

        return;
    }

    DrawString(40, 85, "数字を4桁入力してください", white);

    // 4桁の入力欄を描画する
    for (int i = 0; i < INPUT_DIGIT_COUNT; i++)
    {
        int x;
        int imageHandle;

        // i番目の桁を表示するX座標
        x = INPUT_START_X + i * (INPUT_IMAGE_SIZE + INPUT_IMAGE_GAP);

        // 未入力の場合に表示する画像
        imageHandle = blankImage;

        // 入力済みで、数字が入っている場合
        if (i < inputCount)
        {
            int number;

            // 文字の数字を整数へ変換する
            number = input[i] - '0';

            // 対応する緑色の数字画像を選ぶ
            imageHandle = displayNumberImages[number];
        }

        // 入力欄の画像を80×80で表示する
        DrawGraph(x, INPUT_START_Y, imageHandle, TRUE);
    }

    DrawFormatString(40, 215, white, "入力:%s", input);

    // ===== 【第5回で追加・変更】HIT・BLOWまたは入力エラーを表示 ここから =====
    // 正しく判定できた場合はHIT数とBLOW数を表示する
    if (hasResult)
    {
        DrawFormatString(40, 245, white, "HIT :%d", hit);

        DrawFormatString(40, 275, white, "BLOW:%d", blow);
    }
    // 入力に問題がある場合は、
    // エラー番号に対応したメッセージを表示する
    else if (inputError == 1)
    {
        DrawString(40, 245, "4桁入力してください。", red);
    }
    else if (inputError == 2)
    {
        DrawString(40, 245, "0~9の数字だけを入力してください。", red);
    }
    else if (inputError == 3)
    {
        DrawString(40, 245, "同じ数字を2回使わないでください。", red);
    }
    // ===== 【第5回で追加・変更】HIT・BLOWまたは入力エラーを表示 ここまで =====

    DrawString(40, 300, "数字ボタン", white);

    // 0~9の数字ボタンを描画する
    for (int i = 0; i < NUMBER_COUNT; i++)
    {
        int column;
        int row;
        int x;
        int y;

        // 5個ずつ並べるための列と行を求める
        column = i % NUMBER_BUTTON_COLUMNS;

        row = i / NUMBER_BUTTON_COLUMNS;

        // 列と行から画面座標を求める
        x = NUMBER_BUTTON_START_X + column * (NUMBER_BUTTON_SIZE + NUMBER_BUTTON_GAP);

        y = NUMBER_BUTTON_START_Y + row * (NUMBER_BUTTON_SIZE + NUMBER_BUTTON_GAP);

        // 数字ボタンを70×70で表示する
        DrawGraph(x, y, numberImages[i], TRUE);
    }

    // 判定ボタンを表示する
    DrawGraph(JUDGE_BUTTON_X, JUDGE_BUTTON_Y, judgeImage, TRUE);

    // 右クリックで入力を消せることを表示する
    DrawString(330, 525, "右クリック:入力を消す", gray);

    // マウス座標をデバッグ表示する
    DrawFormatString(500, 35, gray, "マウス:(%d, %d)", mouseX, mouseY);

    DrawString(480, 85, "右側は第6回で", gray);

    DrawString(480, 115, "解答履歴に使います。", gray);
}

// Update1回分の時間を秒で返す
double DeltaTime(void)
{
    return FIXED_DELTA_TIME;
}

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    LONGLONG previousTime;
    double accumulator;

    // ウィンドウモードで起動する
    ChangeWindowMode(TRUE);

    // 画面の大きさを設定する
    SetGraphMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32);

    // ScreenFlipで垂直同期を待つ
    SetWaitVSyncFlag(TRUE);

    // DxLibを初期化する
    if (DxLib_Init() == -1)
    {
        return -1;
    }

    // 描画先を裏画面にする
    SetDrawScreen(DX_SCREEN_BACK);

    // ゲームを初期化する
    Initialize();

    // 時間計測を開始する
    previousTime = GetNowHiPerformanceCount();

    // まだUpdateで処理していない時間
    accumulator = 0.0;

    // ゲームループ
    while (ProcessMessage() == 0)
    {
        LONGLONG currentTime;
        double frameTime;

        // ESCキーが押されたら終了する
        if (CheckHitKey(KEY_INPUT_ESCAPE) != 0)
        {
            break;
        }

        // 現在時刻を取得する
        currentTime = GetNowHiPerformanceCount();

        // 前回から実際に経過した時間を秒で求める
        frameTime = (currentTime - previousTime) / 1000000.0;

        // 次の計測に備えて現在時刻を保存する
        previousTime = currentTime;

        // 長時間止まった場合は、処理する時間を制限する
        if (frameTime > MAX_FRAME_TIME)
        {
            frameTime = MAX_FRAME_TIME;
        }

        // 実際に経過した時間をためる
        accumulator += frameTime;

        // 1/60秒以上たまっている間、ゲームを更新する
        while (accumulator >= DeltaTime())
        {
            Update();

            // Updateで処理した時間を引く
            accumulator -= DeltaTime();
        }

        // 裏画面を黒で消す
        ClearDrawScreen();

        // ゲーム画面を描画する
        Draw();

        // 裏画面を表画面へ表示する
        ScreenFlip();
    }

    // DxLibを終了する
    DxLib_End();

    return 0;
}

10.今回のまとめ

今回は、判定ボタンをクリックしたときに、入力確認とHIT・BLOW判定を行いました。

JudgeInput()
    CheckAnswerError()
    CountHit()
    CountBlow()

計算した結果は変数へ保存し、Draw()で表示しました。

Update()
    計算して保存する

Draw()
    保存された内容を表示する

また、hasResultを使い、正常な判定結果がある場合だけHIT数とBLOW数を表示しました。

現在は1回の判定結果だけを表示しています。

次回は、判定した4桁、HIT数、BLOW数を履歴へ保存し、右側へ一覧表示します。