ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

STL map

マップは一意のキーと値が対応付けられた結合コンテナのこと。キーとその値のペア。キーからその値を得ることができる。
ゲームっぽくプログラムを書いてみた。ゲーム内のアイテムの名前をキーとして、値はそのアイテムの効果というもの。

#include <iostream>
#include <map>
#include <cstring>
using namespace std;

// アイテム名のクラス
class ItemName
{
    char name[80];
public:
    ItemName(char *s) { strcpy(name,s); }
    char *get() { return name; }
};

bool operator<(ItemName a, ItemName b)
{
    return strcmp(a.get(), b.get()) < 0;
}

// アイテムの効果
class ItemObj
{
    char str[80];
public:
    ItemObj(char *s) { strcpy(str, s); }
    char *get() { return str; }
};

// アイテムデータ
char itemdata[][80] = {
    "potion", "heal HP",
    "key", "unlock a door",
    "lamp", "light",
};

int main()
{
    // マップの作成
    map<ItemName, ItemObj> items;

    // 要素の追加
    for(int i=0; i<3; i++) {
        items.insert(
            pair<ItemName, ItemObj>(
                ItemName(itemdata[i*2]),
                ItemObj(itemdata[i*2+1]) ) );
    }

    map<ItemName, ItemObj>::iterator p;

    // アイテム名を入力して、効果を表示
    char str[80];
    while(1) {
        cout << "> ";
        cin >> str;
        p = items.find(str);
        if( p != items.end() )
            cout << p->second.get() << endl;
        else
            cout << "unknown item." << endl;
    }
}

マップではキーをソートしているのでキーとなるものには、<演算子が必要となる。
insert()関数で要素を追加する。マップの要素はキーと値のペアなので、pairで作成している。これはmake_pair()関数を使っても作成できる。
キーから値を得るにはfind()関数を使用する。値があった場合はそのiteratorを返し、ない場合はマップの末尾を返す。
実行結果

> lamp
light
> potion
heal HP
> key
unlock a door
> sword
unknown item.