我应该在简单的策略游戏中为各个派系使用类吗 - C++

Should I use classes for individual factions in simple strategy game - C++

本文关键字:C++ 简单 策略 游戏 我应该      更新时间:2023-10-16

我决定挑战自己,在C++中创建一个简单的风险型策略游戏。游戏将有多个派系使用各种类型的部队/单位争夺领土控制权。

我只是在游戏的基本大纲中,但我有一个基本的想法是为每个派系创建一个类:

class Windows {
private:
bool isWindows = true;
// Characteristics etc.
};
class Mac {
private:
bool isMac = true;
// Characteristics etc.
};
class Linux {
private:
bool isLinux = true;
// Characteristics etc.
};

之后,单位的各个类别将继承其所属派系的某些特征,例如:class Penguin: private Linux {//Code};

这是最好的方法,还是有更好的方法减少课程?

如果派系有相似之处,请使用基类,他们为每个派系和派系类制作单独的子类作为单位的基类。

听起来不同的派系对同一组特征有不同的设置,这表明您应该有一个Faction类并具有不同的Faction实例。

我假设你只需要每个派系的一个实例。它们可以是一种单例。在 c++ 中执行单例的惯用方法是使用返回对局部静态变量的引用的函数:

class Faction {
// Characteristics etc.
};
const Faction& windows() {
static Faction f{ /* initialize with windows characteristics */ };
return f;
}
const Faction& mac() {
static Faction f{ /* initialize with mac characteristics */ };
return f;
}
const Faction& linux() {
static Faction f{ /* initialize with linux characteristics */ };
return f;
}

那么像Penguin这样的类,而不是从Faction继承的,可以使用Faction的linux实例。例如,它可以保留对其派系的引用:

class Penguin {
const Faction& faction = linux();
public:
void someAction() {
// use faction reference
}
};

我建议你尽量避免像"isLinux"这样的检查,因为它会使代码变得脆弱,而是依赖于派系对象本身的特征。如果您引入新派系,必须更改的代码越少越好。如果您确实需要检测派系的类型,那么因为派系实例是单例的,您可以比较地址:

bool isWindows(const Faction& f) { return &f == &windows(); }
bool isLinux(const Faction& f) { return &f == &linux(); }
bool isMac(const Faction& f) { return &f == &mac(); }

如果这样做,最好防止复制Faction对象,以便您可以依赖它位于正确的地址:

class Faction {
// ...
// uncopyable
Faction(const Faction&) = delete;
Faction& operator=(const Faction&) = delete;
};

现场演示。