以前写过C++版的俄罗斯方块,后来老师让写双人版,刚开始大家都认为是把所有的代码copy一遍就行了,但实际并不是这样,这样做并不能实现双人版。
在老师的提示下,我们写出来C++版的俄罗斯方块游戏,现在把它移植到VC下,让界面更好看些。
一. 功能需求:
1. 能进行双人模式:
这是程序的主要功能。
2. 能进行下一砖块的预测:
这也是俄罗斯方块游戏的基本功能,可以在这个基础上进行扩展其他功能,如不同于经典模式的砖块显示等来增加难度。
二. 总体设计计:
1.矩形框类的设计:
设计CBin类描述Tetris游戏的矩形框,用image的二维数组来描述这个矩形框。设置不同的值显示不同颜色的矩形,若没有砖块则为0。
2.砖块的设计:
设计CBrick抽象类来设计砖块,应用多态性的原理,其他不同类型的砖块类继承CBrick,来设计不同的砖块。
3.砖块在面板中的显示设计:
在视图类中设计并显示砖块。
三. 详细设计:
1.矩形框类的设计:
设计CBin类描述Tetris游戏的矩形框,用image的二维数组来描述这个矩形框。设置不同的值显示不同颜色的矩形,若没有砖块则为0。
CBin类的五个成员函数:
(1) CBin(unsigned int unsigned int h)
构造函数,用来初始化数据成员,width和height,并为image分配空间并初始化。
(2) ~CBin()
析构函数,删除在构造函数中为image分配的空间。
(3) Void getImage(unsigned char*destImage)
将image的数据拷贝到destImage,你可以假设destimage指向的空间足够容纳image的空间。
(4) Void setImage(unsigned char**srcImage)
把srcImage中的数据拷贝到image,你可以假设srcImage是一个合法的指针。
(5) Unsigned int removeFullLines()
检查image,如果任何一行完全填满,则删除这一行,并让上面一行的数据下移,返回删除的总行数。
设计代码如下:
class CBin {
private:
unsigned char** image;
unsigned int width;
unsigned int height;
public:
CBin(unsigned int w, unsigned int h);
~CBin();
unsigned int getWidth() { return width; };
unsigned int getHeight() { return height; };
void getImage(unsigned char** destImage);
void setImage(unsigned char** srcImage);
unsigned int removeFullLines();
};
CBin::CBin(unsigned int w, unsigned int h)
{
width=w;
height=h;
image = new unsigned char* [height];
for (unsigned int i = 0; i<height; i++)
{
image[i] = new unsigned char [width];
for (unsigned int j = 0; j<width; j++)
image[i][j]=0;
}
}
CBin::~CBin()
{
for (unsigned int i=0; i<height; i++) {
delete image[i];
}
delete[] image;
}
void CBin::getImage(unsigned char** destImage)
{
for (unsigned int i = 0; i<height; i++)
for (unsigned int j = 0; j<width; j++)
destImage[i][j]=image[i][j];
}
void CBin::setImage(unsigned char** srcImage)
{
for (unsigned int i = 0; i<height; i++)
for (unsigned int j = 0; j<width; j++)
image[i][j]=srcImage[i][j];
}
unsigned int CBin::removeFullLines()
{
unsigned int flag,EmptyLine=0;
unsigned int i,j,m;
for (i=0; i<height; i++)
{
flag=0;
for (j=0; j<width; j++)
{
if (image[i][j]==0 )
flag=1;
}
//一行完全被填满
if(flag==0)
{
for (j=0; j<width; j++)
{
image[i][j]=0;
}
//消除整行
for(m=i; m>0; m--)
{
for (j=0; j<width; j++)
{
image[m][j]=image[m-1][j];
}
}
for (j=0; j<width; j++)
{
image[0][j]=0;
}
EmptyLine++; //记录消的行数
i--;
}
}
return EmptyLine;
}
2.砖块的设计:
设计CBrick抽象类来设计砖块,应用多态性的原理,其他不同类型的砖块类继承CBrick,来设计不同的砖块。
CBrick类的成员函数:
(1) int shiftLeft(CBin *bin
将砖块在游戏的矩形框内左移一位。注意座椅可能产生冲突