-5

重複の可能性:
C# で List<T> をランダム化する

ユーザーに5つの質問を重複せずにランダムに出題し、その質問が正しければ次の質問に進み、間違っていれば次の質問に進み、ユーザーが正しい答えを返すまで停止するプログラムを作成したいと考えています。しかし、重複があり、ユーザーが間違った答えを入力すると、一度だけ停止し、その後プログラムが終了するなど、いくつかの問題がまだあります! 同じ質問の重複を防ぐにはどうすればよいですか。また、間違った値を入力した場合、次の質問に進まなかったり、プログラムが終了したりしませんか?

static void Main()
{
    next:
    Random question = new Random();
    int x = question.Next(5);
    string[] array = new string[5];
    array[0] = "-What is the capital of France";
    array[1] = "-What is the capital of Spain";
    array[2] = "-What is the captial of Russia";
    array[3] = "-What is the capital of Ukraine";
    array[4] = "-What is the capital of Egypt";

    Console.WriteLine(array[x]);

    string[] answer = new string[5];
    answer[0] = "Paris";
    answer[1] = "Madrid";
    answer[2] = "Moscow";
    answer[3] = "Kiev";
    answer[4] = "Cairo";

    string a = Console.ReadLine();

    if (a == answer[x])
    {
        Console.WriteLine("It's True \n*Next Question is:");
        goto next;
    }
    else
        Console.WriteLine("It's False \n*Please Try Again.");

    Console.ReadLine();
}
4

3 に答える 3

3

質問のインデックスをLINQでシャッフルできます

Random random = new Random();
var indexes = Enumerable.Range(0,array.Length).OrderBy(i => random.Next());

foreach(var index in indexes)
{
    Console.WriteLine(array[index]);
    do 
    {        
        string a = Console.ReadLine();

        if (a == answer[index]) {                
          Console.WriteLine("It's True\n");
          break;
        }

        Console.WriteLine("It's False \n*Please Try Again.");
    }
    while(true);
}

説明:

Enumerable.Range(0,array.Length)ゼロから始まる整数値の範囲を返します:0, 1, 2, 3, 4。次に、それらの番号は乱数でソートされます(つまりシャッフルされます)。これらの数値の任意の組み合わせになる可能性があり3, 0, 1, 4, 2ます。


ところで、OOPの方法で、関連データ(質問テキストと回答)とロジック(回答が正しいかどうかを定義する)を1か所にまとめるのは良いことです。

public class Question
{
    public string Text { get; set; }
    public string Answer { get; set; }

    public bool IsCorrect(string answer)
    {
        return String.Compare(answer, Answer, true) == 0;
    }
}

この質問クラスを使用すると、すべてのコードが読みやすくなります。

var questions = new List<Question>()
{
    new Question { Text = "What is the capital of France?", Answer = "Paris" },
    new Question { Text = "What is the capital of Spain?", Answer = "Madrid" },
    new Question { Text = "What is the capital of Russia?", Answer = "Moscow" },
    new Question { Text = "What is the capital of Ukraine?", Answer = "Kiev" },
    new Question { Text = "What is the capital of Egypt?", Answer = "Cairo" }
};

Random random = new Random();

// randomizing is very simple in this case
foreach (var question in questions.OrderBy(q => random.Next()))
{
    Console.WriteLine(question.Text);

    do
    {
        var answer = Console.ReadLine();
        if (question.IsCorrect(answer))
        {
            Console.WriteLine("It's True");
            break;
        }

        Console.WriteLine("It's False. Please try again.");
    }
    while (true);
}

次のステップは、クラスの実装ですSurvey。このクラスでは、質問をしたり、回答を読んだり、要約を表示したりします。

于 2013-01-29T17:17:56.167 に答える
3

どうしても必要な場合を除き、goto は使用しないでください。

public class Program
{
    private static List<KeyValuePair<string, string>> questions = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string,string>("-What is the capital of France", "Paris"),
        new KeyValuePair<string,string>("-What is the capital of Spain", "Madrid"),
        new KeyValuePair<string,string>("-What is the captial of Russia", "Moscow"),
        new KeyValuePair<string,string>("-What is the capital of Ukraine", "Kiev"),
        new KeyValuePair<string,string>("-What is the capital of Egypt", "Cairo"),
    };

    static void Main()
    {
        var questions = ShuffleQuestions();

        foreach(var question in questions)
        {
            bool done = false;
            while(!done)
            {
                Console.WriteLine(question.Key);
                string a = Console.ReadLine();

                if (a == question.Value)
                {
                    Console.WriteLine("It's True \n*Next Question is:");
                    done = true;
                }
                else
                    Console.WriteLine("It's False \n*Please Try Again.");
            }
        }

        Console.ReadLine();
    }

    private IEnumerable<KeyValuePair<string, string>> ShuffleQuestions()
    {
        var list = questions;
        var random = new Random();  
        int items = list.Count;  
        while (items > 1) {  
            items--;  
            int nextItem = random.Next(items + 1);  
            var value = list[nextItem];  
            list[nextItem] = list[items];  
            list[items] = value;  
        }

        return list;
    }
}
于 2013-01-29T17:31:32.920 に答える
2

次の質問をする順序を表す整数のシャッフル配列を作成できます。

// Create question order
var order = Enumerable.Range(0, array.Length).ToArray();
for (int i = order.Length - 1; i > 1; --i)
{
    var randomIndex = rnd.Next(i);
    var temp = order[randomIndex];
    order[randomIndex] = order[i];
    order[i] = temp;
}

// Ask the questions in shuffled order
foreach(int questionIndex in order)
{
    Console.Write(array[questionIndex]);
    bool answeredCorrectly = Console.ReadLine() == answer[questionIndex];
}
于 2013-01-29T17:18:14.970 に答える