C++MFC课程设计-俄罗斯方块

更新时间:2023-03-20 08:45:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一个简单的MFC俄罗斯方块实现。

面向对象程序设计

课题名称: 俄罗斯方块 学 号: 10408200119 姓 名: 刘 旭 班 级: 通信101 指导老师: 沈浩老师

一个简单的MFC俄罗斯方块实现。

目录

一、需求分析 ................................................................................................................................... 3

1.1开发背景............................................................................................................................. 3 1.3 系统目标............................................................................................................................ 3 1.3 运行环境............................................................................................................................ 3 二、概要设计 ................................................................................................................................... 3

2.1 程序流程图 ........................................................................................................................ 3 2.2 定义的类............................................................................................................................ 4 三、详细设计 ................................................................................................................................... 5 四、调试分析 ................................................................................................................................... 8 五、用户使用说明 ........................................................................................................................... 9 六、测试结果 ................................................................................................................................... 9 七、附录或参考资料 ..................................................................................................................... 10

一个简单的MFC俄罗斯方块实现。

一、 需求分析

1.1 开发背景

与C语言不同,经过了一学期的C++课程,基本熟悉了面向对象的设计思路,通过运用基本的MFC来完成一系列的功能,课题选择了俄罗斯方块,一是以前的数据结构课程设计原本打算写的程序后面由于设计不当没有完成,这次使用MFC完成也算是弥补了小小的遗憾,二是MFC是微软为开发者集成的一个开发库,拥有非常强大的功能,这一切又和面向对象的思想相契合,因此选择MFC是一个不错的选择。其次,通过团队的合作,也使得的这次的设计较为顺利。

1.3 系统目标

本系统的目标是通过接受键盘的输入信息来完成俄罗斯方块的基本功能。 1. 能够是游戏正确的开始和结束; 2. 能够使用合法的所有方块;

3. 能够使得方块在下降的过程中变化自己的形状; 4. 能够统计得分,并且逐步加大难度.

1.3 运行环境

一台安装windows xp、wndows vista、windows 7并且能够运行.exe可执

行文件的计算机。

二、 概要设计

2.1 程序流程图

一个简单的MFC俄罗斯方块实现。

2.2 定义的类

下面是VC++6.0的类浏览

前面6个类都是MFC类,程序的主要调用通过CMyTaskView中定时器的OnTimer函数来实现。

Dset用来弹出对话框来设置等级。

Graph类是一个普通的C++类,没有继承任何的MFC类,该类所有成员均为静态变量,所有函数也是静态的。数据包括砖块的形状和颜色,以及同种类型砖块的变换区间。类中

一个简单的MFC俄罗斯方块实现。

也包括画砖块函数。

Tile类用来保留当前砖块和下一个砖块。

Wall类描绘了整个墙壁被砖块砌成的状态,当中包括了检查是否可进行消除和判断停止以及加大游戏难度。

三、详细设计

主要类的声明如下: class Graph {

public: Graph(); static int GetTile(); static int GetCol(); static int GetTileNum(int No); static void DrawTile(CDC *pDC, int &Tile, COLORREF &Col, Point &pt); static void ShowNext(CDC *pDc, int &Tile, COLORREF &Col); static void ShowShadow(CDC *pDC, int &Tile, Point &pt); static void ClearShadow(CDC *pDC, int &Tile, Point &pt); virtual ~Graph(); public: static char G[21][4][5]; // 用来存储瓷片的形状 static int interval[7][2]; // 用来存储同一种瓷片不同形态在G中的连续区间边界 static COLORREF Col[9]; };

class Tile {

public: Tile(); void Modify(); void Init(); virtual ~Tile(); public: int curTile; // 用来保留当前瓷片 int curCol; // 用来保留当前瓷片颜色 int nextTile; // 用来保留下一个瓷片 int nextCol; // 用来保留下一个瓷片颜色 };

一个简单的MFC俄罗斯方块实现。

class Wall {

public: Wall(); static bool Stop(Wall &wall, int &Tile, int &fx, int &fy); static void Modify(Wall &wall, int &Tile, COLORREF &Col, int &fx, int &fy); static void Completed(CDC *pDC, Wall &wall); static bool Skip(Wall &wall, int Speed); void Init(); virtual ~Wall(); public: int Score; int Width; int Height; };

COLORREF Statu_Col[10][19]; // 如果被覆盖用来保留颜色,默认为0

主导作用的OnTimer函数:

void CMyTaskView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CClientDC cDC(this); int lastfy = fy; ++fy; if (Wall::Stop(wall, tile.curTile, fx, fy)) {

}

if (fx == 4 && fy == 0) { // 已经达到结束条件 KillTimer(Timer); MessageBox("真遗憾,游戏结束!"); play = 0; CClientDC cDC(this); OnDraw(&cDC); }

Wall::Modify(wall, tile.curTile, Graph::Col[tile.curCol], fx, lastfy); Wall::Completed(&cDC, wall); // 判定是否存在行能够消除 tile.Modify(); fx = 4; fy = -1;

// 更新wall,此时瓷片的位置已经固定,更新tile,以及位置坐标 return; // 如果碰到边界或者是遇到了障碍

一个简单的MFC俄罗斯方块实现。

}

// 打印分数 char str[10];

sprintf(str, "Score: %d", wall.Score);

cDC.TextOut(LU.x+30*11, LU.y+30*(6), CString(str)); // 判定是否过关

if (Wall::Skip(wall, Speed)) { KillTimer(Timer); Speed = 400 / ((400 / Speed) + 1); }

play = 0; // 逻辑上结束了游戏 MessageBox("恭喜,过关了"); CClientDC cDC(this); OnDraw(&cDC); OnStart();

// 如果还有下降的空间

if (fy == 0) {// 如果是刚刚新产生的图形 int lastfy = fy; Point pt; }

while (!Wall::Stop(wall, tile.curTile, fx, ++lastfy)) {} // 一直到发生停止命令以后 --lastfy;

pt = Point(LU.x+30*fx, LU.y+30*lastfy);

Graph::ShowShadow(&cDC, tile.curTile, pt);

Point pt; //清洗掉上次的图形

pt = Point(LU.x+30*fx, LU.y+30*lastfy);

Graph::DrawTile(&cDC, tile.curTile, Graph::Col[7], pt);

pt = Point(LU.x+30*fx, LU.y+30*fy); // 绘制新的图形,不发生图形的改变 Graph::DrawTile(&cDC, tile.curTile, Graph::Col[tile.curCol], pt);

Graph::ShowNext(&cDC, tile.nextTile, Graph::Col[tile.nextCol]); // 显示下一个瓷片

ReleaseDC(&cDC);

CView::OnTimer(nIDEvent);

一个简单的MFC俄罗斯方块实现。

四、调试分析

菜单栏

当前砖块

显示阴影

提示用户

分数

一个简单的MFC俄罗斯方块实现。

五、用户使用说明

用户进入程序后,点击开始开始游戏,可以在游戏前设置难度,游戏中也可以通过暂停,继续键来暂停游戏。

游戏中:

上-----------------变形 下-----------------加速下降 左\右------------位置变化 空格-------------立即下降

六、测试结果

开始界面: 难度设置:

一个简单的MFC俄罗斯方块实现。

游戏正式开始: 游戏结束:

七、附录或参考资料

1.谭浩强.C++面向对象程序设计[M].北京:清华大学出版社,2006.

2. Visual C++从入门到精通[M].北京:人民邮电出版社,2010

本文来源:https://www.bwwdw.com/article/unm1.html

Top