ã¬ã¬ã·ãŒç¬¬15ç« ïŒããŒã¿é§åèšèšïŒData-DrivenïŒãšã¹ã¯ãªããããŒããŒ
ããŒãã³ãŒãè±åŽïŒããã¹ã/CSVã¹ããŒãžå®çŸ©ããŒãµãŒãšåçãšã³ãã£ãã£çæ
ãæµã®åºçŸåº§æšã10ãã¯ã»ã«ããããããã¹ã®HPã100å¢ãããââããããã²ãŒã ãã©ã³ã¹ã®åŸ®èª¿æŽãè¡ããã³ã«ãC++ã³ãŒããæžãæããŠãã«ããåããŠããŸãããïŒããŒã éçºãèŠæš¡ã®æ¡å€§ã«ãããŠãã²ãŒã ãã©ã¡ãŒã¿ã®ããŒãã³ãŒãã¯éçºé床ãèŽåœçã«äœäžãããŸããæ¬ç« ã§ã¯ãã²ãŒã ã®ããžãã¯ïŒããã°ã©ã ïŒãšã«ãŒã«ã»æ°å€ã»æ§æïŒããŒã¿ïŒãå®å
šã«åãé¢ããããŒã¿é§åèšèšïŒData-Driven DesignïŒããå®è·µãC++ã®æšæºæååã¹ããªãŒã ïŒstd::stringstreamïŒã掻çšããé«éã»å®å
šãªCSV/ããã¹ãã¹ããŒãžããŒããŒãæ§ç¯ããæååèå¥åãã察å¿ããæµã€ã³ã¹ã¿ã³ã¹ãåçã«çæããããšã³ãã£ãã£ãã¡ã¯ããªã¬ãžã¹ããªããå®è£
ããŸããåã³ã³ãã€ã«äžèŠã§ã¹ããŒãžãç¡éã«å¢ããçœå¿«æãäœæããŠãã ããã
L15.1 ãæµã®HPã1å€ããã®ã«10åã³ã³ãã€ã«ãïŒããŒãã³ãŒãå°çã®çµç
ãªãããã°ã©ã ã³ãŒãå
ã«ã²ãŒã ã®ãã©ã¡ãŒã¿ãçŽæ¥æžããŠã¯ãããªãã®ãïŒãã®æ¬è³ªçãªçç±ãè§£ãæãããŸãã
ð§ ãã³ã®ã³å
茩
ã·ãã¯ãå
çâŠã²ãŒã ãã¶ã€ããŒãããããã¹ããŒãž2ã®æµã®åºçŸæ°ã 5äœãã6äœã«å¢ãããŠãHPã40ãã35ã«ããŠããšé ŒãŸãããã³ã«ãC++ã³ãŒããçŽããŠãªãã«ãããŠããŸãâŠ1æ¥äžã³ã³ãã€ã«åŸ
ã¡ã§æ¥ãæ®ããŠããŸããŸããâŠ
ð»ââïž ã·ãã¯ãå
ç
ãµãã£ãµãã£ãµãïŒããããããããŒãã³ãŒãå°çããããªïŒã³ãŒãã®äžã«ã¹ããŒãžã®æµé
眮ããã©ã¡ãŒã¿ãçŽæ¥æžã蟌ãã§ãããããã²ãŒã ãã©ã³ã¹èª¿æŽã®ãã³ã«ãã«ããèµ°ãã®ããã
ð§ ãã³ã®ã³å
茩
ã§ããæµãäœã new Enemy(x, y, hp); ã£ãŠC++ã®åœä»€ã§ãããïŒå€éšãã¡ã€ã«ããã©ããã£ãŠC++ã®ãªããžã§ã¯ããäœãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ããã°ã©ã ïŒãšã³ãžã³ïŒã¯ãã«ãŒã«ãå®è¡ããåšãã«åŸ¹ããã¹ããŒãžã®æ§æãæµã®ã¹ããŒã¿ã¹ã¯ãå€éšã®ããã¹ããã¡ã€ã«ïŒCSVãJSONïŒãããèªã¿èŸŒãã§åçã«çæããã®ããïŒãããã²ãŒã æ¥çã®åºæ¬äžã®åºæ¬ããããŒã¿é§åèšèšïŒData-Driven ArchitectureïŒãããïŒ
L15.2 æååã¹ããªãŒã ã«ããå
ç¢ãªããã¹ãããŒãµãŒã®å®è£
std::stringstream ãš std::getline ãé§äœ¿ããŠãã³ã¡ã³ãè¡ãäžæ£ããŒã¿ãå®å
šã«åŠçããããŒãµãŒãäœããŸãã
ð StageLoader.cpp
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
struct SpawnCommand {
std::string type;
int x;
int y;
int hp;
};
class StageLoader {
public:
static bool parseStageData(const std::string& script, std::vector<SpawnCommand>& outCommands) {
std::istringstream stream(script);
std::string line;
int lineNum = 0;
while (std::getline(stream, line)) {
lineNum++;
// 空è¡ã # ã§å§ãŸãã³ã¡ã³ãè¡ãã¹ããã
if (line.empty() || line[0] == '#' || line[0] == ';') {
continue;
}
std::stringstream lineStream(line);
std::string type;
int x, y, hp;
// æžåŒ: TYPE X Y HP
if (lineStream >> type >> x >> y >> hp) {
SpawnCommand cmd;
cmd.type = type;
cmd.x = x;
cmd.y = y;
cmd.hp = hp;
outCommands.push_back(cmd);
std::cout << "[Line " << lineNum << "] æ£åžžããŒã¹: "
<< type << " at (" << x << ", " << y << ") HP=" << hp << std::endl;
} else {
std::cerr << "[Line " << lineNum << " èŠå] äžæ£ãªæžåŒã®ããã¹ããã: " << line << std::endl;
}
}
return true;
}
};
int main() {
std::cout << "=== ã¹ããŒãžã¹ã¯ãªããã®ããŒã¹ãã¹ã ===" << std::endl;
std::string sampleStage =
"# Stage 1: åçŽã€ã³ããŒããŒé²è¡æŠ\n"
"# TYPE X Y HP\n"
"INVADER 100 80 10\n"
"INVADER 150 80 10\n"
"\n"
"# äžãã¹åºçŸ\n"
"COMMANDER 250 120 50\n"
"INVALID_LINE_DATA_TEST\n" // äžæ£ãªè¡
"BOSS 300 200 200\n";
std::vector<SpawnCommand> commands;
StageLoader::parseStageData(sampleStage, commands);
std::cout << "\nèªã¿èŸŒã¿æåã³ãã³ãæ°: " << commands.size() << std::endl;
return 0;
}
L15.3 åçãšã³ãã£ãã£ãã¡ã¯ããªïŒæååããã€ã³ã¹ã¿ã³ã¹ãçã¿åºãã¬ãžã¹ããª
if-elseã®é£æã远æŸãã颿°ãã€ã³ã¿ã®ãããã§æ¡åŒµæ§ã«åªãããªããžã§ã¯ãçæåšãæ§ç¯ããŸãã
ð EntityFactory.cpp
#include <iostream>
#include <string>
#include <map>
// åºåºãšã³ãã£ãã£
class Entity {
public:
virtual ~Entity() {}
virtual void show() const = 0;
};
class Invader : public Entity {
public:
void show() const { std::cout << "ðŸ ã€ã³ããŒããŒåºçŸïŒ" << std::endl; }
};
class BossEnemy : public Entity {
public:
void show() const { std::cout << "ð¹ ãã¹èŠåºçŸïŒå€§èŠå ±çºä»€ïŒ" << std::endl; }
};
// çæé¢æ°ãã€ã³ã¿å
typedef Entity* (*CreateFunc)();
class EntityFactory {
private:
std::map<std::string, CreateFunc> registry_;
public:
void registerType(const std::string& typeName, CreateFunc func) {
registry_[typeName] = func;
}
Entity* create(const std::string& typeName) {
std::map<std::string, CreateFunc>::iterator it = registry_.find(typeName);
if (it != registry_.end()) {
return it->second(); // ç»é²ãããçæé¢æ°ãåŒã³åºã
}
std::cerr << "æªç»é²ã®ãšã³ãã£ãã£å: " << typeName << std::endl;
return NULL;
}
};
Entity* createInvader() { return new Invader(); }
Entity* createBoss() { return new BossEnemy(); }
int main() {
EntityFactory factory;
factory.registerType("INVADER", createInvader);
factory.registerType("BOSS", createBoss);
std::cout << "=== å€éšã¹ã¯ãªããã®æååããçæ ===" << std::endl;
Entity* e1 = factory.create("INVADER");
Entity* e2 = factory.create("BOSS");
if (e1) e1->show();
if (e2) e2->show();
delete e1;
delete e2;
return 0;
}
ð¡ ãã®ã»ã¯ã·ã§ã³ã®éèŠãã€ã³ã
- ã³ãŒããšããŒã¿ã®å¢çç·: ããžãã¯ã¯ã³ã³ãã€ã«ãããã³ãŒãã«ãåºçŸäœçœ®ã»ãã©ã¡ãŒã¿ã»ã·ããªãªã¯å€éšããŒã¿ã«å®å
šã«åé¢ããã
- ããŒã¹èé害æ§: ããŒã¿ã«èšè¿°ãã¹ããã£ãŠãããã»ã¹ãèœãšãããèŠåãã°ãåºããŠäžæ£è¡ã ããã¹ãããããå
ç¢æ§ãæãããã
- ãã¡ã¯ããªã¬ãžã¹ããª: æååååããçæé¢æ°ãã«ãã¯ã¢ããããã¬ãžã¹ããªæ§é ã«ãããæ°çš®æµã®è¿œå æã«ããŒãµãŒãäžåä¿®æ£ããªããŠæžãã
- éçºå¹çã®ççºçåäž: ãã©ã³ããŒãã¬ãã«ãã¶ã€ããŒãç¬èªã«ã¹ããŒãžãäœæã»ãã¹ãã§ããããã«ãªããããŒã å
šäœã®çç£æ§ãåäžããã
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. ã²ãŒã éçºã«ãããŠãããŒã¿é§åèšèšïŒData-Driven DesignïŒããæ¡çšããæå€§ã®å©ç¹ã¯äœã§ããïŒ
- 1. ããã°ã©ã ã®å®è¡é床ãCèšèªãã10åéããªããã
- 2. ãã©ã¡ãŒã¿ãã¹ããŒãžæ§æã倿Žãããã³ã«åã³ã³ãã€ã«ããå¿
èŠããªããªããéçºã»èª¿æŽå¹çãåçã«åäžãããã
- 3. ã¡ã¢ãªäœ¿çšéãåžžã«0ãã€ãã«ãªããã
- 4. ãã¹ãŠã®å€æ°ãã°ããŒãã«å€æ°ãšããŠæ±ããããã«ãªããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒãã©ã¡ãŒã¿ãã¹ããŒãžæ§æã倿Žãããã³ã«åã³ã³ãã€ã«ããå¿
èŠããªããªããéçºã»èª¿æŽå¹çãåçã«åäžãããã
ããŒã¿é§åèšèšã§ã¯ãæµã®ãã©ã¡ãŒã¿ãã¹ããŒãžé
眮ãªã©ã®ããŒã¿ãå€éšãã¡ã€ã«ã«éãããããã³ã³ãã€ã«ããããšãªãå³åº§ã«ã²ãŒã ãã©ã³ã¹ã®èª¿æŽãæ°ã¹ããŒãžã®è¿œå ãå¯èœã«ãªããŸãã
Q2. æåååïŒ"INVADER" ãªã©ïŒãã察å¿ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãçæããä»çµã¿ãšããŠãæãæ¡åŒµæ§ãé«ãæšå¥šãããèšèšã¯ã©ãã§ããïŒ
- 1. 倧éã® if-else ã巚倧㪠switch æãåäžã®é¢æ°å
ã«æžã䞊ã¹ã
- 2. ååæååãšçæé¢æ°ãã€ã³ã¿ã察å¿ä»ããããã¡ã¯ããªã¬ãžã¹ããªïŒstd::mapçïŒããçšæãã
- 3. Cèšèªã® goto æã§åçæã©ãã«ã«ãžã£ã³ããã
- 4. ã¯ã©ã¹åã eval() 颿°ã§çŽæ¥å®è¡ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒååæååãšçæé¢æ°ãã€ã³ã¿ã察å¿ä»ããããã¡ã¯ããªã¬ãžã¹ããªïŒstd::mapçïŒããçšæãã
ååæååãšçæé¢æ°ãç»é²ïŒã¬ãžã¹ããªç»é²ïŒã§ãããã¡ã¯ããªã¯ã©ã¹ãçšæãããšãæ°ããæµçš®å¥ã远å ããéã«æ¢åã®ããŒãµãŒã³ãŒããäžåæ¹å€ããå¿
èŠããªããªããééååïŒOCPïŒãéµå®ã§ããŸãã
Q3. å€éšã¹ããŒãžãã¡ã€ã«ãããŒã¹ããéãåçšå質ã®ããŒããŒãå¿
ãåããã¹ããèé害æ§ïŒFault ToleranceïŒããšã¯äœã§ããïŒ
- 1. æ§æãšã©ãŒã1ç®æã§ããã£ããå³åº§ã« abort() ã§ã²ãŒã ãèœãšã
- 2. ãšã©ãŒãèµ·ããŠãç¡èŠããŠæªåæåã®ãŽãã¡ã¢ãªã®ãŸãŸãšã³ãã£ãã£ãçæãã
- 3. äžæ£ãªè¡ãååšããªãèå¥åããã£ãŠãã¯ã©ãã·ã¥ãããè¡çªå·ä»ãã®èŠåãåºåããŠè©²åœè¡ã®ã¿ãã¹ããããããŒã¹ãå®èµ°ããã
- 4. äžæ£ãªããã¹ããèªåçã«C++ãœãŒã¹ã³ãŒãã«æžãçŽããŠåã³ã³ãã€ã«ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒäžæ£ãªè¡ãååšããªãèå¥åããã£ãŠãã¯ã©ãã·ã¥ãããè¡çªå·ä»ãã®èŠåãåºåããŠè©²åœè¡ã®ã¿ãã¹ããããããŒã¹ãå®èµ°ããã
å®åç°å¢ã§ã¯ãã©ã³ããŒã®æã¡ééãïŒã¿ã€ããã«ã³ãæãïŒãæ¥åžžè¶é£¯äºã§ãã1ç®æã®ãã¹ã§ã²ãŒã ãèœã¡ãŠããŸããšäœæ¥ãäžæãããããè¡çªå·ãšãšã©ãŒå
容ããã°ã«åºåãã該åœç®æãã¹ãããããŠãã¹ããã¬ã€ãç¶ç¶ã§ããå
ç¢æ§ãäžå¯æ¬ ã§ãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â