1、俄罗斯方块游戏的设计与实现目 录一、综合训练目的与要求11-1 训练目的11-2 训练要求1二、综合训练任务12-1 训练任务12-2 任务描述1三、总体设计23-1 运行环境23-2 游戏的总体设计思路:23-3 游戏功能图:23-4 游戏流程图33-5 类的关系图3四、详细设计说明34-1 游戏的开始,结束,退出34-1-1、游戏的开始34-1-2 游戏的退出44-2 形状的随机产生44-2-1 形状的表示:44-2-2 形状的随机产生44-2-3 形状随机旋转n( n 开始按钮时,游戏开始进行。 首先初始化游戏:调用CRussia类对象的中m_russia.InitGame()操作,然后
2、设置游戏的默认等级,游戏状态,游戏得分等;M_russia.InitGame()中的主要设置如下:m_board.ResetSize(width, height);m_currentShape.CreateRandomShape();m_nextShape.CreateRandomShape();InitShapePos();m_hasShape = true;m_score = 0;m_status = RS_NORMAL;其中界面实现是菜单操作,菜单项和响应事件完成。 ID_START-开始-OnStart()4-1-2 游戏的退出 当点击界面中的游戏退出按钮时,出发OnQuit()函数,
3、退出游戏整个界面。OnQuit()函数给系统发送窗口关闭的消息,用系统将窗口关闭。SendMessage(WM_CLOSE);4-2 形状的随机产生4-2-1 形状的表示:形状类封装了矩阵类对象,形状的旋转主要通过矩阵的旋转来完成,因此形状类中主要完成7种形状在矩阵上的表示,其用来存储矩阵的数据结构时数组,我们用整型数0 和 1 来表示矩阵中方块的无和有,这样,7种形状即可表示如下:0100111000000000反T型1111000000000000直线型1100011000000000Z型0011011000000000反Z型0001000100110000反L型1000100011000
4、000L型1100110000000000正方形图4-2-1 形状在矩阵中的表示4-2-2 形状的随机产生 调用系统的随即数产生函数random()*6,产生06这七个随机数,分别对应上述七种形状,然后用switch语句随机选择形状中的任意一个,即可完成形状的随机产生。4-2-3 形状随机旋转n( n 1000#pragma once#endif / _MSC_VER 1000/以上几行都是在类视图下,用new class自动生成的代码#ifndef NULL#define NULL 0#endifclass CMatrix public:CMatrix();CMatrix(int width
5、, int height);CMatrix(int width, int height, int initValue);virtual CMatrix();void ResetSize(int width, int height); /重置矩阵的宽和高void SetAll(int value); /设置所有单元格的值void SetAt(int row, int col, int value); /设置指定单元格的值int GetWidth() const; /const主要是指明该函数不修改类中的非静态成员的值int GetHeight() const;int GetAt(int row,
6、 int col) const;bool Rotate(bool clockWise = true);/矩阵的旋转int* operator(int row) const; /重载, 返回矩阵的首指针CMatrix& operator=(CMatrix &srcMat); /重载=, 以便矩阵的直接复制protected:int *m_pData; /矩阵的首指针int m_width; /矩阵的宽int m_height; /矩阵的高protected:void ReleaseData(); /清楚矩阵中的所有数据void InitData(int width, int height); /
7、void SetData(int initValue);static void MemCopy(int *dest, int *src, int len);#endif / !defined(AFX_MATRIX_H_D99244D0_ACB9_4087_A4AF_DB379A4DC7BE_INCLUDED_)8-1-2 CMatrix类的定义/ Matrix.cpp: implementation of the CMatrix class./#include stdafx.h#include Matrix.h/ Construction/Destruction/CMatrix:CMatrix
8、()m_pData = NULL;m_width = m_height = 0;CMatrix:CMatrix(int width, int height)InitData(width, height);CMatrix:CMatrix(int width, int height, int initValue)InitData(width, height);SetData(initValue);void CMatrix:ResetSize(int width, int height)InitData(width, height);void CMatrix:SetAll(int value)Set
9、Data(value);void CMatrix:SetAt(int row, int col, int value)if (row = m_height | col = m_width)return;*(m_pData + row * m_width + col) = value;int CMatrix:GetWidth() constreturn m_width;int CMatrix:GetHeight() constreturn m_height;int CMatrix:GetAt(int row, int col) constif (row = m_height | col = m_
10、width)return 0;return *(m_pData + row * m_width + col);bool CMatrix:Rotate(bool clockWise)int i, j;int *pNew = new intm_width * m_height; /申请新矩阵if (pNew = NULL)return false;if (clockWise)/当clockwise为true时,逆时针旋转for (i=0;im_height;i+)for (j=0;jm_width;j+)*(pNew + j * m_height + (m_height - i - 1) = *(
11、m_pData + i * m_width + j);else/当clockwise为false时,逆时针旋转for (i=0;im_height;i+)for (j=0;jm_width;j+)*(pNew + (m_width - j - 1) * m_height + i) = *(m_pData + i * m_width + j);ReleaseData();m_pData = pNew;m_width = i;m_height = j;return true;int* CMatrix:operator(int row) constif (row = m_height)return
12、NULL;return (m_pData + row * m_width);CMatrix& CMatrix:operator=(CMatrix &srcMat)ReleaseData();InitData(srcMat.m_width, srcMat.m_height);CMatrix:MemCopy(m_pData, srcMat.m_pData, m_width * m_height);return *this;CMatrix:CMatrix()ReleaseData();void CMatrix:ReleaseData()if (m_pData != NULL)delete m_pDa
13、ta;m_pData = NULL;m_width = m_height = 0;void CMatrix:InitData(int width, int height)ReleaseData();if (width = 0 | height = 0)return;m_pData = new intwidth * height;if (m_pData != NULL)m_width = width;m_height = height;void CMatrix:SetData(int initValue)int i, j;for (i=0;im_height;i+)for (j=0;jm_wid
14、th;j+)*(m_pData + i * m_width + j) = initValue;void CMatrix:MemCopy(int *dest, int *src, int len)if (dest = NULL | src = NULL)return;int i;for (i=0;i 1000#pragma once#endif / _MSC_VER 1000/(以上代码都是在类视图中,用new class新建类时自动生成的代码)#include Matrix.h#include common.hclass CShape public:CShape();virtual CShap
15、e();void CreateRandomShape(int posX = 0, int posY = 0); /随机产生七个形状中的任一个void SetPos(int posX, int posY); /设置形状左上角的坐标(posX,posY)void Rotate(); /形状的旋转void CancelRotate(); /取消旋转,主要用在旋转时越界的情况。void MoveDown(); /下移void MoveUp(); /上移,主要用在下一过程中碰到地盘的情况void MoveLeft(); /左移void MoveRight(); /右移int GetShapeType()
16、 const; /获取形状的类型(类型用整型的0-6表示)POINT GetPos() const; /得到形状左上角的坐标(形状所在的矩阵在地盘上的坐标)int GetWidth() const; /得到形状的宽度int GetHeight() const; /得到形状的高度const int* operator(int row) const; /重载操作符,便于获取矩阵中单元格的值CShape& operator=(CShape& srcShape); /重载操作符=,以便形状直接拷贝,主要用在 /当前形状固定时,把下一个形状赋给当前 /形状;protected:CMatrix m_mat
17、; /封装的矩阵类对象;int m_type; /用以标明当前方块的形状bool m_needJump; /除去正方形的方块外,剩下的方块旋转时有的会有4种形状,/有的只有2种,因此可用bool型标明;int m_posX; /当前方块所在的矩阵m_mat在底盘上的横坐标;int m_posY; /当前方块所在的矩阵m_mat在底盘上的横坐标;protected:void RandCreate(); /随机产生一个方块;void RandRotate(); /随机将方块选装n(n 4)次;void RotateShape(bool clockwise); /旋转方块;主要是通过其封装的矩阵的旋转实现的;#endif / !defined(AFX_SHAPE_H_E8F2190E_01BF_4F92_B29D_27412A279F1D_INCLUDED_)8-2-2 CShape类的定义/ Shape.cpp: implementation of the CShape class./CShape类中功能的实现/#include stdafx.h#include Shape.h#include stdlib.h#include time.h/ Construction/Destruction/