ページ 11

RPG等でのアイテムの処理

Posted: 2011年6月05日(日) 21:44
by 雨蛙
C++でRPGを作ろうと考えて勉強中なのですが、アイテムの考え方で行き詰ってしまいました

不思議のダンジョンシリーズやMMORPGなど、アイテム集めが楽しみの一つであるゲームのなかには、
アイテムに、
「祝福されたロングソード+3
・攻撃力10
・3方向に攻撃できる
・STRを4あげる」
のようについているものがあります。
このようなアイテムのシステムをもったゲームを作るときの、変数の形などはどのようにすればいいのでしょうか?

・アイテムクラスに、種類や値段などの情報、追加効果のリストを持たせる
・プレイヤークラスにアイテムのリストをもたせて、その中にアイテムオブジェクトを入れる
として、listを使えばよさそうとまではわかったのですが、この使い方がよくわかりませんでした。

int型のソートの仕方などはわかったのですが、クラス中の変数を使ってソートする方法がよくわからず、
ここがわかれば何とかなりそうです。

環境はVC++2010Expressを使っています。
C/C++は龍神録の館の内容を1からやって、その他サンプルなどを中心に勉強したぐらいです。

Re: RPG等でのアイテムの処理

Posted: 2011年6月05日(日) 23:14
by h2so5
雨蛙 さんが書きました: int型のソートの仕方などはわかったのですが、クラス中の変数を使ってソートする方法がよくわからず、
ここがわかれば何とかなりそうです。
メンバ変数を比較する比較関数を定義して、listのsort関数の引数に渡すことで実現できます。
サンプルコードを書いてみました。

コード:

#include <iostream>
#include <list>
using namespace std;
 
class item{
public:
    // 値段
    int price;
    // コンストラクタ    
    item(int _price) : price(_price){};
    
    // 値段で昇順にソートする比較関数
    static bool comp(const item &a, const item &b);
};
 
bool item::comp(const item &a, const item &b){
    return (a.price < b.price);
}
 
int main() {
    
    list<item> itemList;
    itemList.push_back(item(200));
    itemList.push_back(item(500));
    itemList.push_back(item(100));
 
    // 比較関数を使ってソート
    itemList.sort(&item::comp); 
    
    // 出力
    for(list<item>::iterator it = itemList.begin();it != itemList.end();++it)
        cout << it->price << endl;
    
    return 0;
}

Re: RPG等でのアイテムの処理

Posted: 2011年6月06日(月) 22:11
by 雨蛙
ありがとうございます
比較関数をitemクラスに持たせればいいのですね
あと、後出しになってしまって申し訳ないのですが、変数を指定してソートする簡単な方法はないでしょうか?
たとえばitemクラスが、
int price とint typeの二つの関数を持つ場合に、
sort( price )やsort ( type )のようにソートするにはどうすればいいのでしょうか。
さらには、type=1のものだけを抜き出して、priceの順にソートする方法なども知りたいです。

もうひとつ、プレイヤークラスにアイテムのリストを持たせたい場合は、
class pleyer{
list<item> itemlist;
}
のようにして、Pleyer.itemlist.sort(&item::comp)のように指定すればいいのですか?

返信も遅く質問を後から追加してしまってすみません。

もし、RPGを作る上で、キャラクタの描画方法やマップチップなどの解説ではなく、このようなアイテムの処理方法や、クラスの使い方を解説しているサイトなどあれば教えてくださるとありがたいです

Re: RPG等でのアイテムの処理

Posted: 2011年6月06日(月) 22:23
by softya(ソフト屋)
雨蛙 さんが書きました:あと、後出しになってしまって申し訳ないのですが、変数を指定してソートする簡単な方法はないでしょうか?
たとえばitemクラスが、
int price とint typeの二つの関数を持つ場合に、
sort( price )やsort ( type )のようにソートするにはどうすればいいのでしょうか。
比較関数を増やせばよいだけだと思います。
これはC言語のqsortでも変わりませんよね。
雨蛙 さんが書きました:さらには、type=1のものだけを抜き出して、priceの順にソートする方法なども知りたいです
type=1の物を優先してpriceの順にソートする比較関数を作れば良いのではないでしょうか?
雨蛙 さんが書きました:は、
class pleyer{
list<item> itemlist;
}
のようにして、Pleyer.itemlist.sort(&item::comp)のように指定すればいいのですか?
試してみれば分かります。
そうしたほうが自分で自分の知識としてモノに出来るって事ですね。
そう心配せずに、とりあえず書いてみませんか?
雨蛙 さんが書きました: もし、RPGを作る上で、キャラクタの描画方法やマップチップなどの解説ではなく、このようなアイテムの処理方法や、クラスの使い方を解説しているサイトなどあれば教えてくださるとありがたいです
私は存じません。
こう言うところは自分で考えたほうが面白いと私は思いますけど。
多少効率悪くてもプレイ時に分からなければOKです。

Re: RPG等でのアイテムの処理

Posted: 2011年6月07日(火) 22:21
by 雨蛙
わかりました。とりあえずいろいろ試してみます