0

我正计划使用 XNA 为 WP7 制作一款休闲文字游戏。游戏机制对我来说已经足够好了,但只是检查他们所写的词是否真的是一个词。

我想有一个文本文件并在开始时将其加载到内存中,但这肯定不可能保存在手机的内存中吗?此外,从中读取以查看它是否是一个单词会有多慢。它们将如何存储在内存中?最好使用字典/哈希图,每个key都是一个词,我只是检查该键是否存在?还是会将它们放在一个数组中?

坚持实现这一点的最佳方式,因此感谢任何输入。谢谢

4

2 回答 2

3

根据您的手机硬件,您可能只需将文本文件加载到内存中。英语可能只有几十万字。假设您的平均单词约为 5 个字符左右,那大约是一兆数据。您将在内存中管理该文件的开销,但这就是硬件细节的重要性。顺便说一句,当前一代手机拥有大量 RAM 的情况并不少见。

请参阅以下相关的 SO 问题,这些问题需要文本文件作为字典。

字典文本文件

于 2012-06-27T18:19:14.873 回答
1

将文本文件放入内存,即使是整个字典,也不应该像前面seth flowers所说的那样太糟糕。选择合适的数据结构来保存单词很重要。

我不推荐使用单词作为键的字典……老实说,这有点愚蠢。如果只有键没有值,字典有什么用?但是,您可能对 Dictionary 的想法很满意。我会尝试的第一件事是 a Dictionary<char, string[]>,其中键是第一个字母,值是所有以该字母开头的单词的列表。当然,该数组会很长,并且在数组上的搜索时间很慢(尽管对键的查找应该是 zippy,因为 char 哈希是唯一的)。好处是,如果您使用正确的 .txt 字典文件并按顺序加载每个单词,您就会知道该列表是按字母顺序排列的。因此,您可以使用高效的搜索技术,如二分搜索,或为预排序列表制定的任意数量的搜索。最后可能不会那么慢。

但是,如果您想更进一步,可以使用预测文本的基础结构。它被称为 Patricia Trie 或 Radix Trie(维基百科)。从第一个字母开始,您将遍历所有可能的分支,直到您:

  1. 组装用户输入的单词,所以它是一个有效的单词
  2. 到达分支的末端;这个词不存在。

“尝试”是为了解决这类问题。我从来没有在代码中代表过一个,所以恐怕我不能给你任何指示(ba dum tsh!),但互联网上可能有大量关于如何做到这一点的信息。使用 Trie 可能是最有效的解决方案,但如果您发现我上面提到的字母字典使用二分搜索足够快,您可能只想在开发实际游戏玩法时暂时坚持使用它。刚开始游戏时陷入寻找最佳解决方案的困境往往会耗尽您完成游戏的热情。如果你遇到性能问题,那么你就会做出改进——至少这是我在设计游戏时的理念。

好消息是,由于 Windows Phone 基本上只支持 2 种不同的规格,一旦您测试了应用程序并看到它在它们上流畅运行,您真的不必担心针对任何更糟糕的条件进行优化。所以使用有效的方法!

PS:在 Windows Phone 上,加载文本文件很棘手。是有关该问题的帖子,应该对您有所帮助。

于 2012-06-27T19:53:05.123 回答