プログラムを操作するのは、必ずしも開発者の想定通りに入力してくれるユーザーばかりではありません。無効な値が入力された際に、エラーで終了するのではなく、「正しい値が入力されるまで、もう一度入力を促す」処理は、質の高いアプリケーションを作る上で不可欠です。
この記事では、while
ループとフラグというテクニックを使い、ユーザーからの入力をチェックする実践的な「数当てゲーム」の作成を通して、繰り返し処理をさらに深く学んでいきましょう。
「フラグ」を使ったwhileループの制御
プログラムにおいてフラグとは、特定の状態を記録しておくためのbool
型(true
/false
)変数のことを指します。ループ処理においては、「ループを終了すべきか、続けるべきか」という状態を管理するためによく使われます。
アナロジー: 旗揚げゲームの旗のようなものです。旗が上がっている(false
)間はゲームを続け、旗が下がったら(true
になったら)ゲームを終了する、といったイメージでループを制御します。
基本的な使い方
// 1. ループを続けるかどうかを管理するフラグを用意(最初は続けるのでfalse)
bool isLoopFinished = false;
// 2. フラグがfalseである間、ループを続ける
while (isLoopFinished == false)
{
Console.WriteLine("ループ内の処理を実行中...");
// 3. 何らかの条件を満たした場合...
if (/* ここに終了条件を書く */)
{
// 4. フラグをtrueに切り替える
isLoopFinished = true;
}
}
Console.WriteLine("ループが終了しました。");
while
の条件式が isLoopFinished == false
のため、フラグがtrue
になった瞬間に条件を満たさなくなり、ループが終了します。
実践:数当てゲームを作ろう
それでは、while
ループとフラグ制御、そして前回学んだ入力判定を組み合わせて、コンピュータが考えた数字を当てるまで終わらない「数当てゲーム」を作成します。
ゲームの設計
- プログラムが、1から20までのランダムな正解の数字を一つ決める。
- 「正解しましたか?」という状態を管理するフラグ(
isGuessedCorrectly
)を用意する。 - フラグが
false
である間、以下の処理をループする。 a. ユーザーに数字の入力を促す。 b. 入力された値が有効な数字かをチェックする。 c. 数字であれば、正解の数字と比べて「もっと高い」か「もっと低い」かヒントを出す。 d. 数字が正解と一致すれば、お祝いのメッセージを表示し、フラグをtrue
に切り替えてループを終了させる。
完成コード
using System;
// 1. 正解となるランダムな数字を生成
Random random = new Random();
int answer = random.Next(1, 21); // 1から20までの整数
Console.WriteLine("数当てゲームへようこそ!");
Console.WriteLine("1から20までの数字を当ててください。");
// 2. 正解したかどうかを管理するフラグを用意
bool isGuessedCorrectly = false;
// 3. 正解するまでループ
while (isGuessedCorrectly == false)
{
Console.Write("あなたの予想: "); // WriteLineではなくWriteで改行しない
string input = Console.ReadLine();
int guess;
// 3-b. 入力が有効な数字かチェック
if (int.TryParse(input, out guess) == false)
{
Console.WriteLine("エラー:半角数字で入力してください。");
continue; // 今回の処理をスキップしてループの先頭に戻る
}
// 3-c. 正解と比較してヒントを出す
if (guess > answer)
{
Console.WriteLine("ヒント:もっと低い数字です。");
}
else if (guess < answer)
{
Console.WriteLine("ヒント:もっと高い数字です。");
}
else // guess == answer
{
// 3-d. 正解した場合
Console.WriteLine("おめでとうございます!正解です!");
// フラグをtrueにしてループを終了させる
isGuessedCorrectly = true;
}
}
Console.WriteLine("ゲームを終了します。");
Console.ReadLine();
まとめ
今回は、while
ループとフラグを使った実践的なプログラミングを学びました。
while
ループは、「特定の条件を満たすまで処理を繰り返す」入力チェックのような場面で非常に有効。bool
型のフラグ変数を使うことで、ループを続けるか終了するかの状態を明確に管理できる。int.TryParse()
やcontinue
をループ内で活用することで、無効な入力にも対応できる堅牢なプログラムが作れる。
この「フラグでループを制御し、条件を満たしたらフラグを切り替えてループを抜ける」というパターンは、ゲーム開発だけでなく様々なアプリケーションで使われる基本的なテクニックです。ぜひこの考え方をマスターしてください。