1

私は単語ゲームを開発していますが、基本的にアルファベットの各文字に整数値を割り当てたいと考えています。

現在、各文字の値を返すヘルパーがありますが、初期データ構造をどのように構築すればよいのか疑問に思っています。

現時点では、アルファベットの各文字をキーとして含む辞書であり、ポイントをそのキーのオブジェクトにしたいと考えています。ポイント オブジェクトを設定するベスト プラクティスは何ですか?

次のようなことは避けたいです。

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、1番目の要素はBなどです。次に、文字を小文字にして'a'から減算し、それを配列へのインデックスとして。この時点で残っているのは、ASCII以外のアルファベット文字が考慮されないようにすることだけです。これは、小文字(if (c >= 'a' && c <= 'z'))の後に単純な範囲チェックを行うことで実行できます。

于 2012-08-27T21:43:28.550 に答える
0

C では charが整数であるという事実(したがって、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 の配列を作成することです。

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 に答える