第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でも、まだ画面は切り替わらない
2.判定ボタンを押した後の処理
判定ボタンを押すと、まず入力した内容にエラーがないか確認します。
判定を始める前に、前回の結果が残らないようにhitとblowを0、hasResultをfalseに戻します。
| 入力の状態 | 処理 |
|---|---|
| エラーあり | HITとBLOWは数えず、判定結果も表示しない |
| エラーなし | HIT数とBLOW数を数え、hasResultをtrueにする |
つまり、入力にエラーがなかったときだけHITとBLOWを判定する処理です。
STEP 1 ここでソースを書き換える!
変更する場所:
hitとblowの下
確認すること:エラーなくビルドできること
追加するコード
hasResultは、hitとblowの直後へ追加します。
変数を追加すると、次のようになります。
// 判定結果
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() |
現在の状態を画面へ表示する | inputError、hit、blow、hasResultを確認し、判定結果やエラーメッセージを表示する |
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桁未満
- 数字を3桁だけ入力する
- 判定ボタンを押す
- 次のメッセージが表示されることを確認する
4桁入力してください。
4桁目を追加したとき、古いエラーが消えることも確認します。
確認2 同じ数字
- 「入力を消す」を押す
1123と入力する- 判定ボタンを押す
- 次のメッセージが表示されることを確認する
同じ数字を2回使わないでください。
確認3 正しい4桁
- 「入力を消す」を押す
- 重複しない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数を履歴へ保存し、右側へ一覧表示します。

No Comments