#5
by たなごころ » 5年前
usao さんが書きました: ↑5年前
>「移動先のパネルが通行可能かどうか」の判定をする必要
が生じる処理を行う箇所に対しては,
std::vector<std::vector<Panel*>> なる「具体的なデータ」を渡す必要は無く,
「必要な判定を行うための手段」を渡せばよいのではないでしょうか.
例えば,「座標(x,y)が通行可能な場所であるか否かを判定する」ことだけが必要であれば,
その判定処理メソッドを有するインタフェースクラスとかの形で渡す.
言葉だけは知っていましたがインタフェースクラスというものを使えばいいんですね。
たしかに必要最低限の機能だけを渡せばスマートだし安心して使えますね。
おっしゃる通りマップ移動の場合も楽に対応できそうです。
サンプルソースの提示も含めてありがとです。
自分でまた調べますが、何となくこんな使い方かなとプログラムしてみたので、もし気が向けばレビューでももらえると嬉しいです。
コード:
#include <iostream>
using namespace std;
class IMapInfo
{
public:
//座標(x,y)が通過可能であるか否かを調べる
virtual bool IsWalkable(int x, int y) const = 0;
};
class Map : public IMapInfo
{
public:
virtual bool IsWalkable(int x, int y) const {
//(1,3)は通行不可とする
return (x == 1 && y == 3) ? false : true;
}
};
class Creature
{
private:
int _x, _y; //現在の座標
public:
Creature() { _x = 1; _y = 2; }
//移動する
void Move(Map *map) {
int vx = 0; //x方向移動量
int vy = 1; //y方向移動量
if (CanMove(*map, vx, vy)) {
_x += vx;
_y += vy;
printf("Move Success\n");
}
else {
printf("Move Failed\n");
}
}
//移動に関する意思決定を行う.
//戻り値:移動可能か.
bool CanMove(const IMapInfo &info, int vx, int vy) {
return(info.IsWalkable(_x + vx, _y + vy)) ? true : false;
}
};
int main(void) {
Map *map = new Map();
Creature *player = new Creature();
player->Move(map);
}
[quote=usao post_id=150988 time=1530178677 user_id=1166]
>「移動先のパネルが通行可能かどうか」の判定をする必要
が生じる処理を行う箇所に対しては,
std::vector<std::vector<Panel*>> なる「具体的なデータ」を渡す必要は無く,
「必要な判定を行うための手段」を渡せばよいのではないでしょうか.
例えば,「座標(x,y)が通行可能な場所であるか否かを判定する」ことだけが必要であれば,
その判定処理メソッドを有するインタフェースクラスとかの形で渡す.
[/quote]
言葉だけは知っていましたがインタフェースクラスというものを使えばいいんですね。
たしかに必要最低限の機能だけを渡せばスマートだし安心して使えますね。
おっしゃる通りマップ移動の場合も楽に対応できそうです。
サンプルソースの提示も含めてありがとです。
自分でまた調べますが、何となくこんな使い方かなとプログラムしてみたので、もし気が向けばレビューでももらえると嬉しいです。
[code]
#include <iostream>
using namespace std;
class IMapInfo
{
public:
//座標(x,y)が通過可能であるか否かを調べる
virtual bool IsWalkable(int x, int y) const = 0;
};
class Map : public IMapInfo
{
public:
virtual bool IsWalkable(int x, int y) const {
//(1,3)は通行不可とする
return (x == 1 && y == 3) ? false : true;
}
};
class Creature
{
private:
int _x, _y; //現在の座標
public:
Creature() { _x = 1; _y = 2; }
//移動する
void Move(Map *map) {
int vx = 0; //x方向移動量
int vy = 1; //y方向移動量
if (CanMove(*map, vx, vy)) {
_x += vx;
_y += vy;
printf("Move Success\n");
}
else {
printf("Move Failed\n");
}
}
//移動に関する意思決定を行う.
//戻り値:移動可能か.
bool CanMove(const IMapInfo &info, int vx, int vy) {
return(info.IsWalkable(_x + vx, _y + vy)) ? true : false;
}
};
int main(void) {
Map *map = new Map();
Creature *player = new Creature();
player->Move(map);
}
[/code]