C++でRPGを作ろうと考えて勉強中なのですが、アイテムの考え方で行き詰ってしまいました
不思議のダンジョンシリーズやMMORPGなど、アイテム集めが楽しみの一つであるゲームのなかには、
アイテムに、
「祝福されたロングソード+3
・攻撃力10
・3方向に攻撃できる
・STRを4あげる」
のようについているものがあります。
このようなアイテムのシステムをもったゲームを作るときの、変数の形などはどのようにすればいいのでしょうか?
・アイテムクラスに、種類や値段などの情報、追加効果のリストを持たせる
・プレイヤークラスにアイテムのリストをもたせて、その中にアイテムオブジェクトを入れる
として、listを使えばよさそうとまではわかったのですが、この使い方がよくわかりませんでした。
int型のソートの仕方などはわかったのですが、クラス中の変数を使ってソートする方法がよくわからず、
ここがわかれば何とかなりそうです。
環境はVC++2010Expressを使っています。
C/C++は龍神録の館の内容を1からやって、その他サンプルなどを中心に勉強したぐらいです。
RPG等でのアイテムの処理
Re: RPG等でのアイテムの処理
メンバ変数を比較する比較関数を定義して、listのsort関数の引数に渡すことで実現できます。雨蛙 さんが書きました: int型のソートの仕方などはわかったのですが、クラス中の変数を使ってソートする方法がよくわからず、
ここがわかれば何とかなりそうです。
サンプルコードを書いてみました。
#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等でのアイテムの処理
ありがとうございます
比較関数をitemクラスに持たせればいいのですね
あと、後出しになってしまって申し訳ないのですが、変数を指定してソートする簡単な方法はないでしょうか?
たとえばitemクラスが、
int price とint typeの二つの関数を持つ場合に、
sort( price )やsort ( type )のようにソートするにはどうすればいいのでしょうか。
さらには、type=1のものだけを抜き出して、priceの順にソートする方法なども知りたいです。
もうひとつ、プレイヤークラスにアイテムのリストを持たせたい場合は、
class pleyer{
list<item> itemlist;
}
のようにして、Pleyer.itemlist.sort(&item::comp)のように指定すればいいのですか?
返信も遅く質問を後から追加してしまってすみません。
もし、RPGを作る上で、キャラクタの描画方法やマップチップなどの解説ではなく、このようなアイテムの処理方法や、クラスの使い方を解説しているサイトなどあれば教えてくださるとありがたいです
比較関数をitemクラスに持たせればいいのですね
あと、後出しになってしまって申し訳ないのですが、変数を指定してソートする簡単な方法はないでしょうか?
たとえばitemクラスが、
int price とint typeの二つの関数を持つ場合に、
sort( price )やsort ( type )のようにソートするにはどうすればいいのでしょうか。
さらには、type=1のものだけを抜き出して、priceの順にソートする方法なども知りたいです。
もうひとつ、プレイヤークラスにアイテムのリストを持たせたい場合は、
class pleyer{
list<item> itemlist;
}
のようにして、Pleyer.itemlist.sort(&item::comp)のように指定すればいいのですか?
返信も遅く質問を後から追加してしまってすみません。
もし、RPGを作る上で、キャラクタの描画方法やマップチップなどの解説ではなく、このようなアイテムの処理方法や、クラスの使い方を解説しているサイトなどあれば教えてくださるとありがたいです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: RPG等でのアイテムの処理
比較関数を増やせばよいだけだと思います。雨蛙 さんが書きました:あと、後出しになってしまって申し訳ないのですが、変数を指定してソートする簡単な方法はないでしょうか?
たとえば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です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。