C# YesNoクイズ

using System;
using System.Collections.Generic;
using System.IO;

namespace YesNoGame
{
    class Program
    {
        static void Main(string[] args)
        {
            YesNoGame game = new YesNoGame("YesNo.csv");
            game.Start();
        }
    }

    class YesNoGame
    {
        private Dictionary<int, (string question, int yesNext, int noNext)> questions;

        public YesNoGame(string filePath)
        {
            questions = new Dictionary<int, (string, int, int)>();
            LoadQuestions(filePath);
        }

        private void LoadQuestions(string filePath)
        {
            try
            {
                using (StreamReader reader = new StreamReader(filePath))
                {
                    string line;
                    reader.ReadLine(); // Skip header
                    while ((line = reader.ReadLine()) != null)
                    {
                        string[] parts = line.Split(',');
                        int number = int.Parse(parts[0]);
                        string question = parts[1];
                        int yesNext = parts[2] == "" ? -1 : int.Parse(parts[2]);
                        int noNext = parts[3] == "" ? -1 : int.Parse(parts[3]);
                        questions.Add(number, (question, yesNext, noNext));
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error reading file: " + e.Message);
            }
        }

        public void Start()
        {
            int currentQuestionNumber = 1;

            while (currentQuestionNumber != -1)
            {
                if (questions.ContainsKey(currentQuestionNumber))
                {
                    (string question, int yesNext, int noNext) = questions[currentQuestionNumber];
                    Console.WriteLine(question);
                    Console.Write("Enter Y for Yes, N for No: ");
                    string answer = Console.ReadLine().Trim().ToUpper();

                    if (answer == "Y")
                    {
                        currentQuestionNumber = yesNext;
                    }
                    else if (answer == "N")
                    {
                        currentQuestionNumber = noNext;
                    }
                    else
                    {
                        Console.WriteLine("Invalid input. Please enter Y or N.");
                    }
                }
                else
                {
                    Console.WriteLine("End of questions.");
                    break;
                }
            }
        }
    }
}

プログラムの流れ

  1. メイン関数内で、YesNoGameクラスのインスタンスを生成し、Startメソッドを呼び出してゲームを開始します。

  2. Startメソッドでは、質問を表示し、ユーザーからの入力を待ちます。

  3. ユーザーがYesを選択した場合は、次の質問に進みます。Noを選択した場合は、指定された質問に移動します。

  4. 最後の質問に達するか、不正な入力があった場合はゲームを終了します。

クラス内の変数とメソッド

変数

  • questions:

    • Dictionary<int, (string, int, int)>型の変数です。

    • 質問番号をキーとして、質問内容とYes、Noそれぞれの回答に対する次の質問の番号を保持します。


Dictionary<int, (string, int, int)>
型の変数は、キーがint型であり、値が3つの要素からなるタプルで構成される辞書を表します。

  • キー:int型

  • 値:(string, int, int)型のタプル

    • string:質問内容

    • int:Yesを選択した場合の次の質問の番号

    • int:Noを選択した場合の次の質問の番号

このような辞書は、質問番号をキーとして、その質問に対するYesとNoそれぞれの選択に対する次の質問の番号を格納します。これにより、プログラムは質問番号を参照して、次の質問を特定することができます。

メソッド

  • LoadQuestions(string filePath):

    • YesNo.csvファイルから質問を読み込み、それをquestions変数にロードします。

    • ファイル読み込みエラー時の例外処理も行います。

  • Start():

    • ゲームを開始します。

    • 現在の質問番号を保持しながら、質問を表示し、ユーザーの入力を待ちます。

    • 入力に応じて次の質問に進むか、ゲームを終了します。

オブジェクト指向の概念と原則

1.カプセル化(Encapsulation)

  • YesNoGameクラスは、関連するデータとメソッドを1つの単位でカプセル化しています。

  • メソッドや変数を適切に公開・非公開にすることで、外部からの不適切なアクセスを制限し、クラスのインターフェースを簡潔に保ちます。

2. 抽象化(Abstraction)

  • YesNoGameクラスは、YesかNoの質問に対する一般的なゲームロジックを提供する抽象化された実体です。

  • 具体的な質問やロジックは、外部のデータファイルで定義され、YesNoGameクラスはそのファイルを読み取り、適切に処理します。

3. 継承(Inheritance)

  • このプログラムでは、継承は使用されていませんが、YesNoGameクラスを拡張し、さまざまな種類のゲームを作成するために継承を使用できます。

  • 例えば、YesNoGameを継承してTrueFalseGameやMultipleChoiceGameなどの異なるゲームクラスを作成することができます。

4. 多様性(Polymorphism)

  • ポリモーフィズムは、異なる型のオブジェクトが同じインターフェースを共有し、それぞれ異なる振る舞いをする能力を指します。

  • このプログラムでは、ポリモーフィズムは明示的に示されていませんが、YesNoGameクラスのような抽象化されたクラスを利用することで、異なるゲームタイプに対して同じようなインターフェースを提供できます。

5. 単一責任原則(Single Responsibility Principle)

  • YesNoGameクラスは、YesかNoの質問に対するゲームロジックを管理し、YesNo.csvファイルから質問を読み込む責任を持っています。

  • このように、各クラスは1つの責務を持ち、その責務に対して単純で変更が容易な形で実装されています。

この記事が気に入ったらサポートをしてみませんか?