基于Windows API与C++的俄罗斯方块出炉

来源:互联网 发布:mac ruby 路径 编辑:程序博客网 时间:2024/05/17 22:36

作为一名业余C++学习者, 这个小程序出炉,还是有点小激动的!

先上图:


  • 游戏页面:

俄罗斯方块有游戏区、预览区、还有按钮控件,想想用非模态对话框构建页面最适合,由主窗口高度确定方块尺寸,以及游戏区域、预览区域的行数与列数确定游戏页面中其他的尺寸。


(已知)

#define WIN_HEIGHT500// 主窗口客户区域高 (宽自动生成)#define PSHOW_X4// 预览区域列数#define PSHOW_Y4// 预览区域行数#define SHOW_X10// 游戏区域列数#define SHOW_Y15// 游戏区域行数
(得到)

size = WIN_HEIGHT / SHOW_Y;win_width = SHOW_X * size + PSHOW_X * size * 9 / 8 + size;win_height = WIN_HEIGHT +// 客户区域高GetSystemMetrics (SM_CYMENUSIZE) +// 菜单栏高GetSystemMetrics (SM_CYSIZE) + 3;// 标题栏高 + 微调值

psize = size * 9 / 8,hdlg_width = rect.right - rect.left,hdlg_height = rect.bottom - rect.top,show_width = SHOW_X * size, show_height = SHOW_Y * size, pshow_width = PSHOW_X * psize,pshow_height = PSHOW_Y * psize,other_width = hdlg_width - show_width,other_height = hdlg_height - pshow_height - size / 8,text_width = 2 * psize,text_height = other_height * 3 / 40,button_width = 3 * psize, button_height = other_height * 4 / 40;


  • 游戏控制

Blocks类

1.怎么显示、擦除方块?

每个俄罗斯方块由4个矩形组成,Blocks类中保存有每个矩形的坐标与类型,

显示方块 —— 在坐标出使用方块颜色绘制矩形;

擦除方块 —— 在坐标出使用背景颜色绘制方块。

2.怎么移动方块?

只需要把方块的坐标++,--即可。

#define BKCOLOR RGB ((220,220,220), (220,220,220), (255,255,255))// 背景颜色(浅蓝色)#define BLOCKSCOLOR RGB ((200,200,200), (200,200,200), (0,0,0))// 方块颜色(黄绿色)

int size;// 方块中矩形大小int position[4][2];// 方块中每个矩形坐标inttype;// 方块类型
(方法)

void InitBlocks ();// 初始化方块设置void SetPosition (int []);// 设置方块中每个矩形坐标int GetRow (int);// 得到方块中一个矩形的行坐标int GetColumn (int);// 得到方块中一个矩形的列坐标void SetType (int);// 设置方块类型int GetType ();// 得到方块类型void SetSize (int);// 设置方块大小int GetSize ();// 得到方块大小void BlocksPaint (HDC, RECT, BOOL);// TRUE:红色方块。FALSE:背景色方块void MoveDownBlocks (HDC, RECT);// 向下移动方块void MoveLeftBlocks (HDC, RECT);// 向左移动方块void MoveRightBlocks (HDC, RECT);// 向右移动方块

Game类;

1.包含什么数据类型?

game类包含位图,其大小与游戏区域等同,方块的移动、类型变换均在修改位图即可, 可以实时保存游戏的状态;

还应有游戏区域的最大行、列坐标,以确保方块不会移出位图;

每次方块下落到底部后,应该记录这个值isnext,产生下一个方块。

2.怎么判断何时方块不能继续下落?

每个方块中有4个矩形,因Game公有继承Blocks,所以可以实时取得当前方块的坐标, 只要当前方块中某些矩形的下面存在方块,或者超出了最大坐标,

就不能继续下落当前方块了

3.怎么变换方块类型?

Blocks中包含有当前方块的坐标与类型, 每次类型转换可以通过转换坐标实现。

HBITMAP hBitmap;// 游戏区域缓存HDC hdcmem;// 游戏区域缓存相关内存设备内容int maxcolumn, maxrow;// 区域最大列、最大行BOOL isnext;// TRUE:从初始位置绘制方块;FALSE:从当前位置绘制方块
(方法)
void InitGameBackground (HDC, int, int, int); // 初始化游戏区域缓存(设置游戏背景)void SetPositionType (int [], int);  // 设置方块位置及类型void InitGame ();  // 初始化游戏设置void BitmapPaint (HDC);  // 显示游戏区域缓存void ShowBlocksInBitmap ();  // 在缓存中绘制方块void CleanBlocksInBitmap ();  // 清空在缓存中绘制的方块BOOL IsNext ();  // 返回 isnextBOOL MoveDownBlocks ();  // 在缓存中向下移动方块BOOL MoveLeftBlocks ();  // 在缓存中向左移动方块BOOL MoveRightBlocks ();  // 在缓存中向右移动方块int CheckBitmap ();  // 若存在得分列,返回所在列,否则返回-1void RemoveLine (int);  // 移除得分行BOOL IsOver ();  // 方块不在位图中,返回TRUEBOOL IsEmpty ();  // TRUE:位图中没有方块BOOL ChangeType (int [], int);  // 在当前位置变换方块类型

  • 消息循环:

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;// 主窗口BOOL CALLBACK BoxDlgProc (HWND, UINT, WPARAM, LPARAM) ;// 游戏视图对话框默认处理程序LRESULT CALLBACK NewDlgProc (HWND, UINT, WPARAM, LPARAM);// 游戏视图对话框子类化后处理程序BOOL CALLBACK DegreeProc (HWND, UINT, WPARAM, LPARAM);// 等级设置对话框处理程序BOOL CALLBACK InstructionProc (HWND, UINT, WPARAM, LPARAM);// 操作说明对话框处理程序

感谢这些文章:

// Win32Dialog对话框处理WM_KEYDOWN事件// http://www.it165.net/pro/html/201412/29138.html// 窗口子类别化// http://blog.csdn.net/lwbeyond/article/details/5393495// 响应键盘消息// http://www.cnblogs.com/BeyondTechnology/archive/2011/02/27/1966083.html// (IsDialogMessage()函数发送给对话框处理程序的WM_KEYDOWN消息对 VK_UP...等不响应;// )// 按钮和输入焦点// http://blog.163.com/chen_xinghuan/blog/static/17220158220112193531469/?latestBlog// BeginPaint和GetDC有什么区别?(转)// http://blog.csdn.net/n27583939/article/details/5035505// 内存画图// http://blog.csdn.net/xiaoyaofriend/article/details/7593851// wsprintf()函数与输出格式化// http://blog.sina.com.cn/s/blog_472a9f0c01016rr0.html


代码有1.2K行,VS2012编译运行正常,下载链接如下:

http://download.csdn.net/detail/yss28/8629335


0 0
原创粉丝点击