记MFC俄罗斯方块制作过程

经过几天努力,终于做好了我的俄罗斯方块,这是我用MFC做的第一个游戏,也是第一个像样的东西。下面都是个人感受,也不知道对不对,不对的话大家不要笑我哦,希望能帮我指出错误来。

感觉做这个游戏需要先理解MFC和win32的运行机制,windows运行是靠消息的传递。我的游戏运行效果图是这样的:

具体开始制作了,首先要准备一张背景图,在视类里读取,然后在OnDraw()里显示,这样,当程序最小化恢复的时候就可以保证画面不会丢失。

做完背景,就可以正式开始制作方块的主要部分。

在这里,方块类要包括:初始化,生成新方块,方块的下落过程,向左,右,下移动,方块变形,将方块画到屏幕上,记录消除行数和等级,消除一行这些方面。

 

Code:
  1. const int BLOCK_LINE = 20;//当前地图的行数   
  2. const int BLOCK_ROW = 10;//当前地图的列数   
  3. class CBlock   
  4. {   
  5. public:   
  6.     CBlock(void);   
  7.     ~CBlock(void);   
  8. private:   
  9.     // 当前方块形状   
  10.     int m_BlockShape;   
  11.     //下一个方块形状   
  12.     int m_nextBlockShape;   
  13.     //当前方块状态   
  14.     int m_BlockState;   
  15.     //等级   
  16.     int m_BlockLevel;   
  17.     //当前可消行数   
  18.     int m_BlockCurDelLine;   
  19.     //游戏是否在执行   
  20.     bool m_blockRunning;   
  21.     //当前方块位置   
  22.     POINT m_BlockPos[4];   
  23.     //下个方块位置   
  24.     POINT m_nextBlockPos[4];   
  25.     //当前的屏幕状态   
  26.     //BLOCK_LINE是行数,BLOCK_ROW是列数   
  27.     int m_Blockmap[BLOCK_LINE][BLOCK_ROW];   
  28. public:   
  29.     // 初始化游戏   
  30.     void BlockInit( void );   
  31. private:   
  32.     // 记录方块图形   
  33.     CBitmap m_bmpBlock[7];   
  34. public:   
  35.     //创建一个新的方块出来,这里只给方块形状赋值   
  36.     void CreateNewBlock(void);   
  37. private:   
  38.     //这里给方块位置赋值,   
  39.     //shape是形状, pt[]是用来接收方块坐标的(方块形状的排列坐标)数组   
  40.     //xPos是偏移量,就是方块显示位置和方块显示的框的最左边的差   
  41.     void MakeNewBlock(int shape, POINT pt[], int xPos);   
  42. public:   
  43.     //将方块画在对应的DC上   
  44.     void DrawBlock(CDC* pDC);   
  45.     //方块的下落过程,主要部分   
  46.     void BlockDropDown(CDC* pDC);   
  47. private:       
  48.     // 隐藏方块   
  49.     void HideBlock(CDC* pDC);   
  50.     // 背景图片变量   
  51.     CBitmap m_bmpBKGND;   
  52. public:   
  53.     // 画下个方块的框框   
  54.     void DrawNextBlock( CDC* pDC );   
  55.     //方块左移   
  56.     void BlockLeft(CDC* pDC);   
  57.     //方块右移   
  58.     void BlockRight(CDC* pDC);   
  59.     //方块下移   
  60.     void BlockFastDown(CDC* pDC);   
  61.     //方块变形   
  62.     void ChangeState(CDC* pDC);   
  63.     // 消除一行   
  64.     //pDC是传入的DC   
  65.     //LineNum是消除的行从第几行开始(我这里是最上面为0,最下面为19)   
  66.     //start是 游戏是否是要把消除行以上的都置0,我是用在OnDraw()里,用来重画屏幕的,   
  67.     void DeleteLine(CDC* pDC, int LineNum, bool start);   
  68.     // 游戏是否结束,true=结束了   
  69.     bool BlockGameOver(void);   
  70.     // 计分板   
  71.     //del是决定是否是已消一行的   
  72.     void BlockScore(int del, CDC* pDC);   
  73.     //返回是否升级了,true=升级了   
  74.     bool BlockLevelUp(void);   
  75.     //返回下落速度   
  76.     int BlockSpeed(void);   
  77. };   

这里我采用了二维数组int m_Blockmap[20][10];记录游戏区。

在初始化后,就要生成新方块,采用随机数的方法。方块是通过坐标位置记录的,POINT m_BlockPos[4];

游戏是写在定时器里的,通过等级不同使下落时间也不同,游戏的主要过程是方块的下落过程。在这里首先判断是否已经结束,结束了则结束计时器,否则判断是否能下落,不能下落则判断是否能消除一行。这些都完成后则生成新方块,重新下落。

在KEY_DOWN事件中加入左移,右移,下移,变形的函数,就可以实现游戏了。

其他的功能就是自己随便添加的暂停,开始这样的了。那些就不写了。

游戏可执行程序下载地址:http://download.csdn.net/source/1595231

游戏源代码下载地址:http://download.csdn.net/source/1595110

点击这里加我为好友:http://student.csdn.net/invite.php?u=110891&c=3fdff026fca470b3

你可能感兴趣的:(记MFC俄罗斯方块制作过程)