我正在尝试使用C++构建俄罗斯方块对象模型。我从名为Piece(kinda伪代码)的第一个类开始:
class Piece
{
public:
Piece(SomeShape passedShape):shape(passedShape);
~Piece();
private:
int shape[4][4];
}
每一块都有一个形状(代表所有可能的俄罗斯方块形状之一的4x4阵列)。
还有类PieceFactory:
class PieceFactory
{
public:
PieceFactory();
~PieceFactory();
Piece CreatePiece() const;
private:
const int squarePiece[4][4]=
{{0, 0, 0, 0},
{0, 1, 1, 0},
{0, 1, 1, 0},
{0, 0, 0, 0}};
const int linePiece[4][4]=
{{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0}};
}
我想有一个返回随机形状的函数,而且我不知道什么是最聪明的方法。我的想法是创建一个包含所有形状的列表(这些形状是4x4数组),生成随机数,并在随机生成的索引处返回元素,即返回相应的“数组”(我的意思是指向它的指针)。还有其他更优雅的方法吗?
Piece PieceFactory::CreatePiece() const
{
int radnomNumer = generateRandom();
return new Piece(someListContainingAllShapes[randomNumber]);
}
然后,Piech实际将传递的数组复制到新数组中,以便可以编辑(例如旋转)新数组而不影响蓝图数组。
我仍然对面向对象的建模范例有疑问(尽管我有其他语言的经验),所以任何建议都将不胜感激!
最佳答案
首先,我会注意到一个包含当前模型中所有可能形状的列表将具有2^16
元素。为了减少数量,您可以建立一些等效标准,例如
{{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0}}
和
{{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{1, 1, 1, 1}}
形状相同(方向和位置不同)。但是您可以轻松地看到这是如何导致某些非常复杂和繁琐的设计的。
我的建议是首先确定形状,位置和方向起作用时真正需要的信息。我认为这是在您需要计算俄罗斯方块和底部当前形状之间的“碰撞”时发生的。分解此计算后,您将有一个更好的主意,即如何正确编码形状信息。
无论您决定如何处理低级处理,
我可能会寻求一个如下所示的类层次结构。
Pile
数据类,它描述屏幕底部的片段。它可能是一个简单的位图。一个基本的
Shape
类,它存储了片段的不可变几何形状及其可变状态(位置,方向);并使用两个与Pile
交互的虚拟方法来确定当前位置/方向是否表示与底部发生碰撞,并在发生这种情况时更新Pile
。LShape : public BaseShape {
public:
virtual bool inCollision(const Pile&) override; // true if this piece has hit the bottom
virtual void pileOnBottom(Pile&) override; // update the pile of pieces if the bottom was hit
}
这样,特定形状的责任就是正确处理碰撞。
生成随机片段的问题似乎很简单。对我来说,一个工厂类带有一个额外的
generateRandom()
,可以从已注册作品列表中选择一个随机元素。关于c++ - C++中的俄罗斯方块对象模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36128219/