C# | 2週間で身につくアプリを作りながら学ぶC#の基本 - 5日目

C# C#
スポンサーリンク

5日目のゴールとテーマ

5日目のテーマは「文字列の配列を使って、クイズアプリの土台を作る」です。
4日目までは「数値の配列」で点数を扱いましたが、今日は

  • 質問文や選択肢、答えを「文字列の配列」で管理する
  • for 文で問題を順番に出す
  • 正解数をカウントして、最後に結果を表示する

という「ミニクイズアプリ」を作ります。

ここまで来ると、C# で作るコンソールアプリが一気に“遊べるもの”になってきます。


数値だけじゃない「文字列の配列」

文字列の配列の基本形

4日目は int[](整数の配列)を使いました。
今日は string[](文字列の配列)を使います。

string[] names = { "Taro", "Hanako", "Jiro" };

for (int i = 0; i < names.Length; i++)
{
    Console.WriteLine((i + 1) + " 人目: " + names[i]);
}
C#

ここで押さえたいポイントはこうです。

  • string[] は「文字列を並べて持つ配列」
  • names[i] が「i 番目の名前」
  • Length は数値の配列と同じく「要素数」

配列は「中身の型」が違うだけで、使い方の基本は同じです。

質問文を配列で持つイメージ

クイズアプリを作るとき、質問を 1 個ずつ変数にするとこうなります。

string q1 = "C# はどの会社が作った言語?";
string q2 = "C# のファイル拡張子は?";
string q3 = "コンソールに出力するメソッドは?";
C#

これを配列にすると、こうまとまります。

string[] questions =
{
    "C# はどの会社が作った言語?",
    "C# のファイル拡張子は?",
    "コンソールに出力するメソッドは?"
};
C#

この「まとめて持てる」感じが、配列の強さです。


クイズの「問題」と「答え」を配列で管理する

質問と答えを別々の配列で持つ

まずは、シンプルに「質問」と「正解」を 1 対 1 で持ってみます。

string[] questions =
{
    "C# はどの会社が作った言語?",
    "C# のファイル拡張子は?",
    "コンソールに出力するメソッドは?"
};

string[] answers =
{
    "Microsoft",
    ".cs",
    "Console.WriteLine"
};
C#

ここで大事なのは、「同じインデックス同士がペア」ということです。

  • questions[0]answers[0] が 1 問目のセット
  • questions[1]answers[1] が 2 問目のセット

という対応関係を意識してください。

for 文で「問題を順番に出す」

この 2 つの配列を使って、問題を順番に出してみます。

for (int i = 0; i < questions.Length; i++)
{
    Console.WriteLine("第 " + (i + 1) + " 問");
    Console.WriteLine(questions[i]);

    Console.WriteLine("答えを入力してください:");
    string userAnswer = Console.ReadLine();

    Console.WriteLine("あなたの答え: " + userAnswer);
    Console.WriteLine("正解: " + answers[i]);
    Console.WriteLine();
}
C#

流れを言葉で追うとこうです。

  • i を 0 から questions.Length – 1 まで回す
  • 毎回、questions[i] を表示する
  • ユーザーの答えを Console.ReadLine() で受け取る
  • 正解 answers[i] を表示する

まだ「正解かどうかの判定」はしていませんが、
これだけで「クイズっぽい動き」になります。


正解判定とスコアカウントを追加する

文字列の比較で正解かどうかを判定する

ユーザーの答えが正解かどうかを判定するには、
文字列同士を比較します。

if (userAnswer == answers[i])
{
    Console.WriteLine("正解!");
}
else
{
    Console.WriteLine("不正解…");
}
C#

ここでの重要ポイントは次です。

  • 文字列の比較も == を使う
  • 大文字・小文字を区別する(”Microsoft” と “microsoft” は別物)

大文字・小文字を無視したい場合は、両方を小文字にしてから比較します。

if (userAnswer.ToLower() == answers[i].ToLower())
{
    Console.WriteLine("正解!");
}
else
{
    Console.WriteLine("不正解…");
}
C#

ToLower() は「全部小文字にする」メソッドです。

正解数をカウントする

クイズらしくするために、「正解数」を数えましょう。

int score = 0;

for (int i = 0; i < questions.Length; i++)
{
    Console.WriteLine("第 " + (i + 1) + " 問");
    Console.WriteLine(questions[i]);

    Console.WriteLine("答えを入力してください:");
    string userAnswer = Console.ReadLine();

    if (userAnswer.ToLower() == answers[i].ToLower())
    {
        Console.WriteLine("正解!");
        score = score + 1;
    }
    else
    {
        Console.WriteLine("不正解…");
        Console.WriteLine("正解は: " + answers[i]);
    }

    Console.WriteLine();
}

Console.WriteLine("あなたの正解数は " + score + " / " + questions.Length + " 問です。");
C#

