VC 6.0 面向对象的俄罗斯方块尝试(部分注释)
前阵子发过一个帖子,上传了自己写的俄罗斯方块。但是由于工作比较忙没时间写说明,现在补上。
俄罗斯方块写过好几次了,每次的感觉都不一样,都有新的收获。就像达芬奇画鸡蛋一样,虽然都是画同样的鸡蛋,但是每次都有不同的收获。
先来看看我们需要的是一个怎么样的程序。
首先要有2个大功能:1.开始游戏 2.退出游戏。其中要编程的主要工作都集中在“开始游戏”之后的过程中。俄罗斯方块的游戏规则相信大家一定都不陌生,也许还有不少人都是骨灰级玩家了,但是在此还是有必要说明一下游戏的规则,因为从编程和玩家的两个不同角度来观察游戏规则,还是有微妙的区别的――侧重的东西不同。
游戏在一个m*n的矩形框内进行。游戏开始时,矩形框的顶部会随机出现一个由四个小方块构成的形状,每过一个很短的时间(我们称这个时间为一个tick),它就会下落一格,直到它碰到矩形框的底部,然后再过一个tick它就会固定在矩形框的底部,成为固定块。接着再过一个tick顶部又会出现下一个随机形状,同样每隔一个tick都会下落,直到接触到底部或者接触到下面的固定块时,再过一个tick它也会成为固定块,再过一个tick之后会进行检查,发现有充满方块的行则会消除它,同时顶部出现下一个随机形状。直到顶部出现的随机形状在刚出现时就与固定块重叠,表示游戏结束。
说的有点罗嗦,但是细细分析一下每隔tick之间发生事情的顺序对理清程序思路有好处。
接下来开始分析程序的设计了。
照理应该从大的设计一步一步往下细分的,但由于时间有限,我就反过来从小的往大的讲了,请谅解。我会尽量把问题说明白。
显然俄罗斯方块是一个简单的游戏,因为它都是基于矩阵的。既然是面向对象的方法来写,那么我们首先应该封装一个矩阵类,权且叫做CMatrix吧。
class CMatrix //矩阵类,这是一个整形矩阵类型
{
public:
//默认构造函数。
CMatrix();
//根据构造函数参数创建指定大小的矩阵
CMatrix(int width, int height);
//根据构造函数参数创建指定大小的矩阵,并为矩阵的每个元素统一分配一个初始值。
CMatrix(int width, int height, int initValue);
virtual ~CMatrix();
//重新设置矩阵的尺寸。
void ResetSize(int width, int height);
//将左右元素设置为一个值。
void SetAll(int value);
//设置row行col列的元素值为value。
void SetAt(int row, int col, int value);
//获取矩阵宽度。
int GetWidth() const;
//获取矩阵高度。
int GetHeight() const;
//获取row行col列元素的值。
int GetAt(int row, int col) const;
//旋转矩阵,参数为是否顺时针。
bool Rotate(bool clockWise = true);
//获取第row行指针,调用者可以通过“(CMatrix对象)[行][列]”来获取或设置元素。
int* operator[](int row) const;
//重载等号运算符,其实也可以写拷贝构造函数。
CMatrix& operator=(CMatrix &srcMat);