1

我正在开发一个文字游戏,基本上我想为字母表的每个字符分配一个整数值。

目前,我有一个帮助器来返回每个 char 的值,但我想知道应该如何构造初始数据结构。

目前它是一个字典,其中包含字母表中的每个字母作为键,我希望这些点成为该键的对象。设置点对象的最佳做法是什么?

我想避免这样的事情:

if      (_letter == 'a' || _letter == 'A') _points = 1;
else if (_letter == 'b' || _letter == 'B') _points = 4;
else if (_letter == 'c' || _letter == 'C') _points = 3;

非常感谢

4

3 回答 3

1

您可以使用一个 26 元素的 C 整数数组,其中每个整数是该字母的点值,第 0 个元素是 A,第一个元素是 B,等等。然后您只需小写字母,然后再减去'a'它并使用作为数组的索引。此时,唯一剩下的就是防止考虑非 ASCII 字母字符,这可以通过小写 ( if (c >= 'a' && c <= 'z')) 后的简单范围检查来完成。

于 2012-08-27T21:43:28.550 回答
0

您可以利用 chars在 C中是整数(因此也是 Objective-C 中的整数)这一事实,并且只需拥有一个 int 数组,以 char 的小写版本 - 'a' 为键,如下所示:

int *letterValues[] = {1,4,3}; // a = 1, b=4, etc...
char thisChar = 'B';

int thisCharVal = letterValues[tolower(thisChar) - 'a'];

请注意,这使用了在(std 库)中声明的 tolower,并且从小写字母字符中减去 'a' 本质上是在推导出它在字母表中的“索引”:'a' - 'a' = 0,“第一个" item, 'b'-'a' = 1 等。因此,您的数组初始值设定项 ( {1,4,3}) 只是您要按顺序分配给字符的值(或者如果您愿意,可以使用指定的初始值设定项,您可以使用 chars还有:

int *letterValues[] = {1,4,3, 'z'=4};
于 2012-08-27T21:46:41.200 回答
0

如果它只是标准拉丁字母,没有变音符号或其他特殊字符,最简单的方法是为“点”值创建一个 26 个整数的数组:

int LookupPoints(char c)
{
    static const unsigned char Points[26]={1,4,3, ... };

    c=c|0x20;    /* all lower case */
    assert(c>='a' && c<='z');
    return Points[c-'a'];
}

如果你想包含其他字符,你可以专门检查它们,或者制作一个按字母排序的结构数组(带有字符和值)以使用 bsearch 搜索。

编辑:当然,字典也可以。只需针对您的特定情况使用任何感觉最简单的解决方案即可。

于 2012-08-27T21:49:40.093 回答