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;
}
}
}
}
}
プログラムの流れ
メイン関数内で、YesNoGameクラスのインスタンスを生成し、Startメソッドを呼び出してゲームを開始します。
Startメソッドでは、質問を表示し、ユーザーからの入力を待ちます。
ユーザーがYesを選択した場合は、次の質問に進みます。Noを選択した場合は、指定された質問に移動します。
最後の質問に達するか、不正な入力があった場合はゲームを終了します。
クラス内の変数とメソッド
変数
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つの責務を持ち、その責務に対して単純で変更が容易な形で実装されています。
この記事が気に入ったらサポートをしてみませんか?