俄罗斯方块是一款经典的电子游戏,其核心玩法是通过移动和旋转下落的方块,使其在底部连续排列并消除,从而获得分数。本文将介绍如何使用VisualC++和DirectX开发一个简单的俄罗斯方块游戏。
游戏的控制非常简单。使用左箭头和右箭头键来移动方块向左或向右,上箭头或'R'键来旋转方块,下箭头键来加速方块下落,中心键(5)来直接下落方块。
游戏的目标是让方块连续排列成一行。当一行被填满时,该行会被消除,玩家会获得相应的分数。
要构建该项目,需要以下软件:
要运行游戏,需要:
代码中包含了许多注释,这将有助于理解代码。
该项目由以下类组成:
类CDisplay和CSurface由Microsoft创建,并随DirectX SDK一起提供。作者使用DirectX 8 SDK开发了这款游戏,它应该可以在DirectX 7上正常工作,但作者未进行测试。要运行游戏,只需要DirectX 7。需要调整项目设置以反映DirectX SDK路径。
游戏开始时会创建两个形状。一个是当前下落的形状,另一个是下一个形状。当一个形状触底时,它会被添加到已放置的方块列表中,并创建一个新的下一个形状。
每消除一行方块,玩家将获得10 * NumberOfLinesRemoved * NumberOfLinesRemoved * GameSpeed
的分数。当一个形状触底,并且一些方块在灰色线上方时,游戏结束。可以通过菜单开始新游戏。
在级别菜单下,可以选择游戏速度。如果将游戏设置为疯狂模式,将获得奇怪的形状。在游戏中添加自己的形状也很容易。只需要将形状添加到数组并更新数组信息即可。
m_pStockShapes数组保存了形状定义。
const short CShape::m_pStockShapes[] = {
11, // No Of shapes in the array
2, // No of orientation shapes
4, // No Of blocks for this shape
2,
1,
2,
2,
3,
2,
3,
3,
// O1
1,
2,
2,
2,
2,
1,
3,
1,
// O2
0, // Each shape ends with a 0
};
SBlock结构保存了方块的坐标和颜色。
struct SBlock {
short nX, nY, nColor;
};
CBlockList将是CShape类和CFlooredBlocks类的父类。它包含维护链表的方法。
class CBlockList {
public:
bool IsOccupied(short nX, short nY);
bool Insert(SBlock Block);
bool Add(const SBlock Block);
void Display(short nX=0, short nY);
bool Delete(SBlock Block);
void Destroy();
};
CFlooredBlocks维护已放置在地板上的方块列表。所有下落的形状都被添加到这个列表中。
class CFlooredBlocks : public CBlockList {
RECT m_rcBoundary; // Holds the playing area
public:
void Display();
short CheckAndRemoveContinuousBlocks();
IncrementYabove(short nY);
bool IsOccupied(short nX, short nY);
bool Insert(SBlock Block);
};
CShape类从给定的数组中创建形状。它有助于移动形状并检查它是否超出边界或撞到其他方块。
class CShape : public CBlockList {
CFlooredBlocks* m_pFlooredBlocks;
public:
bool CreateRandShape();
bool MoveTo(int x1, int y1);
bool MoveRight();
bool MoveLeft();
bool MoveDown();
bool Rotate();
void Display();
void ConvertToSpaceCoord();
bool SetMaxNoOfShapesAllowed(short nMax);
};