ここで深掘りしたいのは score = score + 1; です。

  • 最初に score = 0; としておく
  • 正解のたびに 1 ずつ増やす
  • ループが終わったとき、score に「正解数」が入っている

これは 3日目の「sum パターン」と同じ考え方です。
「何かを数えるときは、変数を 0 からスタートして、条件を満たしたときに 1 足す」
このパターンを体に染み込ませてください。


選択肢付きクイズにして“アプリ感”を上げる

選択肢も配列で持つ

今のクイズは「自由入力」なので、スペルミスなどで不正解になりやすいです。
そこで、選択肢付きのクイズにしてみます。

問題ごとに 3 つの選択肢を用意する例です。

string[] questions =
{
    "C# はどの会社が作った言語?",
    "C# のファイル拡張子は?",
    "コンソールに出力するメソッドは?"
};

string[,] choices =
{
    { "Microsoft", "Apple", "Google" },
    { ".cs", ".csharp", ".txt" },
    { "Console.WriteLine", "Console.Print", "System.Out" }
};

int[] correctIndex =
{
    0,
    0,
    0
};
C#

ここで新しく出てきたのが「2 次元配列」です。

  • string[,] choices は「文字列の 2 次元配列」
  • 1 つ目のインデックスが「問題番号」
  • 2 つ目のインデックスが「選択肢番号」

例えば、

  • choices[0, 0] → 1 問目の 1 番目の選択肢(”Microsoft”)
  • choices[1, 2] → 2 問目の 3 番目の選択肢(”.txt”)

という対応になります。

correctIndex は「正解の選択肢の番号」です。
ここでは全部 0(1 番目の選択肢が正解)にしています。

選択肢を表示して、番号で答えてもらう

このデータを使って、クイズを出してみます。

int score = 0;

for (int i = 0; i < questions.Length; i++)
{
    Console.WriteLine("第 " + (i + 1) + " 問");
    Console.WriteLine(questions[i]);

    Console.WriteLine("1: " + choices[i, 0]);
    Console.WriteLine("2: " + choices[i, 1]);
    Console.WriteLine("3: " + choices[i, 2]);

    Console.WriteLine("番号で答えてください(1〜3):");
    string answerText = Console.ReadLine();
    int answerNumber = int.Parse(answerText);

    int answerIndex = answerNumber - 1;

    if (answerIndex == correctIndex[i])
    {
        Console.WriteLine("正解!");
        score = score + 1;
    }
    else
    {
        Console.WriteLine("不正解…");
        int correctNumber = correctIndex[i] + 1;
        Console.WriteLine("正解は " + correctNumber + " 番: " + choices[i, correctIndex[i]]);
    }

    Console.WriteLine();
}

Console.WriteLine("あなたの正解数は " + score + " / " + questions.Length + " 問です。");
C#

ここでの重要ポイントを整理します。

  • choices[i, 0]choices[i, 2] で 3 つの選択肢を表示
  • ユーザーには「1〜3 の番号」で答えてもらう
  • 入力された番号から 1 を引いて、インデックスに変換(answerNumber - 1
  • そのインデックスと correctIndex[i] を比較して正解判定

「人間には 1 始まりで見せて、プログラム内部では 0 始まりで扱う」
この変換が、配列を使うときのよくあるパターンです。


5日目の仕上げ:自分オリジナルのクイズにしてみる

問題を自分の好きなテーマに変える

ここまで来たら、あとは「中身を自分仕様にする」だけです。

  • 好きなゲームのクイズ
  • 自分のプロフィールクイズ
  • C# の復習クイズ

など、テーマは何でも構いません。

やることはシンプルです。

  • questions の中身を書き換える
  • choices の中身を書き換える
  • correctIndex を正しい番号に合わせる

これだけで、完全オリジナルのクイズアプリになります。


5日目のまとめ

今日のキーワードを整理します。

文字列の配列(string[]
質問や名前、メッセージなどをまとめて持つのに使える。

2 次元配列(string[,]
問題 × 選択肢のように「表形式」のデータを持つときに使える。

文字列の比較
== で比較できる。大文字小文字を無視したいときは ToLower() を使う。

スコアカウント
int score = 0; から始めて、正解のたびに score = score + 1;

ここまでできると、「配列+for+if+入力」で
かなり遊べるアプリが作れるようになっています。


次回(6日目)への予告

6日目は、ここまでのコンソールアプリの知識を使いながら、

  • メソッド(自分で処理のまとまりを作る)
  • 「同じ処理を何度も使い回す」
  • コードを読みやすく分割する

という方向に進みます。

クイズアプリの「1 問出す処理」をメソッドに切り出したり、
点数集計をメソッド化したりして、「プロっぽい書き方」に一歩近づいていきます。

タイトルとURLをコピーしました