我们的任务是设计一个C#琐事应用程序作为文件I/O练习。到目前为止,我有一个良好的开端,但演示步骤有点难倒我
我从一个具有以下数据的分隔文件开始:
Question;CorrectAnswerA;AnswerB;AnswerC;AnswerD;AnswerExplanation
例如
What color is the sky?;Blue;White;Green;Yellow;The sky is blue.
游戏将显示用户可以选择的问题和四个答案。
What Color is the Sky?
A. Blue
B. White
C. Green
D. Yellow
Select A, B, C, or D:
不幸的是,为了便于填充数据集,A
始终是正确的答案。我想随机化四个答案的显示顺序,但程序仍然需要知道哪个是正确的答案。我还需要将A
、B
、C
或D
的用户输入绑定到答案的特定实例,以将selectedAnswerString
与correctAnswerString
进行比较。
我一直在玩一个由四个答案组成的数组,这些答案是随机填充的,但我无法理解如何根据用户的选择将某个问题标记为正确的;我的执行或分配逻辑似乎总是超出范围,或者在数组中的所有四个记录中重复。
与我交谈过的其他学生表示,他们创建的数据集的答案是预先加扰的(这样他们就可以按阅读顺序打印),并为正确答案提供第五个答案字段。虽然这绝对是一种简单的实现方式,但我不认为它像我的策略那样优雅。
我应该只更改输入数据集吗?有人对我的随机化想法有什么想法吗?
创建一个名为Question
的类,属性为:int Id
、string QuestionText
、List<string> Answers
、string CorrectAnswer
或者,作为前进的一步,还使用Id
和Value
创建类Answer
并引用它
public class Question
{
public int Id;
public string QuestionText;
public List<Answer> Answers;
public Answer CorrectAnswer;
}
public class Answer
{
public int Id;
public string Value;
}
然后填充此结构并在打印时随机化
使用单独的变量跟踪正确答案。然后使用Fisher Yates洗牌你的阵列:
Random random = new Random();
void Shuffle(string[] answers) {
for (int i = 0; i < answers.Length - 1; i++) {
int j = random.Next(i, answers.Length);
string temp = answers[j];
answers[j] = answers[i];
answers[i] = temp;
}
}
用户响应后,只需将他们的选择与您保存的正确答案进行比较。
试着用这种方式定义问题的数据结构:
public class Question
{
public string Question;
public string[] Answers;
public int CorrectAnswer;
public string CorrectAnswerExplanation
}
通过这种方式,您可以对数组Answers
中的字符串进行加扰,同时仍然跟踪CorrectAnswer
中正确答案的索引。
或者,如果你不能使用单独的类来建模问题(这是一个家庭作业问题,所以你可能还没有学会),你可以使用数组中的预定位置(第一个或第五个元素)来保存正确答案的索引。所以你的答案数组看起来像:
"Blue", "White", "Green", "Yellow", "0"
步骤1:定义数据结构。其他人已经给了你一个结构,所以使用它。
步骤2:填充数据结构。你可以System.IO.File.ReadLines并解析每一行——我想你已经处理好了这个位。
第三步:随机排列你的答案。为此,假设您有自己的结构:
public static void RandomiseAnswers(IEnumerable<Question> questions)
{
var rand = new Random((int)DateTime.Now.Ticks);
foreach (var question in questions)
{
question.Answers = question.Answers.OrderBy(x => rand.Next()).ToArray();
}
}
步骤4:从老师那里获得金星,以表彰你的杰出工作
就我个人而言,我会在Answer类中放入一个布尔值,默认为false。这样,当选择答案时,你就可以判断它是否正确。
public class AskQuestion
{
public int Id;
public string Question;
public string Explanation;
public List<Answer> Answers = new List<Answer>();
}
public class Answer
{
public bool Correct = false;
public string Value;
}
现在,当你随机化列表时,正确的答案会自动识别为
使用这些类的一种方法如下:
static void Main(string[] args)
{
StreamReader sr = new StreamReader("text.txt");
List<AskQuestion> Questions = new List<AskQuestion>();
Random rnd = new Random(DateTime.Now.Millisecond);
//Loop through the file building a list of questions
while(!sr.EndOfStream)
{
AskQuestion NewQuestion = new AskQuestion();
string[] input = sr.ReadLine().Split(';');
NewQuestion.Question = input[0];
NewQuestion.Explanation = input[5];
for(int i = 1; i < 5; i++)
{
Answer NewAnswer = new Answer();
NewAnswer.Value = input[i];
NewQuestion.Answers.Add(NewAnswer);
}
//The first question is always correct so set its boolean value to true;
NewQuestion.Answers[0].Correct = true;
//Now ranmdomize the order of the answers
NewQuestion.Answers = NewQuestion.Answers.OrderBy(x => rnd.Next()).ToList();
Questions.Add(NewQuestion);
}
//Generate menu and get response for each question
foreach(AskQuestion q in Questions)
{
Console.WriteLine(q.Question + ":ntA - " + q.Answers[0].Value + "ntB - " + q.Answers[1].Value + "ntC - " + q.Answers[2].Value + "ntD - " + q.Answers[3].Value + "n");
char input = '0';
while(input < 'A' || input > 'D')
{
input = char.ToUpper(Console.ReadKey().KeyChar);
if(input >= 'A' && input <= 'D')
{
//Use the boolean value in the answer to test for correctness.
if(q.Answers[input - 'A'].Correct)
{
Console.WriteLine("nCorrectn");
}
else
Console.WriteLine("nWrongn");
Console.WriteLine(q.Explanation);
}
}
}
Console.ReadLine();
}