2010-11-07 112 views
2

我想为用户提供一些问题的选择,但我希望它们是随机的,有相同问题的问答游戏并不完全有趣。从文本文件生成随机问题 - C#

我的想法是存储大量收集的问题,并有appropiate在文本文件中的答案:

What colour is an Strawberry|Red 
How many corners are there on a Triangle|Three 

这意味着,我可以简单地随机选择一条线,读取线的问题和答案并将它们存储在游戏中使用的集合中。

我拿出来与做法,我认为将是有益的,我期待一些输入它是如何可以改善一些伪代码:

Random rand = new Random(); 
int line; 
string question,answer; 

for(int i = 0; i < 20; i++) 
{ 
    line = rand.Next(); 
    //Read question at given line number to string 
    //Read answer at given line number to string 
    //Copy question and answer to collection 
} 

在执行的想法我”的角度我不确定如何指定行号来读取,以及如何分割整行并分别读取两个部分。除非有更好的方法,否则我的想法是在文本文件中手动输入行号,然后输入“|”所以每条线看起来像这样:

1|What colour is an Strawberry|Red 
2|How many corners are there on a Triangle|Three 

感谢您的任何帮助!

+0

我建议从不使用纯文本文件作为结构化数据,这个数据结构起初可能有多简单。从长远来看,XML文件应该为您提供更好的服务。 – TeaDrivenDev 2010-11-07 21:42:28

+0

'3 |这个字符是什么'|'用于?|管道命令。' – 2010-11-07 21:45:31

+0

@GCATNM或像CompactSQL这样的过程数据库。这为您提供了一种简单的方法,即只提取要显示给用户的那些行。 – 2010-11-07 21:47:15

回答

2

为什么不使用ReadLine将整个文件读入数组或列表中,然后引用数组边界内的随机索引来提取问题/答案字符串,而不是在需要时从文本文件中读取一个问题。

至于解析它,只需使用Split拆分|描述符(并确保没有问题有|由于某种原因的问题)。这也可以让你在问题中存储一些错误的答案(只要说第一个总是正确的,那么当你输出它时,你可以随机化订单)。

+0

好主意!也意味着如果我在一行中添加新项目,我可以扩展它。 – 2010-11-07 21:53:13

2

你不想显示任何问题两次,对不对?

Random random = new Random(); 
var q = File.ReadAllLines("questions.txt") 
    .OrderBy(x=>random.Next()) 
    .Take(20) 
    .Select(x=>x.Split('|')) 
    .Select(x=>new QuestionAndAnswer(){Question=x[0],Answer=x[1]}); 
+0

这很好,假设文件不是很大,可能是这种情况。 – 2010-11-07 21:39:08

+0

你介意解释上面的代码是如何工作的吗?我有一种感觉,我明白这一点,但我只想确定。 – 2010-11-07 21:44:25

+0

这段代码很可爱,但对于每一秒用于产生它的严重脑力劳动,每次尝试阅读时都需要至少一秒的时间来理解它。也许更多。 – Dialecticus 2010-11-07 22:27:11